diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index 4956425db38..c02f87dcbe2 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -50,7 +50,7 @@ jobs: run: | set -x sudo apt-get update && sudo apt-get install -y graphviz ssh bibtex2html - sudo pip install lxml + sudo pip install lxml sudo pip install 'pyquery==1.4.1' # it seems to be the last py2 compatible version wget --no-verbose -O doxygen_exe https://cgal.geometryfactory.com/~mgimeno/doxygen/build_1_8_13/bin/doxygen sudo mv doxygen_exe /usr/bin/doxygen @@ -92,7 +92,7 @@ jobs: egrep -v " ${PR_NUMBER}\." index.html > tmp.html || true echo "
  • Manual for PR ${PR_NUMBER} ($ROUND).
  • " >> ./tmp.html mv tmp.html index.html - git add ${PR_NUMBER}/$ROUND && git commit -q --amend -m "base commit" && git push -q -f -u origin master + git add ${PR_NUMBER}/$ROUND index.html && git commit -q --amend -m "base commit" && git push -q -f -u origin master else exit 1 fi diff --git a/.github/workflows/delete_doc.yml b/.github/workflows/delete_doc.yml index 1304a7895c9..d648a601e91 100644 --- a/.github/workflows/delete_doc.yml +++ b/.github/workflows/delete_doc.yml @@ -26,7 +26,7 @@ jobs: git rm -r ${PR_NUMBER} fi #git diff exits with 1 if there is a diff - if !git diff --quiet; then + if ! git diff --quiet; then git commit -a --amend -m"base commit" && git push -f -u origin master fi diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ad59dd4d765..00000000000 --- a/.travis.yml +++ /dev/null @@ -1,79 +0,0 @@ -language: cpp -dist: bionic -sudo: required -git: - depth: 3 -env: - matrix: - - PACKAGE='CHECK' - - PACKAGE='AABB_tree Advancing_front_surface_reconstruction Algebraic_foundations ' - - PACKAGE='Algebraic_kernel_d Algebraic_kernel_for_circles Algebraic_kernel_for_spheres ' - - PACKAGE='Alpha_shapes_2 Alpha_shapes_3 Apollonius_graph_2 ' - - PACKAGE='Arithmetic_kernel Arrangement_on_surface_2 BGL ' - - PACKAGE='Barycentric_coordinates_2 Boolean_set_operations_2 Bounding_volumes ' - - PACKAGE='Box_intersection_d CGAL_Core CGAL_ImageIO ' - - PACKAGE='CGAL_ipelets Cartesian_kernel Circular_kernel_2 ' - - PACKAGE='Circular_kernel_3 Circulator Classification ' - - PACKAGE='Combinatorial_map Cone_spanners_2 Convex_decomposition_3 ' - - PACKAGE='Convex_hull_2 Convex_hull_3 Convex_hull_d ' - - PACKAGE='Distance_2 Distance_3 Envelope_2 ' - - PACKAGE='Envelope_3 Filtered_kernel Generalized_map ' - - PACKAGE='Generator Geomview GraphicsView ' - - PACKAGE='HalfedgeDS Hash_map Heat_method_3 ' - - PACKAGE='Homogeneous_kernel Hyperbolic_triangulation_2 Inscribed_areas ' - - PACKAGE='Installation Interpolation Intersections_2 ' - - PACKAGE='Intersections_3 Interval_skip_list Interval_support ' - - PACKAGE='Jet_fitting_3 Kernel_23 Kernel_d ' - - PACKAGE='LEDA Linear_cell_complex MacOSX ' - - PACKAGE='Maintenance Matrix_search Mesh_2 ' - - PACKAGE='Mesh_3 Mesher_level Minkowski_sum_2 ' - - PACKAGE='Minkowski_sum_3 Modifier Modular_arithmetic ' - - PACKAGE='Nef_2 Nef_3 Nef_S2 ' - - PACKAGE='NewKernel_d Number_types OpenNL ' - - PACKAGE='Optimal_bounding_box Optimal_transportation_reconstruction_2 Optimisation_basic ' - - PACKAGE='Partition_2 Periodic_2_triangulation_2 Periodic_3_mesh_3 ' - - PACKAGE='Periodic_3_triangulation_3 Periodic_4_hyperbolic_triangulation_2 Point_set_2 ' - - PACKAGE='Point_set_3 Point_set_processing_3 Poisson_surface_reconstruction_3 ' - - PACKAGE='Polygon Polygon_mesh_processing Polygonal_surface_reconstruction ' - - PACKAGE='Polyhedron Polyline_simplification_2 Polynomial ' - - PACKAGE='Polytope_distance_d Principal_component_analysis Principal_component_analysis_LGPL ' - - PACKAGE='Profiling_tools Property_map QP_solver ' - - PACKAGE='Random_numbers Ridges_3 STL_Extension ' - - PACKAGE='Scale_space_reconstruction_3 Scripts SearchStructures ' - - PACKAGE='Segment_Delaunay_graph_2 Segment_Delaunay_graph_Linf_2 Set_movable_separability_2 ' - - PACKAGE='Shape_detection Skin_surface_3 Snap_rounding_2 ' - - PACKAGE='Solver_interface Spatial_searching Spatial_sorting ' - - PACKAGE='Straight_skeleton_2 Stream_lines_2 Stream_support ' - - PACKAGE='Subdivision_method_3 Surface_mesh Surface_mesh_approximation ' - - PACKAGE='Surface_mesh_deformation Surface_mesh_parameterization Surface_mesh_segmentation ' - - PACKAGE='Surface_mesh_shortest_path Surface_mesh_simplification Surface_mesh_skeletonization ' - - PACKAGE='Surface_mesh_topology Surface_mesher Surface_sweep_2 ' - - PACKAGE='TDS_2 TDS_3 Testsuite ' - - PACKAGE='Tetrahedral_remeshing Three Triangulation ' - - PACKAGE='Triangulation_2 Triangulation_3 Union_find ' - - PACKAGE='Visibility_2 Voronoi_diagram_2 wininst ' -compiler: clang -install: - - echo "$PWD" - - if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ] && [ "$PACKAGE" != CHECK ]; then DO_IGNORE=FALSE; for ARG in $(echo "$PACKAGE");do if [ "$ARG" = "Maintenance" ]; then continue; fi; . $PWD/.travis/test_package.sh "$PWD" "$ARG"; echo "DO_IGNORE is $DO_IGNORE"; if [ "$DO_IGNORE" = "FALSE" ]; then break; fi; done; if [ "$DO_IGNORE" = "TRUE" ]; then travis_terminate 0; fi;fi - - /usr/bin/time -f 'Spend time of %C -- %E (real)' bash .travis/install.sh - - export CXX=clang++-10 CC=clang-10; -before_script: - - wget -O doxygen_exe https://cgal.geometryfactory.com/~mgimeno/doxygen_exe - - sudo mv doxygen_exe /usr/bin/doxygen - - sudo chmod +x /usr/bin/doxygen - - mkdir -p build - - cd build - - /usr/bin/time -f 'Spend time of %C -- %E (real)' cmake -DCMAKE_CXX_FLAGS="-std=c++1y" -DCGAL_HEADER_ONLY=ON -DCMAKE_CXX_FLAGS_RELEASE=-DCGAL_NDEBUG -DWITH_examples=ON -DWITH_demos=ON -DWITH_tests=ON .. - - /usr/bin/time -f 'Spend time of %C -- %E (real)' make - - /usr/bin/time -f 'Spend time of %C -- %E (real)' sudo make install &>/dev/null - - cd .. -script: - - cd ./.travis - - /usr/bin/time -f 'Spend time of %C -- %E (real)' bash ./build_package.sh $PACKAGE -notifications: - email: - on_success: change - # default: always - on_failure: always - # default: always diff --git a/.travis/build_package.sh b/.travis/build_package.sh deleted file mode 100755 index dc41aa16dd1..00000000000 --- a/.travis/build_package.sh +++ /dev/null @@ -1,144 +0,0 @@ -#!/bin/bash -set -e -[ -n "$CGAL_DEBUG_TRAVIS" ] && set -x - -CXX_FLAGS="-DCGAL_NDEBUG -ftemplate-backtrace-limit=0" - -function mytime { - /usr/bin/time -f "Spend time of %C: %E (real)" "$@" -} -old_IFS=$IFS -IFS=$' ' -ROOT="$PWD/.." -for ARG in $(echo "$@") -do -#skip package maintenance - if [ "$ARG" = "Maintenance" ]; then - continue - fi -cd $ROOT - -#install openmesh only if necessary - if [ "$ARG" = "CHECK" ] || [ "$ARG" = BGL ] || [ "$ARG" = Convex_hull_3 ] ||\ - [ "$ARG" = Polygon_mesh_processing ] || [ "$ARG" = Property_map ] ||\ - [ "$ARG" = Surface_mesh_deformation ] || [ "$ARG" = Surface_mesh_shortest_path ] ||\ - [ "$ARG" = Surface_mesh_simplification ]; then - mytime sudo bash .travis/install_openmesh.sh - fi - - - if [ "$ARG" = "CHECK" ] - then - cd .travis - mytime ./generate_travis.sh --check - cd .. - IFS=$old_IFS - mytime zsh $ROOT/Scripts/developer_scripts/test_merge_of_branch HEAD - #test dependencies - cd $ROOT - mytime bash Scripts/developer_scripts/cgal_check_dependencies.sh --check_headers /usr/bin/doxygen - - cd .travis - #parse current matrix and check that no package has been forgotten - - IFS=$'\n' - COPY=0 - MATRIX=() - for LINE in $(cat "$PWD/packages.txt") - do - MATRIX+="$LINE " - done - - PACKAGES=() - cd .. - for f in * - do - if [ -d "$f/package_info/$f" ] - then - PACKAGES+="$f " - fi - done - - DIFFERENCE=$(echo ${MATRIX[@]} ${PACKAGES[@]} | tr ' ' '\n' | sort | uniq -u) - IFS=$' ' - if [ "${DIFFERENCE[0]}" != "" ] - then - echo "The matrix and the actual package list differ : ." - echo ${DIFFERENCE[*]} - echo "You should run generate_travis.sh." - exit 1 - fi - echo "Matrix is up to date." - #check if non standard cgal installation works - cd $ROOT - mkdir build_test - cd build_test - mytime cmake -DCMAKE_INSTALL_PREFIX=install/ -DCGAL_BUILD_THREE_DOC=TRUE .. - mytime make install - # test install with minimal downstream example - mkdir installtest - cd installtest - touch main.cpp - mkdir build - echo 'project(Example)' >> CMakeLists.txt - echo 'set(PROJECT_SRCS ${PROJECT_SOURCE_DIR}/main.cpp)' >> CMakeLists.txt - echo 'find_package(CGAL REQUIRED)' >> CMakeLists.txt - echo 'add_executable(${PROJECT_NAME} ${PROJECT_SRCS})' >> CMakeLists.txt - echo 'target_link_libraries(${PROJECT_NAME} CGAL::CGAL)' >> CMakeLists.txt - echo '#include "CGAL/remove_outliers.h"' >> main.cpp - cd build - mytime cmake -DCMAKE_INSTALL_PREFIX=../../install -DCGAL_BUILD_THREE_DOC=TRUE .. - exit 0 - fi - - if [ "$ARG" = "Installation" ] - then - mkdir build_dir - cd build_dir - cmake -DWITH_tests=ON -DBUILD_TESTING=ON .. - ctest -j2 -L CGAL_cmake_testsuite --output-on-failure - cd .. - rm -rf ./build_dir - #==-- configure all CGAL with -DWITH_examples=ON -DWITH_demos=ON -DWITH_tests=ON, and then launch CTest on a few labels. --== - mkdir config_dir - cd config_dir - cmake -DWITH_examples=ON -DWITH_demos=ON -DWITH_tests=ON -DBUILD_TESTING=ON .. - ctest -j2 -L AABB_tree --output-on-failure - cd .. - rm -rf ./config_dir - exit 0 - fi - - IFS=$old_IFS - - if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ]; then - DO_IGNORE=FALSE - . $ROOT/.travis/test_package.sh "$ROOT" "$ARG" - echo "DO_IGNORE is $DO_IGNORE" - if [ "$DO_IGNORE" = "TRUE" ]; then - continue - fi - fi - IFS=$' ' - mkdir -p build-travis - cd build-travis - WITHDEMOS=ON - if [ "$ARG" = "Polyhedron" ]; then - WITHDEMOS=OFF - fi - EXTRA_CXX_FLAGS= - case "$CC" in - clang*) - EXTRA_CXX_FLAGS="-Werror=inconsistent-missing-override" - ;; - esac - - - mytime cmake -DCMAKE_CXX_FLAGS="${CXX_FLAGS} ${EXTRA_CXX_FLAGS}" -DCGAL_DONT_OVERRIDE_CMAKE_FLAGS:BOOL=ON -DBUILD_TESTING=ON -DWITH_tests=ON -DWITH_examples=ON -DWITH_demos=$WITHDEMOS .. - mytime ctest -j2 -L $ARG'([_][A-Z]|$)' -E execution___of__ --output-on-failure -done -IFS=$old_IFS -# Local Variables: -# tab-width: 2 -# sh-basic-offset: 2 -# End: diff --git a/.travis/generate_travis.sh b/.travis/generate_travis.sh deleted file mode 100755 index cef9ff07c49..00000000000 --- a/.travis/generate_travis.sh +++ /dev/null @@ -1,94 +0,0 @@ -#!/bin/bash - -CHECK= -case $1 in - --check) CHECK=y;; -esac - -set -e -cd ../ - -if [ -f "$PWD/.travis/packages.txt" ] -then - rm "$PWD/.travis/packages.txt" -fi - -#find all the packages -PACKAGES=() -INDEX=0 -i=0 -for f in * -do - if [ -d "$f/package_info/$f" ] - then - echo "$f" >> ./tmp.txt - fi -done - LC_ALL=C sort ./tmp.txt > ./.travis/packages.txt - rm ./tmp.txt - while read p; do - PACKAGES[$INDEX]+="$p " - i=$[i+1] - if [ $i = 3 ] - then - i=0 - INDEX=$[INDEX+1] - fi -done <./.travis/packages.txt -if [ -f ".travis.yml" ] -then - #copy the current .travis.yml for later check - mv ./.travis.yml ./.travis.old -fi -#writes the first part of the file -old_IFS=$IFS -IFS=$'\n' -for LINE in $(cat "$PWD/.travis/template.txt") -do - if [ "$LINE" != " matrix:" ] - then - echo "$LINE" >> .travis.yml - else - break - fi -done -echo " matrix:" >> .travis.yml -#writes the matrix -echo " - PACKAGE='CHECK'" >> .travis.yml -for package in ${PACKAGES[@]} -do -echo " - PACKAGE='$package'" >> .travis.yml -done - -#writes the end of the file -COPY=0 -for LINE in $(cat "$PWD/.travis/template.txt") -do - if [ "$LINE" = "compiler: clang" ] - then - COPY=1 - fi - if [ $COPY = 1 ] - then - echo "$LINE" >> .travis.yml - fi -done -IFS=$' ' -#check if there are differences between the files -if ! cmp -s ./.travis.yml ./.travis.old; -then - echo ".travis.yml has changed : " - diff ./.travis.yml ./.travis.old - if [ -n "$CHECK" ]; then - echo "You should modify the file .travis/template.txt" - exit 1 - fi -fi -#erase old travis -rm ./.travis.old -IFS=$old_IFS - -# Local Variables: -# tab-width: 2 -# sh-basic-offset: 2 -# End: diff --git a/.travis/install.sh b/.travis/install.sh deleted file mode 100644 index ec1791b750e..00000000000 --- a/.travis/install.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -[ -n "$CGAL_DEBUG_TRAVIS" ] && set -x -DONE=0 -sudo add-apt-repository ppa:mikhailnov/pulseeffects -y -sudo apt-get update - -while [ $DONE = 0 ] -do - DONE=1 && sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install clang-10 zsh \ -flex bison cmake graphviz libgmp-dev libmpfr-dev libmpfi-dev zlib1g-dev libeigen3-dev \ -qtbase5-dev libqt5sql5-sqlite libqt5opengl5-dev qtscript5-dev libqt5svg5-dev qttools5-dev qttools5-dev-tools qml-module-qtgraphicaleffects libopencv-dev mesa-common-dev libmetis-dev libglu1-mesa-dev \ -libboost1.72-dev || DONE=0 && sudo apt-get update -done -exit 0 - diff --git a/.travis/install_openmesh.sh b/.travis/install_openmesh.sh deleted file mode 100644 index 9b7a4f8e890..00000000000 --- a/.travis/install_openmesh.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -mkdir -p openmesh -cd openmesh -wget -O openmesh.tar.gz https://www.openmesh.org/media/Releases/6.3/OpenMesh-6.3.tar.gz -tar xf openmesh.tar.gz --strip-components=1 -sed -i '94i #include ' src/OpenMesh/Tools/Utils/conio.cc - -mkdir build -cd build -cmake -DBUILD_APPS=FALSE .. -make -j2 -sudo make -j2 install &>/dev/null - -#clean up -cd ../.. -rm -rf ./openmesh diff --git a/.travis/packages.txt b/.travis/packages.txt deleted file mode 100644 index b4874d76f4a..00000000000 --- a/.travis/packages.txt +++ /dev/null @@ -1,138 +0,0 @@ -AABB_tree -Advancing_front_surface_reconstruction -Algebraic_foundations -Algebraic_kernel_d -Algebraic_kernel_for_circles -Algebraic_kernel_for_spheres -Alpha_shapes_2 -Alpha_shapes_3 -Apollonius_graph_2 -Arithmetic_kernel -Arrangement_on_surface_2 -BGL -Barycentric_coordinates_2 -Boolean_set_operations_2 -Bounding_volumes -Box_intersection_d -CGAL_Core -CGAL_ImageIO -CGAL_ipelets -Cartesian_kernel -Circular_kernel_2 -Circular_kernel_3 -Circulator -Classification -Combinatorial_map -Cone_spanners_2 -Convex_decomposition_3 -Convex_hull_2 -Convex_hull_3 -Convex_hull_d -Distance_2 -Distance_3 -Envelope_2 -Envelope_3 -Filtered_kernel -Generalized_map -Generator -Geomview -GraphicsView -HalfedgeDS -Hash_map -Heat_method_3 -Homogeneous_kernel -Hyperbolic_triangulation_2 -Inscribed_areas -Installation -Interpolation -Intersections_2 -Intersections_3 -Interval_skip_list -Interval_support -Jet_fitting_3 -Kernel_23 -Kernel_d -LEDA -Linear_cell_complex -MacOSX -Maintenance -Matrix_search -Mesh_2 -Mesh_3 -Mesher_level -Minkowski_sum_2 -Minkowski_sum_3 -Modifier -Modular_arithmetic -Nef_2 -Nef_3 -Nef_S2 -NewKernel_d -Number_types -OpenNL -Optimal_bounding_box -Optimal_transportation_reconstruction_2 -Optimisation_basic -Partition_2 -Periodic_2_triangulation_2 -Periodic_3_mesh_3 -Periodic_3_triangulation_3 -Periodic_4_hyperbolic_triangulation_2 -Point_set_2 -Point_set_3 -Point_set_processing_3 -Poisson_surface_reconstruction_3 -Polygon -Polygon_mesh_processing -Polygonal_surface_reconstruction -Polyhedron -Polyline_simplification_2 -Polynomial -Polytope_distance_d -Principal_component_analysis -Principal_component_analysis_LGPL -Profiling_tools -Property_map -QP_solver -Random_numbers -Ridges_3 -STL_Extension -Scale_space_reconstruction_3 -Scripts -SearchStructures -Segment_Delaunay_graph_2 -Segment_Delaunay_graph_Linf_2 -Set_movable_separability_2 -Shape_detection -Skin_surface_3 -Snap_rounding_2 -Solver_interface -Spatial_searching -Spatial_sorting -Straight_skeleton_2 -Stream_lines_2 -Stream_support -Subdivision_method_3 -Surface_mesh -Surface_mesh_approximation -Surface_mesh_deformation -Surface_mesh_parameterization -Surface_mesh_segmentation -Surface_mesh_shortest_path -Surface_mesh_simplification -Surface_mesh_skeletonization -Surface_mesh_topology -Surface_mesher -Surface_sweep_2 -TDS_2 -TDS_3 -Testsuite -Tetrahedral_remeshing -Three -Triangulation -Triangulation_2 -Triangulation_3 -Union_find -Visibility_2 -Voronoi_diagram_2 -wininst diff --git a/.travis/template.txt b/.travis/template.txt deleted file mode 100644 index 3b99af1ff13..00000000000 --- a/.travis/template.txt +++ /dev/null @@ -1,34 +0,0 @@ -language: cpp -dist: bionic -sudo: required -git: - depth: 3 -env: - matrix: - PACKAGES_MATRIX - -compiler: clang -install: - - echo "$PWD" - - if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ] && [ "$PACKAGE" != CHECK ]; then DO_IGNORE=FALSE; for ARG in $(echo "$PACKAGE");do if [ "$ARG" = "Maintenance" ]; then continue; fi; . $PWD/.travis/test_package.sh "$PWD" "$ARG"; echo "DO_IGNORE is $DO_IGNORE"; if [ "$DO_IGNORE" = "FALSE" ]; then break; fi; done; if [ "$DO_IGNORE" = "TRUE" ]; then travis_terminate 0; fi;fi - - /usr/bin/time -f 'Spend time of %C -- %E (real)' bash .travis/install.sh - - export CXX=clang++-10 CC=clang-10; -before_script: - - wget -O doxygen_exe https://cgal.geometryfactory.com/~mgimeno/doxygen_exe - - sudo mv doxygen_exe /usr/bin/doxygen - - sudo chmod +x /usr/bin/doxygen - - mkdir -p build - - cd build - - /usr/bin/time -f 'Spend time of %C -- %E (real)' cmake -DCMAKE_CXX_FLAGS="-std=c++1y" -DCGAL_HEADER_ONLY=ON -DCMAKE_CXX_FLAGS_RELEASE=-DCGAL_NDEBUG -DWITH_examples=ON -DWITH_demos=ON -DWITH_tests=ON .. - - /usr/bin/time -f 'Spend time of %C -- %E (real)' make - - /usr/bin/time -f 'Spend time of %C -- %E (real)' sudo make install &>/dev/null - - cd .. -script: - - cd ./.travis - - /usr/bin/time -f 'Spend time of %C -- %E (real)' bash ./build_package.sh $PACKAGE -notifications: - email: - on_success: change - # default: always - on_failure: always - # default: always diff --git a/.travis/test_package.sh b/.travis/test_package.sh deleted file mode 100644 index 7b01d24ceb4..00000000000 --- a/.travis/test_package.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -#Will cd $1 and test package named $2 -#to find out if it or one of its dependencies has changed in the current branch - -DO_IGNORE=FALSE -cd $1 - -if [ ! -d "$2" ]; then - echo "$2 : MISSING PACKAGE. Ignoring." - DO_IGNORE=TRUE - exit 1 -fi - - -if [ ! -f "$2/package_info/$2/dependencies" ];then - echo "No dependencies found for $2" - bash Scripts/developer_scripts/cgal_check_dependencies.sh --check_headers /usr/bin/doxygen - exit 1 -fi -LIST_OF_FILES=$(git diff --name-only origin/master... |cut -d/ -f1 |uniq |sort) -LIST_OF_DEPS=$(cat "$2/package_info/$2/dependencies") -echo "$LIST_OF_DEPS" -for flie in $LIST_OF_DEPS -do - [[ $LIST_OF_FILES =~ (^|[[:space:]])$flie($|[[:space:]]) ]] && return -done -echo "Package ignored because none of its dependencies has been modified." -DO_IGNORE=TRUE - diff --git a/.travis/windows.h b/.travis/windows.h deleted file mode 100644 index a774a068df3..00000000000 --- a/.travis/windows.h +++ /dev/null @@ -1,12 +0,0 @@ -#define MAX(a,b) (((a) > (b)) ? (a) : (b)) -#define max(a,b) (((a) > (b)) ? (a) : (b)) - -#define MIN(a,b) (((a) < (b)) ? (a) : (b)) -#define min(a,b) (((a) < (b)) ? (a) : (b)) - - -#define FAR #error named reserved in windows.h -#define far #error named reserved in windows.h - -#define Polyline #error named reserved in windows.h -#define Polygon #error named reserved in windows.h diff --git a/AABB_tree/demo/AABB_tree/AABB_demo.cpp b/AABB_tree/demo/AABB_tree/AABB_demo.cpp index c69f7aa1281..018e0f69c14 100644 --- a/AABB_tree/demo/AABB_tree/AABB_demo.cpp +++ b/AABB_tree/demo/AABB_tree/AABB_demo.cpp @@ -19,18 +19,16 @@ #include #include #include - +#include int main(int argc, char **argv) { + + CGAL::Qt::init_ogl_context(4,3); QApplication app(argc, argv); app.setOrganizationDomain("inria.fr"); app.setOrganizationName("INRIA"); app.setApplicationName("AABB tree demo"); - //for windows -#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) - app.setAttribute(Qt::AA_UseDesktopOpenGL); -#endif // Import resources from libCGALQt (Qt5). CGAL_QT_INIT_RESOURCES; diff --git a/AABB_tree/demo/AABB_tree/CMakeLists.txt b/AABB_tree/demo/AABB_tree/CMakeLists.txt index 7c006dec292..4ee33e3e45f 100644 --- a/AABB_tree/demo/AABB_tree/CMakeLists.txt +++ b/AABB_tree/demo/AABB_tree/CMakeLists.txt @@ -23,7 +23,7 @@ include_directories(BEFORE ./ ./include) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) # Find Qt5 itself -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Gui Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Gui Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) @@ -54,7 +54,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) #${CGAL_Qt5_MOC_FILES} ) # Link with Qt libraries - target_link_libraries(AABB_demo PRIVATE Qt5::OpenGL Qt5::Gui Qt5::Xml + target_link_libraries(AABB_demo PRIVATE Qt5::OpenGL Qt5::Gui CGAL::CGAL CGAL::CGAL_Qt5) 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 c5d00c638bb..bde07b1b29f 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.cpp +++ b/AABB_tree/demo/AABB_tree/MainWindow.cpp @@ -22,8 +22,6 @@ MainWindow::MainWindow(QWidget* parent) // saves some pointers from ui, for latter use. m_pViewer = ui->viewer; - // does not save the state of the viewer - m_pViewer->setStateFileName(QString()); // accepts drop events setAcceptDrops(true); @@ -45,6 +43,7 @@ MainWindow::MainWindow(QWidget* parent) MainWindow::~MainWindow() { + m_pViewer->makeCurrent(); delete ui; } diff --git a/AABB_tree/demo/AABB_tree/Scene.cpp b/AABB_tree/demo/AABB_tree/Scene.cpp index 69ba683a21b..b86be7ca292 100644 --- a/AABB_tree/demo/AABB_tree/Scene.cpp +++ b/AABB_tree/demo/AABB_tree/Scene.cpp @@ -91,8 +91,8 @@ void Scene::compile_shaders() //Vertex source code const char vertex_source[] = { - "#version 120 \n" - "attribute highp vec4 vertex;\n" + "#version 150 \n" + "in highp vec4 vertex;\n" "uniform highp mat4 mvp_matrix;\n" "uniform highp mat4 f_matrix;\n" "void main(void)\n" @@ -103,10 +103,11 @@ void Scene::compile_shaders() //Vertex source code const char fragment_source[] = { - "#version 120 \n" + "#version 150 \n" "uniform highp vec4 color; \n" + "out highp vec4 out_color; \n" "void main(void) { \n" - "gl_FragColor = color; \n" + "out_color = color; \n" "} \n" "\n" }; @@ -139,26 +140,27 @@ void Scene::compile_shaders() //Vertex source code const char tex_vertex_source[] = { - "#version 120 \n" - "attribute highp vec4 vertex;\n" - "attribute highp vec2 tex_coord; \n" + "#version 150 \n" + "in highp vec4 vertex;\n" + "in highp vec2 tex_coord; \n" "uniform highp mat4 mvp_matrix;\n" "uniform highp mat4 f_matrix;\n" - "varying highp vec2 texc;\n" + "out highp vec2 texc;\n" "void main(void)\n" "{\n" " gl_Position = mvp_matrix * f_matrix * vertex;\n" - " texc = tex_coord;\n" + " texc = tex_coord;\n" "}" }; //Vertex source code const char tex_fragment_source[] = { - "#version 120 \n" - "uniform sampler2D texture;\n" - "varying highp vec2 texc;\n" + "#version 150 \n" + "uniform sampler2D s_texture;\n" + "in highp vec2 texc;\n" + "out highp vec4 out_color; \n" "void main(void) { \n" - "gl_FragColor = texture2D(texture, texc.st);\n" + "out_color = vec4(texture(s_texture, texc));\n" "} \n" "\n" }; @@ -1319,12 +1321,8 @@ void Scene::deactivate_cutting_plane() } void Scene::initGL() { - gl = new QOpenGLFunctions_2_1(); - if(!gl->initializeOpenGLFunctions()) - { - qFatal("ERROR : OpenGL Functions not initialized. Check your OpenGL Verison (should be >=3.3)"); - exit(1); - } + gl = new QOpenGLFunctions(); + gl->initializeOpenGLFunctions(); gl->glGenTextures(1, &textureId); compile_shaders(); diff --git a/AABB_tree/demo/AABB_tree/Scene.h b/AABB_tree/demo/AABB_tree/Scene.h index 95ea74cdc33..44d7b8239ce 100644 --- a/AABB_tree/demo/AABB_tree/Scene.h +++ b/AABB_tree/demo/AABB_tree/Scene.h @@ -86,7 +86,7 @@ public: private: // member data - QOpenGLFunctions_2_1 *gl; + QOpenGLFunctions *gl; Bbox m_bbox; Polyhedron *m_pPolyhedron; std::list m_points; diff --git a/AABB_tree/include/CGAL/AABB_traits.h b/AABB_tree/include/CGAL/AABB_traits.h index 470420162a7..e443e08a522 100644 --- a/AABB_tree/include/CGAL/AABB_traits.h +++ b/AABB_tree/include/CGAL/AABB_traits.h @@ -26,7 +26,6 @@ #include #include -#include /// \file AABB_traits.h @@ -274,13 +273,13 @@ public: switch(Traits::longest_axis(bbox)) { case AT::CGAL_AXIS_X: // sort along x - std::nth_element(first, middle, beyond, boost::bind(Traits::less_x,_1,_2,m_traits)); + std::nth_element(first, middle, beyond, [this](const Primitive& p1, const Primitive& p2){ return Traits::less_x(p1, p2, this->m_traits); }); break; case AT::CGAL_AXIS_Y: // sort along y - std::nth_element(first, middle, beyond, boost::bind(Traits::less_y,_1,_2,m_traits)); + std::nth_element(first, middle, beyond, [this](const Primitive& p1, const Primitive& p2){ return Traits::less_y(p1, p2, this->m_traits); }); break; case AT::CGAL_AXIS_Z: // sort along z - std::nth_element(first, middle, beyond, boost::bind(Traits::less_z,_1,_2,m_traits)); + std::nth_element(first, middle, beyond, [this](const Primitive& p1, const Primitive& p2){ return Traits::less_z(p1, p2, this->m_traits); }); break; default: CGAL_error(); @@ -429,6 +428,11 @@ public: Closest_point closest_point_object() const {return Closest_point(*this);} Compare_distance compare_distance_object() const {return Compare_distance();} + typedef enum { CGAL_AXIS_X = 0, + CGAL_AXIS_Y = 1, + CGAL_AXIS_Z = 2} Axis; + + static Axis longest_axis(const Bounding_box& bbox); private: /** @@ -447,13 +451,6 @@ private: return internal::Primitive_helper::get_datum(pr,*this).bbox(); } - - typedef enum { CGAL_AXIS_X = 0, - CGAL_AXIS_Y = 1, - CGAL_AXIS_Z = 2} Axis; - - static Axis longest_axis(const Bounding_box& bbox); - /// Comparison functions static bool less_x(const Primitive& pr1, const Primitive& pr2,const AABB_traits& traits) { diff --git a/AABB_tree/include/CGAL/AABB_tree.h b/AABB_tree/include/CGAL/AABB_tree.h index 5f0521e219f..1bb4d0b2d17 100644 --- a/AABB_tree/include/CGAL/AABB_tree.h +++ b/AABB_tree/include/CGAL/AABB_tree.h @@ -126,7 +126,7 @@ namespace CGAL { Self& operator=(const Self&) = delete; /** - * @brief Builds the datastructure from a sequence of primitives. + * @brief Builds the data structure from a sequence of primitives. * @param first iterator over first primitive to insert * @param beyond past-the-end iterator * 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 new file mode 100644 index 00000000000..458f63668af --- /dev/null +++ b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Concepts/AdvancingFrontSurfaceReconstructionTraits_3.h @@ -0,0 +1,159 @@ + +/*! +\ingroup PkgAdvancingFrontSurfaceReconstructionRef +\cgalConcept + +The concept `AdvancingFrontSurfaceReconstructionTraits_3` describes the requirements +for the the geometric traits of the class `CGAL::Delaunay_triangulation_3` +used in the class `CGAL::Advancing_front_surface_reconstruction`. +It defines the geometric objects (points, segments...) forming the triangulation +together with a few geometric predicates and constructions on these objects. + +\cgalRefines `DelaunayTriangulationTraits_3` + +\cgalHasModel All models of `Kernel`. +*/ +class AdvancingFrontSurfaceReconstructionTraits_3 +{ +public: + +/// \name Types +/// @{ + +/*! +The coordinate type. +*/ +typedef unspecified_type FT; + +/*! +The vector type. +*/ +typedef unspecified_type Vector_3; + +/*! +The sphere type. +*/ +typedef unspecified_type Sphere_3; + +/*! +A constructor object that must provide the function operator + +`Vector_3 operator()(Point_3 p, Point_3 q)`, + +which constructs the vector `q-p`. +*/ +typedef unspecified_type Construct_vector_3; + +/*! +A constructor object that must provide the function operator + +`Vector_3 operator()(Vector_3 v, Vector_3 w)`, + +which returns the cross product of `v` and `w`. +*/ +typedef unspecified_type Construct_cross_product_vector_3; + +/*! +A constructor object that must provide the function operator + +`FT operator()(Vector_3 v, Vector_3 w)`, + +which returns the scalar (inner) product of `v` and `w`. +*/ +typedef unspecified_type Compute_scalar_product_3; + +/*! +A constructor object that must provide the function operator + +`Sphere_3 operator()(Point_3 p, Point_3 q, Point_3 r)`, + +which constructs a sphere initialized to the smallest sphere which passes +through the points `p`, `q`, and `r`. +*/ +typedef unspecified_type Construct_sphere_3; + +/*! +A constructor object that must provide the function operator + +`Point_3 operator()(Sphere_3 s)`, + +which returns the center of the sphere `s`. +*/ +typedef unspecified_type Construct_center_3; + +/*! +A constructor object that must provide the function operators + +`FT operator()(Point_3 p, Point_3 q, Point_3 r, Point_3 s)`, + +which returns the squared radius of the sphere passing through `p`, `q` and `r`, +and whose center is in the plane defined by these three points. + +and + +`FT operator()(Point_3 p, Point_3 q, Point_3 r, Point_3 s)`, + +which returns the squared radius of the sphere passing through `p`, `q`, `r`, and `s`. + +and + +`FT operator()(Sphere_3 s)`, + +which returns the squared radius of the sphere `s`. +*/ +typedef unspecified_type Compute_squared_radius_3; + +/*! +A constructor object that must provide the function operator + +`FT operator()(Point_3 p, Point_3 q)`, + +which returns the squared distance between the points `p` and `q`. +*/ +typedef unspecified_type Compute_squared_distance_3; + +/// @} + +/// \name Operations +/// The following functions give access to the predicate and construction objects: +/// @{ + +/*! +gives access to the `Construct_vector_3` construction. +*/ +Construct_vector_3 construct_vector_3_object(); + +/*! +gives access to the `Construct_cross_product_vector_3` construction. +*/ +Construct_cross_product_vector_3 construct_cross_product_vector_3_object(); + +/*! +gives access to the `Compute_scalar_product_3` construction. +*/ +Compute_scalar_product_3 compute_scalar_product_3_object(); + +/*! +gives access to the `Construct_sphere_3` construction. +*/ +Construct_sphere_3 construct_sphere_3_object(); + +/*! +gives access to the `Construct_center_3` construction. +*/ +Construct_center_3 construct_center_3_object(); + +/*! +gives access to the `Compute_squared_radius_3` construction. +*/ +Compute_squared_radius_3 compute_squared_radius_3_object(); + +/*! +gives access to the `Compute_squared_distance_3` construction. +*/ +Compute_squared_distance_3 compute_squared_distance_3_object(); + +/// @} + +}; /* end AdvancingFrontSurfaceReconstructionTraits_3 */ + diff --git a/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/PackageDescription.txt b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/PackageDescription.txt index 1adb33ca94e..5d50c10442c 100644 --- a/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/PackageDescription.txt +++ b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/PackageDescription.txt @@ -1,5 +1,8 @@ /// \defgroup PkgAdvancingFrontSurfaceReconstructionRef Advancing Front Surface Reconstruction Reference +/// \defgroup PkgAdvancingFrontSurfaceReconstructionRefConcepts Concepts +/// \ingroup PkgAdvancingFrontSurfaceReconstructionRef + /*! \addtogroup PkgAdvancingFrontSurfaceReconstructionRef @@ -25,6 +28,10 @@ of topological singularities. } \cgalClassifedRefPages +\cgalCRPSection{Concepts} + +- `AdvancingFrontSurfaceReconstructionTraits_3` + \cgalCRPSection{Classes} - `CGAL::Advancing_front_surface_reconstruction` diff --git a/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/dependencies b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/dependencies index 9b91259b814..69d8724660e 100644 --- a/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/dependencies +++ b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/dependencies @@ -5,6 +5,7 @@ Algebraic_foundations Circulator Stream_support TDS_2 +TDS_3 Triangulation_2 Triangulation_3 Number_types diff --git a/Advancing_front_surface_reconstruction/include/CGAL/Advancing_front_surface_reconstruction.h b/Advancing_front_surface_reconstruction/include/CGAL/Advancing_front_surface_reconstruction.h index e997bd55870..a54eaf9db24 100644 --- a/Advancing_front_surface_reconstruction/include/CGAL/Advancing_front_surface_reconstruction.h +++ b/Advancing_front_surface_reconstruction/include/CGAL/Advancing_front_surface_reconstruction.h @@ -175,23 +175,42 @@ namespace CGAL { store handles to the vertices and faces of the 3D triangulation, which enables the user to explore the 2D as well as 3D neighborhood of vertices and facets of the surface. - \tparam Dt must be a `Delaunay_triangulation_3` with - `Advancing_front_surface_reconstruction_vertex_base_3` and `Advancing_front_surface_reconstruction_cell_base_3` blended into the vertex and cell type. - The default uses the `Exact_predicates_inexact_constructions_kernel` as geometric traits class. + \tparam Dt must be a `Delaunay_triangulation_3` whose `Traits` template parameter must be a model of + `AdvancingFrontSurfaceReconstructionTraits_3` and whose `Tds` template parameter must be + a model of `TriangulationDataStructure_3` with `Advancing_front_surface_reconstruction_vertex_base_3` and + `Advancing_front_surface_reconstruction_cell_base_3` blended into the vertex and cell type, respectively. + The default value is: + \code + CGAL::Delaunay_triangulation_3, + CGAL::Advancing_front_surface_reconstruction_cell_base_3< + CGAL::Exact_predicates_inexact_constructions_kernel> > >` + \endcode - \tparam P must be a functor with `double operator()(AdvancingFront,Cell_handle,int)` returning the - priority of the facet `(Cell_handle,int)`. This functor enables the user to choose how candidate - triangles are prioritized. If a facet should not appear in the output, + \tparam P must be a functor offering + \code + FT operator()(Advancing_front_surface_reconstruction,Cell_handle,int) + \endcode + returning the priority of the facet `(Cell_handle,int)`. This functor enables the user + to choose how candidate triangles are prioritized. If a facet should not appear in the output, `infinity()` must be returned. It defaults to a functor that returns the `smallest_radius_delaunay_sphere()`. */ - template < - class Dt = Default, - class P = Default> - class Advancing_front_surface_reconstruction { - - typedef typename Default::Get, Advancing_front_surface_reconstruction_cell_base_3 > > >::type Triangulation; + template + class Advancing_front_surface_reconstruction + { + typedef typename Default::Get, + Advancing_front_surface_reconstruction_cell_base_3< + Exact_predicates_inexact_constructions_kernel> > > >::type Triangulation; typedef typename Default::Get::type Priority; public: @@ -202,9 +221,9 @@ namespace CGAL { /*! The type of the 2D triangulation data structure describing the reconstructed surface, being a model of `TriangulationDataStructure_2`. - The type `Triangulation_data_structure_2::Vertex` is model of the concept `TriangulationDataStructure_2::Vertex` and has additionally the - method `vertex_3()` that returns a `#Vertex_handle` to the associated 3D vertex. + method `vertex_3()` that returns a `Vertex_handle` to the associated 3D vertex. - The type `Triangulation_data_structure_2::Face` is model of the concept `TriangulationDataStructure_2::Face` and has additionally the - method `facet()` that returns the associated `#Facet`, and a method `bool is_on_surface()` + method `facet()` that returns the associated `Facet`, and a method `bool is_on_surface()` for testing if a face is part of the reconstructed surface or a face incident to a boundary edge. In case the surface has boundaries, the 2D surface has one vertex which is associated to the infinite @@ -213,15 +232,20 @@ namespace CGAL { typedef unspecified_type Triangulation_data_structure_2; /*! - The type of the 3D triangulation. + The type of the 3D Delaunay triangulation (the first template parameter). */ typedef unspecified_type Triangulation_3; /*! - The type of the facet priority functor. + The type of the facet priority functor (the second template parameter). */ typedef unspecified_type Priority; + /*! + The number type. + */ + typedef typename Triangulation_3::Geom_traits::FT FT; + /*! The point type. */ @@ -245,21 +269,21 @@ namespace CGAL { /*! A bidirectional iterator range which enables to enumerate all points that were removed from the 3D Delaunay triangulation during the surface reconstruction. The value type - of the iterator is `#Point`. + of the iterator is `Point`. */ typedef unspecified_type Outlier_range; + /*! + A bidirectional iterator range which enables to visit all vertices on a boundary. + The value type of the iterator is `Vertex_handle`. + */ + typedef unspecified_type Vertex_on_boundary_range; + /*! A bidirectional iterator range which enables to visit all boundaries. The value type of the iterator is `Vertex_on_boundary_range`. */ typedef unspecified_type Boundary_range; - - /*! - A bidirectional iterator range which enables to visit all vertices on a boundary. - The value type of the iterator is `#Vertex_handle` - */ - typedef unspecified_type Vertex_on_boundary_range; /// @} #endif @@ -268,6 +292,7 @@ namespace CGAL { typedef Advancing_front_surface_reconstruction Extract; typedef typename Triangulation_3::Geom_traits Geom_traits; + typedef typename Kernel::FT FT; typedef typename Kernel::FT coord_type; typedef typename Kernel::Point_3 Point; @@ -377,7 +402,23 @@ namespace CGAL { std::list nbe_pool; std::list ist_pool; + public: + Vector construct_vector(const Point& p, const Point& q) const + { + return T.geom_traits().construct_vector_3_object()(p, q); + } + Vector construct_cross_product(const Vector& v, const Vector& w) const + { + return T.geom_traits().construct_cross_product_vector_3_object()(v, w); + } + + FT compute_scalar_product(const Vector& v, const Vector& w) const + { + return T.geom_traits().compute_scalar_product_3_object()(v, w); + } + + private: Intern_successors_type* new_border() { nbe_pool.resize(nbe_pool.size()+1); @@ -679,12 +720,14 @@ namespace CGAL { ++it; }while(collinear(p,q,it->point())); const Point& r = it->point(); - Vector u = q-r; - Vector v = q-p; - Vector w = r-p; - Vector vw = cross_product(v,w); - double len = (std::max)(u*u,(std::max)(v*v,w*w)); - Point s = p + 10* len * (vw/(vw*vw)); + Vector u = construct_vector(r, q); + Vector v = construct_vector(p, q); + Vector w = construct_vector(p, r); + Vector vw = construct_cross_product(v,w); + double len = (std::max)(compute_scalar_product(u,u), + (std::max)(compute_scalar_product(v,v), + compute_scalar_product(w,w))); + Point s = p + 10 * len * (vw/compute_scalar_product(vw,vw)); added_vertex = T.insert(s); } } @@ -736,9 +779,9 @@ namespace CGAL { \param radius_ratio_bound candidates incident to surface triangles which are not in the beta-wedge are discarded, if the ratio of their radius and the radius of the surface triangle is larger than `radius_ratio_bound`. - Described in Section \ref AFSR_Boundaries + Described in Section \ref AFSR_Boundaries. \param beta half the angle of the wedge in which only the radius of triangles counts for the plausibility of candidates. - Described in Section \ref AFSR_Selection + Described in Section \ref AFSR_Selection. */ void run(double radius_ratio_bound=5, double beta= 0.52) @@ -1186,7 +1229,7 @@ namespace CGAL { \param index index of the facet in `c` */ - coord_type + FT smallest_radius_delaunay_sphere(const Cell_handle& c, const int& index) const { @@ -1249,16 +1292,16 @@ namespace CGAL { const Point& pp2 = cc->vertex(i2)->point(); const Point& pp3 = cc->vertex(i3)->point(); - Sphere facet_sphere(pp1, pp2, pp3); - if (squared_distance(facet_sphere.center(), pp0) < - facet_sphere.squared_radius()) + Sphere facet_sphere = T.geom_traits().construct_sphere_3_object()(pp1, pp2, pp3); + if (squared_distance(T.geom_traits().construct_center_3_object()(facet_sphere), pp0) < + T.geom_traits().compute_squared_radius_3_object()(facet_sphere)) { #ifdef AFSR_LAZY value = lazy_squared_radius(cc); #else // qualified with CGAL, to avoid a compilation error with clang if(volume(pp0, pp1, pp2, pp3) != 0){ - value = CGAL::squared_radius(pp0, pp1, pp2, pp3); + value = T.geom_traits().compute_squared_radius_3_object()(pp0, pp1, pp2, pp3); } else { typedef Exact_predicates_exact_constructions_kernel EK; Cartesian_converter to_exact; @@ -1280,26 +1323,30 @@ namespace CGAL { cc = lazy_circumcenter(c); cn = lazy_circumcenter(n); #else - cc = CGAL::circumcenter(cp0, cp1, cp2, cp3); - cn = CGAL::circumcenter(np0, np1, np2, np3); + cc = T.geom_traits().construct_circumcenter_3_object()(cp0, cp1, cp2, cp3); + cn = T.geom_traits().construct_circumcenter_3_object()(np0, np1, np2, np3); #endif // computation of the distance of cp1 to the dual segment cc, cn... - Vector V(cc - cn), Vc(cc - cp1), Vn(cp1 - cn); - coord_type ac(V * Vc), an(V * Vn), norm_V(V * V); + Vector V = construct_vector(cn, cc), + Vc = construct_vector(cp1, cc), + Vn = construct_vector(cn, cp1); + coord_type ac = compute_scalar_product(V, Vc), + an = compute_scalar_product(V, Vn), + norm_V = compute_scalar_product(V, V); if ((ac > 0) && (an > 0)) { - value = (Vc*Vc) - ac*ac/norm_V; + value = compute_scalar_product(Vc, Vc) - ac*ac/norm_V; if ((value < 0)||(norm_V > inv_eps_2)){ // qualified with CGAL, to avoid a compilation error with clang - value = CGAL::squared_radius(cp1, cp2, cp3); + value = T.geom_traits().compute_squared_radius_3_object()(cp1, cp2, cp3); } } else { if (ac <= 0) - value = squared_distance(cc, cp1); + value = T.geom_traits().compute_squared_distance_3_object()(cc, cp1); else // (an <= 0) - value = squared_distance(cn, cp1); + value = T.geom_traits().compute_squared_distance_3_object()(cn, cp1); } } } @@ -1314,7 +1361,7 @@ namespace CGAL { returns the infinite floating value that prevents a facet to be used. */ - coord_type infinity() const { return std::numeric_limits::infinity(); } + FT infinity() const { return std::numeric_limits::infinity(); } /// @} //--------------------------------------------------------------------- @@ -1341,9 +1388,9 @@ namespace CGAL { const Point& p2 = c->vertex(i2)->point(); const Point& pc = c->vertex(i3)->point(); - Vector P2P1 = p1-p2, P2Pn, PnP1; + Vector P2P1 = construct_vector(p2, p1), P2Pn, PnP1; - Vector v2, v1 = cross_product(pc-p2, P2P1); + Vector v2, v1 = construct_cross_product(construct_vector(p2, pc), P2P1); coord_type norm, norm1 = v1*v1; coord_type norm12 = P2P1*P2P1; @@ -1375,12 +1422,12 @@ namespace CGAL { { const Point& pn = neigh->vertex(n_i3)->point(); - P2Pn = pn-p2; - v2 = cross_product(P2P1,P2Pn); + P2Pn = construct_vector(p2, pn); + v2 = construct_cross_product(P2P1,P2Pn); //pas necessaire de normer pour un bon echantillon: // on peut alors tester v1*v2 >= 0 - norm = sqrt(norm1 * (v2*v2)); + norm = sqrt(norm1 * compute_scalar_product(v2,v2)); pscal = v1*v2; // check if the triangle will produce a sliver on the surface bool sliver_facet = (pscal <= COS_ALPHA_SLIVER*norm); @@ -1394,10 +1441,9 @@ namespace CGAL { // We skip triangles having an internal angle along e // whose cosinus is smaller than -DELTA // that is the angle is larger than arcos(-DELTA) - border_facet = !((P2P1*P2Pn >= - -DELTA*sqrt(norm12*(P2Pn*P2Pn)))&& - (P2P1*PnP1 >= - -DELTA*sqrt(norm12*(PnP1*PnP1)))); + border_facet = + !((P2P1*P2Pn >= -DELTA*sqrt(norm12*compute_scalar_product(P2Pn,P2Pn))) && + (P2P1*PnP1 >= -DELTA*sqrt(norm12*compute_scalar_product(PnP1,PnP1)))); // \todo investigate why we simply do not skip this triangle // but continue looking for a better candidate // if (!border_facet){ @@ -1569,9 +1615,11 @@ namespace CGAL { int n_i3 = (6 - n_ind - n_i1 - n_i2); const Point& pn = neigh->vertex(n_i3)->point(); - Vector v1 = cross_product(pc-p2,p1-p2), - v2 = cross_product(p1-p2,pn-p2); - coord_type norm = sqrt((v1*v1)*(v2*v2)); + Vector v1 = construct_cross_product(construct_vector(p2, pc), + construct_vector(p2, p1)), + v2 = construct_cross_product(construct_vector(p2, p1), + construct_vector(p2, pn)); + coord_type norm = sqrt(compute_scalar_product(v1, v1) * compute_scalar_product(v2, v2)); if (v1*v2 > COS_BETA*norm) return 1; // label bonne pliure sinon: @@ -2487,9 +2535,9 @@ namespace CGAL { \param out output iterator \param radius_ratio_bound candidates incident to surface triangles which are not in the beta-wedge are discarded, if the ratio of their radius and the radius of the surface triangle is larger than `radius_ratio_bound`. - Described in Section \ref AFSR_Boundaries + Described in Section \ref AFSR_Boundaries. \param beta half the angle of the wedge in which only the radius of triangles counts for the plausibility of candidates. - Described in Section \ref AFSR_Selection + Described in Section \ref AFSR_Selection. */ template @@ -2533,7 +2581,7 @@ namespace CGAL { be convertible to `Exact_predicates_inexact_constructions_kernel::Point_3` with the `Cartesian_converter`. \tparam IndicesOutputIterator must be an output iterator to which `std::array` can be assigned. - \tparam Priority must be a functor with `double operator()(AdvancingFront,Cell_handle,int)` returning the + \tparam Priority must be a functor with `double operator()(Advancing_front_surface_reconstruction,Cell_handle,int)` returning the priority of the facet `(Cell_handle,int)`. \param b iterator on the first point of the sequence diff --git a/Algebraic_foundations/doc/Algebraic_foundations/CGAL/number_utils.h b/Algebraic_foundations/doc/Algebraic_foundations/CGAL/number_utils.h index f81aa3945c2..74d7c452e99 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/CGAL/number_utils.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/CGAL/number_utils.h @@ -22,7 +22,7 @@ namespace CGAL { \ingroup PkgAlgebraicFoundationsRef The template function `compare()` compares the first argument with respect to -the second, i.e.\ it returns `CGAL::LARGER` if \f$ x\f$ is larger then \f$ y\f$. +the second, i.e.\ it returns `CGAL::LARGER` if \f$ x\f$ is larger than \f$ y\f$. In case the argument types `NT1` and `NT2` differ, `compare` is performed with the semantic of the type determined via diff --git a/Algebraic_foundations/include/CGAL/number_utils.h b/Algebraic_foundations/include/CGAL/number_utils.h index abb7894ccf4..d29434ad603 100644 --- a/Algebraic_foundations/include/CGAL/number_utils.h +++ b/Algebraic_foundations/include/CGAL/number_utils.h @@ -302,13 +302,13 @@ to_interval( const Real_embeddable& x) { } template -NT approximate_sqrt(const NT& nt, CGAL::Field_tag) +NT approximate_sqrt(const NT& nt, CGAL::Null_functor) { return NT(sqrt(CGAL::to_double(nt))); } -template -NT approximate_sqrt(const NT& nt, CGAL::Field_with_sqrt_tag) +template +NT approximate_sqrt(const NT& nt, Sqrt sqrt) { return sqrt(nt); } @@ -316,9 +316,12 @@ NT approximate_sqrt(const NT& nt, CGAL::Field_with_sqrt_tag) template NT approximate_sqrt(const NT& nt) { + // the initial version of this function was using Algebraic_category + // for the dispatch but some ring type (like Gmpz) provides a Sqrt + // functor even if not being Field_with_sqrt. typedef CGAL::Algebraic_structure_traits AST; - typedef typename AST::Algebraic_category Algebraic_category; - return approximate_sqrt(nt, Algebraic_category()); + typedef typename AST::Sqrt Sqrt; + return approximate_sqrt(nt, Sqrt()); } CGAL_NTS_END_NAMESPACE diff --git a/Algebraic_kernel_d/examples/Algebraic_kernel_d/CMakeLists.txt b/Algebraic_kernel_d/examples/Algebraic_kernel_d/CMakeLists.txt index 63cf6965333..b4bf51d141f 100644 --- a/Algebraic_kernel_d/examples/Algebraic_kernel_d/CMakeLists.txt +++ b/Algebraic_kernel_d/examples/Algebraic_kernel_d/CMakeLists.txt @@ -5,23 +5,15 @@ find_package(CGAL REQUIRED COMPONENTS Core) find_package(MPFI QUIET) -if(MPFI_FOUND) - +if(MPFI_FOUND AND NOT CGAL_DISABLE_GMP) include(${CGAL_USE_FILE}) include(${MPFI_USE_FILE}) include(CGAL_VersionUtils) - create_single_source_cgal_program("Compare_1.cpp") create_single_source_cgal_program("Construct_algebraic_real_1.cpp") create_single_source_cgal_program("Isolate_1.cpp") create_single_source_cgal_program("Sign_at_1.cpp") create_single_source_cgal_program("Solve_1.cpp") - else() - - message( - STATUS - "This program requires the CGAL library and MPFI, and will not be compiled." - ) - + message(STATUS "This program requires the CGAL, CGAL_Core and MPFI libraries, and will not be compiled.") endif() 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 188610dac44..34290afa7e2 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 @@ -2007,7 +2007,7 @@ public: * * For each status line at an event and each status line that represents * an interval, all y-coordinates are approximated such that their - * isolating interval has absolute size smaller then \c precision. + * isolating interval has absolute size smaller than \c precision. */ void refine_all(Bound precision) { diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/CMakeLists.txt b/Algebraic_kernel_d/test/Algebraic_kernel_d/CMakeLists.txt index b48f6a7e334..1338dba14ff 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/CMakeLists.txt +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/CMakeLists.txt @@ -34,32 +34,36 @@ include(${CGAL_USE_FILE}) # ########################################################## create_single_source_cgal_program("cyclic.cpp") -create_single_source_cgal_program("Algebraic_curve_kernel_2.cpp") -create_single_source_cgal_program("algebraic_curve_kernel_2_tools.cpp") -create_single_source_cgal_program("Algebraic_kernel_d_1_LEDA.cpp") - -create_single_source_cgal_program( - "Algebraic_kernel_d_1_CORE_Integer_rational.cpp") -create_single_source_cgal_program( - "Algebraic_kernel_d_1_CORE_SqrtII_rational.cpp") -create_single_source_cgal_program( - "Algebraic_kernel_d_1_CORE_SqrtRI_rational.cpp") -create_single_source_cgal_program( - "Algebraic_kernel_d_1_CORE_SqrtRR_rational.cpp") - -create_single_source_cgal_program("Algebraic_kernel_d_1_GMP.cpp") -create_single_source_cgal_program("Algebraic_kernel_d_2.cpp") -create_single_source_cgal_program("Algebraic_real_d_1.cpp") -create_single_source_cgal_program("Bitstream_descartes.cpp") -create_single_source_cgal_program("Curve_analysis_2.cpp") -create_single_source_cgal_program("Curve_pair_analysis_2.cpp") create_single_source_cgal_program("Descartes.cpp") -create_single_source_cgal_program("Real_embeddable_traits_extension.cpp") -if(RS_FOUND) - create_single_source_cgal_program("Algebraic_kernel_rs_gmpq_d_1.cpp") - create_single_source_cgal_program("Algebraic_kernel_rs_gmpz_d_1.cpp") +if(NOT CGAL_DISABLE_GMP) + create_single_source_cgal_program("Algebraic_curve_kernel_2.cpp") + create_single_source_cgal_program("algebraic_curve_kernel_2_tools.cpp") + create_single_source_cgal_program("Algebraic_kernel_d_1_LEDA.cpp") + + create_single_source_cgal_program( + "Algebraic_kernel_d_1_CORE_Integer_rational.cpp") + create_single_source_cgal_program( + "Algebraic_kernel_d_1_CORE_SqrtII_rational.cpp") + create_single_source_cgal_program( + "Algebraic_kernel_d_1_CORE_SqrtRI_rational.cpp") + create_single_source_cgal_program( + "Algebraic_kernel_d_1_CORE_SqrtRR_rational.cpp") + + create_single_source_cgal_program("Algebraic_kernel_d_1_GMP.cpp") + create_single_source_cgal_program("Algebraic_kernel_d_2.cpp") + create_single_source_cgal_program("Algebraic_real_d_1.cpp") + create_single_source_cgal_program("Bitstream_descartes.cpp") + create_single_source_cgal_program("Curve_analysis_2.cpp") + create_single_source_cgal_program("Curve_pair_analysis_2.cpp") + create_single_source_cgal_program("Real_embeddable_traits_extension.cpp") + if(RS_FOUND) + create_single_source_cgal_program("Algebraic_kernel_rs_gmpq_d_1.cpp") + create_single_source_cgal_program("Algebraic_kernel_rs_gmpz_d_1.cpp") + else() + message( + STATUS + "NOTICE: Some tests require the RS library, and will not be compiled.") + endif() else() - message( - STATUS - "NOTICE: Some tests require the RS library, and will not be compiled.") + message(STATUS "NOTICE: Some tests require the CGAL_Core library, and will not be compiled.") endif() diff --git a/Algebraic_kernel_for_spheres/include/CGAL/Algebraic_kernel_for_spheres/internal_functions_comparison_root_for_spheres_2_3.h b/Algebraic_kernel_for_spheres/include/CGAL/Algebraic_kernel_for_spheres/internal_functions_comparison_root_for_spheres_2_3.h index 1bfca81e065..1a79af038cc 100644 --- a/Algebraic_kernel_for_spheres/include/CGAL/Algebraic_kernel_for_spheres/internal_functions_comparison_root_for_spheres_2_3.h +++ b/Algebraic_kernel_for_spheres/include/CGAL/Algebraic_kernel_for_spheres/internal_functions_comparison_root_for_spheres_2_3.h @@ -30,19 +30,19 @@ namespace CGAL { template Comparison_result compare_x(const CGAL::Root_for_spheres_2_3& r1, const CGAL::Root_for_spheres_2_3& r2){ - return compare(r1.x(), r2.x()); + return CGAL::compare(r1.x(), r2.x()); } template Comparison_result compare_y(const CGAL::Root_for_spheres_2_3& r1, const CGAL::Root_for_spheres_2_3& r2){ - return compare(r1.y(), r2.y()); + return CGAL::compare(r1.y(), r2.y()); } template Comparison_result compare_z(const CGAL::Root_for_spheres_2_3& r1, const CGAL::Root_for_spheres_2_3& r2){ - return compare(r1.z(), r2.z()); + return CGAL::compare(r1.z(), r2.z()); } template diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/Alpha_shapes_2.txt b/Alpha_shapes_2/doc/Alpha_shapes_2/Alpha_shapes_2.txt index 545d92b3924..251b466a0da 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/Alpha_shapes_2.txt +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/Alpha_shapes_2.txt @@ -134,9 +134,8 @@ All \cgal kernels are models of both concepts. The triangulation data structure of the triangulation has to be a model of the concept `TriangulationDataStructure_2`, -and it must be parameterized with -vertex and face classes which are models of the concepts -`AlphaShapeVertex_2` and `AlphaShapeFace_2`. +whose vertex and face classes are models of the concepts +`AlphaShapeVertex_2` and `AlphaShapeFace_2`, respectively. The classes `Alpha_shape_vertex_base_2` and `Alpha_shape_face_base_2` are models of these concepts and can be used for all type of alpha shapes, provided that the template parameters `Vb` and `Fb` are appropriately chosen, diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Weighted_alpha_shape_euclidean_traits_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Weighted_alpha_shape_euclidean_traits_2.h deleted file mode 100644 index b182ba9e388..00000000000 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Weighted_alpha_shape_euclidean_traits_2.h +++ /dev/null @@ -1,26 +0,0 @@ - -namespace CGAL { - -/*! -\ingroup PkgAlphaShapes2Ref - -\deprecated The class is deprecated since \cgal 4.10, as the weighted point and the function -objects for weighted points are part of the concept `Kernel`. The class is kept for backward -compatibility. - -The class `Weighted_alpha_shape_euclidean_traits_2` was the default model for the concept -`AlphaShapeTraits_2` for the regular version of Alpha Shapes. - -\tparam K must be a model of `Kernel`. - -\cgalModels `AlphaShapeTraits_2` - -*/ -template< typename K > -class Weighted_alpha_shape_euclidean_traits_2 - : public K -{ -public: - -}; /* end Weighted_alpha_shape_euclidean_traits_2 */ -} /* end namespace CGAL */ 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 6a7dab82f54..ad7070f9a42 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 @@ -45,7 +45,7 @@ typedef unspecified_type FT; /*! A default constructor. */ - AlphaShapeTraits_2(); + WeightedAlphaShapeTraits_2(); /// @} diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/PackageDescription.txt b/Alpha_shapes_2/doc/Alpha_shapes_2/PackageDescription.txt index 3203f168390..4d777772e4b 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/PackageDescription.txt +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/PackageDescription.txt @@ -70,12 +70,12 @@ finite number of different \f$ \alpha\f$-shapes and corresponding \cgalCRPSection{Concepts} - `AlphaShapeTraits_2` +- `WeightedAlphaShapeTraits_2` - `AlphaShapeFace_2` - `AlphaShapeVertex_2` \cgalCRPSection{Classes} - `CGAL::Alpha_shape_2
    ` -- `CGAL::Weighted_alpha_shape_euclidean_traits_2` - `CGAL::Alpha_shape_vertex_base_2` - `CGAL::Alpha_shape_face_base_2` diff --git a/Alpha_shapes_2/include/CGAL/Alpha_shape_euclidean_traits_2.h b/Alpha_shapes_2/include/CGAL/Alpha_shape_euclidean_traits_2.h deleted file mode 100644 index 84399ca3ef4..00000000000 --- a/Alpha_shapes_2/include/CGAL/Alpha_shape_euclidean_traits_2.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 1997 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) : Tran Kai Frank DA -// Andreas Fabri - -#ifndef CGAL_ALPHA_SHAPE_EUCLIDEAN_TRAITS_H -#define CGAL_ALPHA_SHAPE_EUCLIDEAN_TRAITS_H - -#include - - - -namespace CGAL { - -template < class R > -class Alpha_shape_euclidean_traits_2 : public R -{}; - -} //namespace CGAL - -#endif diff --git a/Alpha_shapes_2/include/CGAL/Weighted_alpha_shape_euclidean_traits_2.h b/Alpha_shapes_2/include/CGAL/Weighted_alpha_shape_euclidean_traits_2.h deleted file mode 100644 index 58847dc2a43..00000000000 --- a/Alpha_shapes_2/include/CGAL/Weighted_alpha_shape_euclidean_traits_2.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 1997 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) : Tran Kai Frank DA -// Andreas Fabri - -#ifndef CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_2_H -#define CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_2_H - -#include - -#define CGAL_DEPRECATED_HEADER "" -#define CGAL_DEPRECATED_MESSAGE_DETAILS \ - "The kernel K can be used directly as traits since weighted points and "\ - "the associated function objects are now part of the concept Kernel." -#include - -namespace CGAL { - -template< class K_ > -class Weighted_alpha_shape_euclidean_traits_2 - : public K_ -{ -public: - Weighted_alpha_shape_euclidean_traits_2() { } - Weighted_alpha_shape_euclidean_traits_2(const K_& k) : K_(k) { } -}; - -} // namespace CGAL - -#endif // CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_2_H diff --git a/Alpha_shapes_3/TODO b/Alpha_shapes_3/TODO index 6567995aaed..03c111e94d4 100644 --- a/Alpha_shapes_3/TODO +++ b/Alpha_shapes_3/TODO @@ -12,14 +12,6 @@ when alpha is given as an int. Alpha_shape_3(Dt& dt, bool swap=true, NT alpha = 0, Mode m = REGULARIZED) The triangulation is swapped if swap=true and copied otherwise. -- suppress the traits classes Alpha_shape_euclidean_traits_3.h - and Weighted_alpha_shape_euclidean_traits_3.h - their purpose was to rename the Compute_squared_radius_3 constructor. - The same can be achieved in class Alpha_shapes_3 using the Weighted_tag - of the triangulation - -- same as previous for Alpha_shapes_2 - - test the taking into account of paramater alpha in functions get_alpha_shape_edges get_alpha_shape_facets 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 dbe053e9824..784ee1af57f 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 @@ -5,18 +5,16 @@ #include +#include int main(int argc, char** argv) { - QApplication application(argc,argv); + CGAL::Qt::init_ogl_context(4,3); + QApplication application(argc,argv); application.setOrganizationDomain("geometryfactory.com"); application.setOrganizationName("GeometryFactory"); application.setApplicationName("Alpha Shape Reconstruction"); - //for Windows -#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) - application.setAttribute(Qt::AA_UseDesktopOpenGL); -#endif // Import resources from libCGALQt (Qt5). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt index ede9b5e1367..4c7ecd50b4e 100644 --- a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt @@ -18,7 +18,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/Viewer.cpp b/Alpha_shapes_3/demo/Alpha_shapes_3/Viewer.cpp index a30e7a9a133..ad0e388412c 100644 --- a/Alpha_shapes_3/demo/Alpha_shapes_3/Viewer.cpp +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/Viewer.cpp @@ -29,14 +29,14 @@ void Viewer::compile_shaders() //Vertex source code const char vertex_source[] = { - "#version 120 \n" - "attribute highp vec4 vertex;\n" - "attribute highp vec3 normal;\n" + "#version 150 \n" + "in highp vec4 vertex;\n" + "in highp vec3 normal;\n" "uniform highp mat4 mvp_matrix;\n" "uniform highp mat4 mv_matrix; \n" - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" + "out highp vec4 fP; \n" + "out highp vec3 fN; \n" "void main(void)\n" "{\n" " fP = mv_matrix * vertex; \n" @@ -47,15 +47,16 @@ void Viewer::compile_shaders() //Fragment source code const char fragment_source[] = { - "#version 120 \n" - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" + "#version 150 \n" + "in highp vec4 fP; \n" + "in highp vec3 fN; \n" "uniform highp vec4 color; \n" "uniform highp vec4 light_pos; \n" "uniform highp vec4 light_diff; \n" "uniform highp vec4 light_spec; \n" "uniform highp vec4 light_amb; \n" "uniform float spec_power ; \n" + "out highp vec4 out_color; \n" "void main(void) { \n" @@ -70,7 +71,7 @@ void Viewer::compile_shaders() " highp vec4 diffuse = abs(dot(N,L)) * light_diff * color; \n" " highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n" - "gl_FragColor = light_amb*color + diffuse + specular ; \n" + "out_color = light_amb*color + diffuse + specular ; \n" "} \n" "\n" }; @@ -105,8 +106,8 @@ rendering_program.bind(); //Vertex source code const char vertex_source_points[] = { - "#version 120 \n" - "attribute highp vec4 vertex;\n" + "#version 150 \n" + "in highp vec4 vertex;\n" "uniform highp mat4 mvp_matrix;\n" "uniform highp float point_size;\n" @@ -119,11 +120,12 @@ const char vertex_source_points[] = //Vertex source code const char fragment_source_points[] = { - "#version 120 \n" + "#version 150 \n" "uniform highp vec4 color; \n" + "out highp vec4 out_color; \n" "void main(void) { \n" - "gl_FragColor = color; \n" + "out_color = color; \n" "} \n" "\n" }; diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/Viewer.h b/Alpha_shapes_3/demo/Alpha_shapes_3/Viewer.h index ff19159d837..289ae385c1e 100644 --- a/Alpha_shapes_3/demo/Alpha_shapes_3/Viewer.h +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/Viewer.h @@ -21,6 +21,7 @@ public: Viewer(QWidget* parent); ~Viewer() { + makeCurrent(); buffers[0].destroy(); buffers[1].destroy(); buffers[2].destroy(); diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Alpha_shapes_3.txt b/Alpha_shapes_3/doc/Alpha_shapes_3/Alpha_shapes_3.txt index 30cc7664e39..2566b5c8bf0 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Alpha_shapes_3.txt +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Alpha_shapes_3.txt @@ -219,8 +219,8 @@ in the non-weighted case and `WeightedAlphaShapeTraits_3` in the weighted case. All \cgal kernels are models of both concepts. The triangulation data structure of the triangulation -has to be a model of the concept `TriangulationDataStructure_3`, -and it must be parameterized with vertex and cell classes, which are model of the concepts +has to be a model of the concept `TriangulationDataStructure_3` +whose vertex and cell classes are model of the concepts `AlphaShapeVertex_3` and `AlphaShapeCell_3`. The classes `Alpha_shape_vertex_base_3` and `Alpha_shape_cell_base_3` are models of these concepts and can be used for all type of alpha shapes, @@ -234,8 +234,8 @@ the traits class are described in the concepts `FixedAlphaShapeTraits_3` in the non-weighted case and `FixedWeightedAlphaShapeTraits_3` in the weighted case. All \cgal kernels are models of both concepts. The triangulation data structure of the triangulation -has to be a model of the concept `TriangulationDataStructure_3`, -and it must be parameterized with vertex and cell classes, which are model of the concepts +has to be a model of the concept `TriangulationDataStructure_3` +whose vertex and cell classes are model of the concepts `FixedAlphaShapeVertex_3` and `FixedAlphaShapeCell_3`. The package provides models `Fixed_alpha_shape_vertex_base_3` and `Fixed_alpha_shape_cell_base_3`, respectively. diff --git a/Alpha_shapes_3/include/CGAL/Alpha_shape_euclidean_traits_3.h b/Alpha_shapes_3/include/CGAL/Alpha_shape_euclidean_traits_3.h deleted file mode 100644 index bcfb4c4f46c..00000000000 --- a/Alpha_shapes_3/include/CGAL/Alpha_shape_euclidean_traits_3.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 1997 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) : Tran Kai Frank DA - -#ifndef CGAL_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H -#define CGAL_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H - -#include - - -namespace CGAL { - -template -class Alpha_shape_euclidean_traits_3 : public K {}; - - -} //namespace CGAL - -#endif //CGAL_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H diff --git a/Alpha_shapes_3/include/CGAL/Weighted_alpha_shape_euclidean_traits_3.h b/Alpha_shapes_3/include/CGAL/Weighted_alpha_shape_euclidean_traits_3.h deleted file mode 100644 index e1fd36c933e..00000000000 --- a/Alpha_shapes_3/include/CGAL/Weighted_alpha_shape_euclidean_traits_3.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 1997 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) : Tran Kai Frank DA - -#ifndef CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H -#define CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H - -#include - -#define CGAL_DEPRECATED_HEADER "" -#define CGAL_DEPRECATED_MESSAGE_DETAILS \ - "The kernel K can be used directly as traits since weighted points and "\ - "the associated function objects are now part of the concept Kernel." -#include - -namespace CGAL { - -template < class K_ > -class Weighted_alpha_shape_euclidean_traits_3 - : public K_ -{ -public: - Weighted_alpha_shape_euclidean_traits_3() { } - Weighted_alpha_shape_euclidean_traits_3(const K_& k) : K_(k) { } -}; - -} // namespace CGAL - -#endif // CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Apollonius_graph_2.txt b/Apollonius_graph_2/doc/Apollonius_graph_2/Apollonius_graph_2.txt index 34fb0255111..0b2f6aa2082 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Apollonius_graph_2.txt +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Apollonius_graph_2.txt @@ -181,7 +181,7 @@ two visible circles. The 2D Apollonius graph class `Apollonius_graph_2` -follows the design of the triangulation package of \cgal. It is +follows the design of the triangulation packages of \cgal. It is parametrized by two arguments:
    • the geometric traits class. It provides the basic 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 c20ebc9846d..fb82e23c709 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 @@ -4,14 +4,20 @@ namespace CGAL { /*! \ingroup PkgApolloniusGraph2Ref -The class `Apollonius_graph_2` represents the -Apollonius graph. It supports insertions and deletions of sites. -It is templated by two template arguments `Gt`, which -must be a model of `ApolloniusGraphTraits_2`, and `Agds`, -which must be a model of `ApolloniusGraphDataStructure_2`. -The second template argument defaults to -`CGAL::Triangulation_data_structure_2< CGAL::Apollonius_graph_vertex_base_2, CGAL::Triangulation_face_base_2 >`. -\cgalModels `DelaunayGraph_2` +The class `Apollonius_graph_2` represents the Apollonius graph. +It supports insertions and deletions of sites. + +\tparam Gt is the geometric traits class and must be a model of `ApolloniusGraphTraits_2`. + +\tparam Agds is the Apollonius graph data structure and must be a model of `ApolloniusGraphDataStructure_2` +whose vertex and face must be models of `ApolloniusGraphVertexBase_2` and `TriangulationFaceBase_2`, +respectively. +It defaults to: +\code + CGAL::Triangulation_data_structure_2< + CGAL::Apollonius_graph_vertex_base_2, + CGAL::Triangulation_face_base_2 >` +\endcode \cgalHeading{Traversal of the Apollonius Graph} @@ -40,17 +46,11 @@ ag.incident_edges(ag.infinite_vertex()); ag.incident_edges(ag.infinite_vertex(), f); \endcode -\sa `DelaunayGraph_2` -\sa `ApolloniusGraphTraits_2` -\sa `ApolloniusGraphDataStructure_2` -\sa `ApolloniusGraphVertexBase_2` -\sa `TriangulationFaceBase_2` +\cgalModels `DelaunayGraph_2` + \sa `CGAL::Apollonius_graph_traits_2` \sa `CGAL::Apollonius_graph_filtered_traits_2` -\sa `CGAL::Triangulation_data_structure_2` -\sa `CGAL::Apollonius_graph_vertex_base_2` -\sa `CGAL::Triangulation_face_base_2` - +\sa `CGAL::Apollonius_graph_hierarchy_2` */ template< typename Gt, typename Agds > class Apollonius_graph_2 { @@ -92,7 +92,7 @@ typedef Gt::Site_2 Site_2; /// \name Handles And Iterators /// The vertices and faces of the Apollonius graph are accessed -/// through `handles`, `iterators` and `circulators`. The iterators +/// through `handles`, `iterators`, and `circulators`. The iterators /// and circulators are all bidirectional and non-mutable. The /// circulators and iterators are assignable to the corresponding /// handle types, and they are also convertible to the corresponding @@ -261,63 +261,62 @@ operator=(const Apollonius_graph_2& other); /*! Returns a reference to the Apollonius graph traits object. */ -Geom_traits geom_traits(); +const Geom_traits& geom_traits() const; /*! Returns a reference to the underlying data structure. */ -Data_structure data_structure(); +const Data_structure& data_structure() const; /*! Same as `data_structure()`. This method has been added in compliance with the `DelaunayGraph_2` concept. */ -Data_structure tds(); +const Data_structure& tds() const; /*! Returns the dimension of the Apollonius graph. */ -int dimension(); +int dimension() const; /*! Returns the number of finite vertices. */ -size_type number_of_vertices(); +size_type number_of_vertices() const; /*! Returns the number of visible sites. */ -size_type number_of_visible_sites(); +size_type number_of_visible_sites() const; /*! Returns the number of hidden sites. */ -size_type number_of_hidden_sites(); +size_type number_of_hidden_sites() const; /*! Returns the number of faces (both finite and infinite) of the Apollonius graph. */ -size_type number_of_faces(); +size_type number_of_faces() const; /*! Returns a face incident to the `infinite_vertex`. */ -Face_handle infinite_face(); +Face_handle infinite_face() const; /*! Returns the `infinite_vertex`. */ -Vertex_handle -infinite_vertex(); +Vertex_handle infinite_vertex() const; /*! Returns a vertex distinct from the `infinite_vertex`. \pre The number of (visible) vertices in the Apollonius graph must be at least one. */ -Vertex_handle finite_vertex(); +Vertex_handle finite_vertex() const; /// @} @@ -337,63 +336,62 @@ Vertex_handle finite_vertex(); /*! Starts at an arbitrary finite vertex. */ -Finite_vertices_iterator finite_vertices_begin(); +Finite_vertices_iterator finite_vertices_begin() const; /*! Past-the-end iterator. */ -Finite_vertices_iterator finite_vertices_end(); +Finite_vertices_iterator finite_vertices_end() const; /*! Starts at an arbitrary finite edge. */ -Finite_edges_iterator finite_edges_begin(); +Finite_edges_iterator finite_edges_begin() const; /*! Past-the-end iterator. */ -Finite_edges_iterator finite_edges_end(); +Finite_edges_iterator finite_edges_end() const; /*! Starts at an arbitrary finite face. */ -Finite_faces_iterator finite_faces_begin(); +Finite_faces_iterator finite_faces_begin() const; /*! Past-the-end iterator. */ -Finite_faces_iterator finite_faces_end() -const; +Finite_faces_iterator finite_faces_end() const; /*! Starts at an arbitrary vertex. */ -All_vertices_iterator all_vertices_begin(); +All_vertices_iterator all_vertices_begin() const; /*! Past-the-end iterator. */ -All_vertices_iterator all_vertices_end(); +All_vertices_iterator all_vertices_end() const; /*! Starts at an arbitrary edge. */ -All_edges_iterator all_edges_begin(); +All_edges_iterator all_edges_begin() const; /*! Past-the-end iterator. */ -All_edges_iterator all_edges_end(); +All_edges_iterator all_edges_end() const; /*! Starts at an arbitrary face. */ -All_faces_iterator all_faces_begin(); +All_faces_iterator all_faces_begin() const; /*! Past-the-end iterator. */ -All_faces_iterator all_faces_end(); +All_faces_iterator all_faces_end() const; /// @} @@ -407,32 +405,32 @@ All_faces_iterator all_faces_end(); /*! Starts at an arbitrary site. */ -Sites_iterator sites_begin(); +Sites_iterator sites_begin() const; /*! Past-the-end iterator. */ -Sites_iterator sites_end(); +Sites_iterator sites_end() const; /*! Starts at an arbitrary visible site. */ -Visible_sites_iterator visible_sites_begin(); +Visible_sites_iterator visible_sites_begin() const; /*! Past-the-end iterator. */ -Visible_sites_iterator visible_sites_end(); +Visible_sites_iterator visible_sites_end() const; /*! Starts at an arbitrary hidden site. */ -Hidden_sites_iterator hidden_sites_begin(); +Hidden_sites_iterator hidden_sites_begin() const; /*! Past-the-end iterator. */ -Hidden_sites_iterator hidden_sites_end(); +Hidden_sites_iterator hidden_sites_end() const; /// @} @@ -454,39 +452,39 @@ Hidden_sites_iterator hidden_sites_end(); Starts at an arbitrary face incident to `v`. */ -Face_circulator incident_faces(Vertex_handle v); +Face_circulator incident_faces(Vertex_handle v) const; /*! Starts at face `f`. \pre Face `f` is incident to vertex `v`. */ -Face_circulator incident_faces(Vertex_handle v, Face_handle f); +Face_circulator incident_faces(Vertex_handle v, Face_handle f) const; /*! Starts at an arbitrary edge incident to `v`. */ -Edge_circulator incident_edges(Vertex_handle v); +Edge_circulator incident_edges(Vertex_handle v) const; /*! Starts at the first edge of `f` incident to `v`, in counterclockwise order around `v`. \pre Face `f` is incident to vertex `v`. */ -Edge_circulator incident_edges(Vertex_handle v, Face_handle f); +Edge_circulator incident_edges(Vertex_handle v, Face_handle f) const; /*! Starts at an arbitrary vertex incident to `v`. */ -Vertex_circulator incident_vertices(Vertex_handle v); +Vertex_circulator incident_vertices(Vertex_handle v) const; /*! Starts at the first vertex of `f` adjacent to `v` in counterclockwise order around `v`. \pre Face `f` is incident to vertex `v`. */ -Vertex_circulator incident_vertices(Vertex_handle v, Face_handle f); +Vertex_circulator incident_vertices(Vertex_handle v, Face_handle f) const; /// @} @@ -516,7 +514,7 @@ bool is_infinite(Face_handle f, int i) const; `true`, iff edge `e` is infinite. */ bool -is_infinite(Edge e) const; +is_infinite(const Edge& e) const; /*! `true`, iff edge `*ec` is infinite. @@ -544,7 +542,7 @@ site `s` in the Apollonius graph. If `s` is visible then the vertex handle of `s` is returned, otherwise `Vertex_handle(nullptr)` is returned. */ -Vertex_handle insert(Site_2 s); +Vertex_handle insert(const Site_2& s); /*! Inserts `s` in the Apollonius graph using the site @@ -553,8 +551,7 @@ the center of `s`. If `s` is visible then the vertex handle of `s` is returned, otherwise `Vertex_handle(nullptr)` is returned. */ -Vertex_handle insert(Site_2 s, Vertex_handle -vnear); +Vertex_handle insert(const Site_2& s, Vertex_handle vnear); /// @} @@ -581,7 +578,7 @@ arbitrarily and one of the nearest neighbors of `p` is returned. If there are no visible sites in the Apollonius diagram `Vertex_handle(nullptr)` is returned. */ -Vertex_handle nearest_neighbor(Point_2 p); +Vertex_handle nearest_neighbor(const Point_2& p) const; /*! Finds the nearest neighbor of the point @@ -591,8 +588,7 @@ arbitrarily and one of the nearest neighbors of `p` is returned. If there are no visible sites in the Apollonius diagram `Vertex_handle(nullptr)` is returned. */ -Vertex_handle nearest_neighbor(Point_2 p, -Vertex_handle vnear); +Vertex_handle nearest_neighbor(const Point_2& p, Vertex_handle vnear) const; /// @} @@ -645,7 +641,7 @@ the stream `str`. */ template< class Stream > -Stream& draw_primal(Stream& str); +Stream& draw_primal(Stream& str) const; /*! Draws the dual of the @@ -658,7 +654,7 @@ Apollonius graph, i.e., the Apollonius diagram, to the stream */ template < class Stream > -Stream& draw_dual(Stream& str); +Stream& draw_dual(Stream& str) const; /*! Draws the edge @@ -669,7 +665,7 @@ Draws the edge */ template< class Stream > -Stream& draw_primal_edge(Edge e, Stream& str); +Stream& draw_primal_edge(const Edge& e, Stream& str) const; /*! Draws the dual of the @@ -682,7 +678,7 @@ of the Apollonius diagram. */ template< class Stream > -Stream& draw_dual_edge(Edge e, Stream& str); +Stream& draw_dual_edge(const Edge& e, Stream& str) const; /*! Writes the current @@ -690,7 +686,7 @@ state of the Apollonius graph to an output stream. In particular, all visible and hidden sites are written as well as the underlying combinatorial data structure. */ -void file_output(std::ostream& os); +void file_output(std::ostream& os) const; /*! Reads the state of the @@ -701,14 +697,12 @@ void file_input(std::istream& is); /*! Writes the current state of the Apollonius graph to an output stream. */ -std::ostream& operator<<(std::ostream& os, -Apollonius_graph_2 ag); +std::ostream& operator<<(std::ostream& os, const Apollonius_graph_2& ag) const; /*! Reads the state of the Apollonius graph from an input stream. */ -std::istream& operator>>(std::istream& is, -Apollonius_graph_2 ag); +std::istream& operator>>(std::istream& is, const Apollonius_graph_2& ag); /// @} @@ -721,9 +715,9 @@ Checks the validity of the Apollonius graph. If `verbose` is is 0, only the data structure is validated. If `level` is 1, then both the data structure and the Apollonius graph are validated. Negative values of `level` always return true, and -values greater then 1 are equivalent to `level` being 1. +values greater than 1 are equivalent to `level` being 1. */ -bool is_valid(bool verbose = false, int level = 1); +bool is_valid(bool verbose = false, int level = 1) const; /// @} @@ -737,12 +731,11 @@ void clear(); /*! The Apollonius graphs -`other` and `ag` are swapped. `ag`.`swap(other)` should -be preferred to `ag`` = other` or to `ag``(other)` if +`other` and `ag` are swapped. `ag.swap(other)` should +be preferred to `ag = other` or to `ag(other)` if `other` is deleted afterwards. */ -void swap(Apollonius_graph_2 -other); +void swap(Apollonius_graph_2& other); /// @} diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_hierarchy_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_hierarchy_2.h index 24a11cebc80..778dd9160e1 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_hierarchy_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_hierarchy_2.h @@ -19,36 +19,34 @@ find the nearest neighbor of \f$ p\f$ as in the we use the nearest neighbor found at level \f$ i+1\f$ to find the nearest neighbor at level \f$ i\f$. This is a variant of the corresponding hierarchy for points found in \cgalCite{d-iirdt-98}. + The class has two template parameters which have essentially the same -meaning as in the `Apollonius_graph_2` class. The first -template parameter must be a model of the -`ApolloniusGraphTraits_2` concept. -The second template parameter must be a model of the -`ApolloniusGraphDataStructure_2` concept. However, the vertex base -class that is to be used in the Apollonius graph data structure must -be a model of the `ApolloniusGraphHierarchyVertexBase_2` concept. -The second template parameter defaults to -`Triangulation_data_structure_2< Apollonius_graph_hierarchy_vertex_base_2< Apollonius_graph_vertex_base_2 >, Triangulation_face_base_2 >`. +meaning as in the `Apollonius_graph_2` class. + +\tparam Gt is the geometric traits class and must be a model of `ApolloniusGraphTraits_2`. + +\tparam Agds is the Apollonius graph data structure and must be a model of `ApolloniusGraphDataStructure_2` +whose vertex and face must be models of `ApolloniusGraphHierarchyVertexBase_2` and `TriangulationFaceBase_2`, respectively. +It defaults to: +\code + CGAL::Triangulation_data_structure_2< + CGAL::Apollonius_graph_hierarchy_vertex_base_2 >, + CGAL::Triangulation_face_base_2 > +\endcode + +\cgalHeading{Heritage} The `Apollonius_graph_hierarchy_2` class derives publicly from the `Apollonius_graph_2` class. The interface is the same with its base class. In the sequel only the methods overridden are documented. -\cgalHeading{Types} - `Apollonius_graph_hierarchy_2` does not introduce other types than those introduced by its base class `Apollonius_graph_2`. -\sa `ApolloniusGraphDataStructure_2` -\sa `ApolloniusGraphTraits_2` -\sa `ApolloniusGraphHierarchyVertexBase_2` \sa `CGAL::Apollonius_graph_2` -\sa `CGAL::Triangulation_data_structure_2` \sa `CGAL::Apollonius_graph_traits_2` \sa `CGAL::Apollonius_graph_filtered_traits_2` -\sa `CGAL::Apollonius_graph_hierarchy_vertex_base_2` - */ template< typename Gt, typename Agds > class Apollonius_graph_hierarchy_2 : public CGAL::Apollonius_graph_2 { @@ -61,8 +59,7 @@ public: Creates an hierarchy of Apollonius graphs using `gt` as geometric traits. */ -Apollonius_graph_hierarchy_2(Gt -gt=Gt()); +Apollonius_graph_hierarchy_2(Gt gt=Gt()); /*! Creates an Apollonius graph hierarchy using @@ -70,17 +67,15 @@ Creates an Apollonius graph hierarchy using range [`first`, `beyond`). */ template< class Input_iterator > -Apollonius_graph_hierarchy_2(Input_iterator -first, Input_iterator beyond, Gt gt=Gt()); +Apollonius_graph_hierarchy_2(Input_iterator first, Input_iterator beyond, Gt gt=Gt()); /*! -Copy constructor. All faces, vertices and inter-level pointers +Copy constructor. All faces, vertices, and inter-level pointers are duplicated. After the construction, `agh` and `other` refer to two different Apollonius graph hierarchies: if `other` is modified, `agh` is not. */ -Apollonius_graph_hierarchy_2 -(Apollonius_graph_hierarchy_2 other); +Apollonius_graph_hierarchy_2(const Apollonius_graph_hierarchy_2& other); /*! Assignment. All faces, vertices and inter-level pointers @@ -112,7 +107,7 @@ site `s` in the Apollonius graph hierarchy. If `s` is visible then the vertex handle of `s` is returned, otherwise `Vertex_handle(nullptr)` is returned. */ -Vertex_handle insert(Site_2 s); +Vertex_handle insert(const Site_2& s); /*! Inserts `s` in the Apollonius graph hierarchy using the @@ -124,8 +119,7 @@ A call to this method is equivalent to `agh.insert(s);` and it has been added for the sake of conformity with the interface of the `Apollonius_graph_2` class. */ -Vertex_handle insert(Site_2 s, Vertex_handle -vnear); +Vertex_handle insert(const Site_2& s, Vertex_handle vnear); /// @} @@ -152,7 +146,7 @@ arbitrarily and one of the nearest neighbors of `p` is returned. If there are no visible sites in the Apollonius diagram `Vertex_handle(nullptr)` is returned. */ -Vertex_handle nearest_neighbor(Point p); +Vertex_handle nearest_neighbor(const Point_2& p) const; /*! Finds the nearest neighbor of the point @@ -163,8 +157,7 @@ A call to this method is equivalent to conformity with the interface of the `Apollonius_graph_2` class. */ -Vertex_handle nearest_neighbor(Point p, -Vertex_handle vnear); +Vertex_handle nearest_neighbor(const Point_2& p, Vertex_handle vnear) const; /// @} @@ -177,7 +170,7 @@ state of the Apollonius graph hierarchy to an output stream. In particular, all visible and hidden sites are written as well as the underlying combinatorial hierarchical data structure. */ -void file_output(std::ostream& os); +void file_output(std::ostream& os) const; /*! Reads the state of the @@ -189,7 +182,7 @@ void file_input(std::istream& is); Writes the current state of the Apollonius graph hierarchy to an output stream. */ -std::ostream& operator<<(std::ostream& os, Apollonius_graph_hierarchy_2 agh); +std::ostream& operator<<(std::ostream& os, Apollonius_graph_hierarchy_2 agh) const; /*! Reads the state of the Apollonius graph hierarchy from an input stream. @@ -209,7 +202,7 @@ is validated, as well as the inter-level pointers. If `level` is 1, then the data structure at all levels is validated, the inter-level pointers are validated and all levels of the Apollonius graph hierarchy are also validated. Negative values of `level` always -return `true`, and values greater then 1 are equivalent to +return `true`, and values greater than 1 are equivalent to `level` being 1. */ bool is_valid(bool verbose = false, int level = 1) const; @@ -227,11 +220,10 @@ void clear(); /*! The Apollonius graph hierarchies `other` and `agh` are -swapped. `agh`.`swap(other)` should be preferred to `agh`` = -other` or to `agh``(other)` if `other` is deleted afterwards. +swapped. `agh.swap(other)` should be preferred to `agh = other` +or to `agh(other)` if `other` is deleted afterwards. */ -void swap(Apollonius_graph_hierarchy_2 -other); +void swap(Apollonius_graph_hierarchy_2& other); /// @} 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 3d6bc26db21..c09d6255ab5 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 @@ -13,10 +13,9 @@ of the `ApolloniusGraphVertexBase_2` concept. \cgalModels `ApolloniusGraphHierarchyVertexBase_2` -\sa `ApolloniusGraphVertexBase_2` -\sa `ApolloniusGraphHierarchyVertexBase_2` \sa `CGAL::Apollonius_graph_vertex_base_2` - +\sa `CGAL::Triangulation_data_structure_2` +\sa `CGAL::Apollonius_graph_hierarchy_2` */ template< typename Agvb > class Apollonius_graph_hierarchy_vertex_base_2 : Agvb { @@ -34,7 +33,7 @@ Apollonius_graph_hierarchy_vertex_base_2(); Constructs a vertex associated with the site `s` and embedded at the center of `s`. */ -Apollonius_graph_hierarchy_vertex_base_2(Site_2 s); +Apollonius_graph_hierarchy_vertex_base_2(const Site_2& s); /*! Constructs a vertex associated with @@ -42,7 +41,7 @@ the site `s`, embedded at the center of `s`, and pointing to the face associated with the face handle `f`. */ -Apollonius_graph_vertex_base_2(Site_2 s, Face_handle f); +Apollonius_graph_hierarchy_vertex_base_2(const Site_2& s, Face_handle f); /// @} 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 ae347df1437..3fe29ef740b 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 @@ -22,13 +22,8 @@ The way the predicates are evaluated is discussed in \cgalModels `ApolloniusGraphTraits_2` -\sa `Kernel` -\sa `ApolloniusGraphTraits_2` -\sa `CGAL::Integral_domain_without_division_tag` -\sa `CGAL::Field_with_sqrt_tag` \sa `CGAL::Apollonius_graph_2` \sa `CGAL::Apollonius_graph_filtered_traits_2` - */ template< typename K, typename Method_tag > class Apollonius_graph_traits_2 { @@ -45,14 +40,13 @@ Apollonius_graph_traits_2(); /*! Copy constructor. */ -Apollonius_graph_traits_2(Apollonius_graph_traits_2 other); +Apollonius_graph_traits_2(const Apollonius_graph_traits_2& other); /*! Assignment operator. */ Apollonius_graph_traits_2 -operator=(Apollonius_graph_traits_2 -other); +operator=(const Apollonius_graph_traits_2& other); /// @} 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 a4ba4a49194..ae9eca3dc6e 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 @@ -19,13 +19,8 @@ discarded. By default `StoreHidden` is set to `true`. \cgalModels `ApolloniusGraphVertexBase_2` -\sa `ApolloniusGraphVertexBase_2` -\sa `ApolloniusGraphDataStructure_2` -\sa `ApolloniusGraphTraits_2` \sa `CGAL::Triangulation_data_structure_2` -\sa `CGAL::Apollonius_graph_traits_2` -\sa `CGAL::Apollonius_graph_filtered_traits_2` - +\sa `CGAL::Apollonius_graph_hierarchy_vertex_base_2` */ template< typename Gt, typename StoreHidden > class Apollonius_graph_vertex_base_2 { @@ -37,13 +32,13 @@ public: /*! %Default constructor. */ -Apollonius_graph_bertex_base_2(); +Apollonius_graph_vertex_base_2(); /*! Constructs a vertex associated with the site `s` and embedded at the center of `s`. */ -Apollonius_graph_vertex_base_2(Site_2 s); +Apollonius_graph_vertex_base_2(const Site_2& s); /*! Constructs a vertex associated with @@ -51,7 +46,7 @@ the site `s`, embedded at the center of `s`, and pointing to the face associated with the face handle `f`. */ -Apollonius_graph_vertex_base_2(Site_2 s, Face_handle f); +Apollonius_graph_vertex_base_2(const Site_2& s, Face_handle f); /// @} 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 03bee290f37..162a6e46259 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 @@ -22,12 +22,9 @@ The I/O operators are defined for `iostream`. The information output in the `iostream` is: the point of the Apollonius site and its weight. -\sa `Kernel` -\sa `ApolloniusSite_2` \sa `CGAL::Qt_widget` \sa `CGAL::Apollonius_graph_traits_2` \sa `CGAL::Apollonius_graph_filtered_traits_2` - */ template< typename K > class Apollonius_site_2 { @@ -44,7 +41,7 @@ Apollonius_site_2(Point_2 p=Point_2(), Weight w= Weight(0)); /*! Copy constructor. */ -Apollonius_site_2(Apollonius_site_2 other); +Apollonius_site_2(const Apollonius_site_2& other); /// @} @@ -57,8 +54,7 @@ Apollonius site `s` into the stream `os`. \pre The insert operator must be defined for `Point_2` and `Weight`. \relates Apollonius_site_2 */ -std::ostream& operator<<(std::ostream& os, -const Apollonius_site_2& s); +std::ostream& operator<<(std::ostream& os, const Apollonius_site_2& s) const; /*! Reads an Apollonius site from the stream `is` and assigns it @@ -67,8 +63,7 @@ to `s`. \pre The extract operator must be defined for `Point_2` and `Weight`. \relates Apollonius_site_2 */ -std::istream& operator>>(std::istream& is, -const Apollonius_site_2& s); +std::istream& operator>>(std::istream& is, const Apollonius_site_2& s); /*! Inserts the Apollonius site `s` into the `Qt_widget` stream `w`. @@ -76,7 +71,6 @@ Inserts the Apollonius site `s` into the `Qt_widget` stream `w`. \pre The insert operator must be defined for `K::Circle_2`. \relates Apollonius_site_2 */ -Qt_widget& operator<<(Qt_widget& w, -const Apollonius_site_2& s); +Qt_widget& operator<<(Qt_widget& w, const Apollonius_site_2& s) const; } /* end namespace CGAL */ 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 c2f31f5fa59..8c3209da2e8 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 @@ -42,10 +42,10 @@ public: /// @{ /*! -Inserts -a degree two vertex and two faces adjacent to it that have two common -edges. The edge defined by the face handle `f` and the integer -`i` is duplicated. It returns a handle to the vertex created. +inserts a degree two vertex and two faces adjacent to it that have two common edges. + +The edge defined by the face handle `f` and the integer `i` is duplicated. It returns a handle +to the vertex created. */ Vertex_handle insert_degree_2(Face_handle f, int i); 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 7de3add41e0..8145923b669 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,17 +19,12 @@ 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 > +\cgalHasModel `CGAL::Apollonius_graph_hierarchy_vertex_base_2 >` \sa `ApolloniusGraphDataStructure_2` -\sa `ApolloniusGraphVertexBase_2` \sa `CGAL::Apollonius_graph_hierarchy_2` \sa `CGAL::Triangulation_data_structure_2` -\sa `CGAL::Apollonius_graph_vertex_base_2` -\sa `CGAL::Apollonius_graph_hierarchy_vertex_base_2` - */ - class ApolloniusGraphHierarchyVertexBase_2 { public: @@ -37,8 +32,7 @@ public: /// @{ /*! -Default -constructor. +%Default constructor. */ ApolloniusGraphHierarchyVertexBase_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 78fad902088..e25279179aa 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 @@ -3,8 +3,6 @@ \ingroup PkgApolloniusGraph2Concepts \cgalConcept -\cgalRefines `TriangulationVertexBase_2` - The concept `ApolloniusGraphVertexBase_2` describes the requirements for the vertex base class of the `ApolloniusGraphDataStructure_2` concept. A vertex stores an @@ -12,14 +10,14 @@ Apollonius site and provides access to one of its incident faces through a `Face_handle`. In addition, it maintains a container of sites. The container stores the hidden sites related to the vertex. +\cgalRefines `TriangulationVertexBase_2` + \cgalHasModel `CGAL::Apollonius_graph_vertex_base_2` \sa `ApolloniusGraphDataStructure_2` -\sa `ApolloniusGraphTraits_2` -\sa `CGAL::Apollonius_graph_vertex_base_2` - +\sa `CGAL::Apollonius_graph_2` +\sa `CGAL::Triangulation_data_structure_2` */ - class ApolloniusGraphVertexBase_2 { public: @@ -77,7 +75,7 @@ typedef unspecified_type Hidden_sites_iterator; /// @{ /*! -Default constructor. +%Default constructor. */ ApolloniusGraphVertexBase_2(); diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/PackageDescription.txt b/Apollonius_graph_2/doc/Apollonius_graph_2/PackageDescription.txt index 706466df36b..f82d98db1ed 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/PackageDescription.txt +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/PackageDescription.txt @@ -43,18 +43,18 @@ aforementioned concepts. \cgalCRPSection{Concepts} - `ApolloniusSite_2` +- `ApolloniusGraphTraits_2` - `ApolloniusGraphDataStructure_2` - `ApolloniusGraphVertexBase_2` -- `ApolloniusGraphTraits_2` - `ApolloniusGraphHierarchyVertexBase_2` \cgalCRPSection{Classes} - `CGAL::Apollonius_graph_2` - `CGAL::Apollonius_site_2` -- `CGAL::Apollonius_graph_vertex_base_2` - `CGAL::Apollonius_graph_traits_2` - `CGAL::Apollonius_graph_filtered_traits_2` +- `CGAL::Apollonius_graph_vertex_base_2` - `CGAL::Apollonius_graph_hierarchy_2` - `CGAL::Apollonius_graph_hierarchy_vertex_base_2` 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 f7ab51dc7cc..91b9ed0b08b 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 @@ -3,9 +3,6 @@ cmake_minimum_required(VERSION 3.1...3.15) project(Arrangement_on_surface_2_Demo) -set(CMAKE_CXX_STANDARD 14) -set(CMAKE_CXX_STANDARD_REQUIRED TRUE) - 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) @@ -23,6 +20,8 @@ if (CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND) add_compile_definitions(QT_NO_KEYWORDS) include_directories( BEFORE ./ ) + # Arrangement package includes + add_definitions(-DQT_NO_KEYWORDS) option(COMPILE_UTILS_INCREMENTALLY "Compile files in Utils directory incrementally, or compile them all as a unit. \ Incremental compilation will be better for development and consume less \ 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 1caa255411b..b45bc3ab794 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 @@ -34,11 +34,11 @@ conveniently embedded as a planar graph, whose vertices are associated with curve endpoints or with isolated points, and whose edges are associated with subcurves. It is easy to see that \f$ \cal A(\cal C) = \cal A(\cal C'')\f$. This graph can be represented using a -doubly-connected edge list data-structure (\sc{Dcel} for short), +doubly-connected edge list data-structure (\dcel for short), which consists of containers of vertices, edges and faces and maintains the incidence relations among these objects. -The main idea behind the \sc{Dcel} data-structure is to represent +The main idea behind the \dcel data-structure is to represent each edge using a pair of directed halfedges, one going from the \f$ xy\f$-lexicographically smaller (left) endpoint of the curve toward its the \f$ xy\f$-lexicographically larger (right) endpoint, and the other, @@ -75,11 +75,11 @@ as it may have no area, or alternatively it may consist of several connected faces. Every face can have several holes contained in its interior (or no holes at all). In addition, every face may contain isolated vertices in its interior. See \cgalFigureRef{arr_figseg_dcel} -for an illustration of the various \sc{Dcel} features. For more details -on the \sc{Dcel} data structure see \cgalCite{bkos-cgaa-00} Chapter 2. +for an illustration of the various \dcel features. For more details +on the \dcel data structure see \cgalCite{bkos-cgaa-00} Chapter 2. \cgalFigureBegin{arr_figseg_dcel,arr_segs.png} -An arrangement of interior-disjoint line segments with some of the \sc{Dcel} records that represent it. The unbounded face \f$ f_0\f$ has a single connected component that forms a hole inside it, and this hole is comprised of several faces. The half-edge \f$ e\f$ is directed from its source vertex \f$ v_1\f$ to its target vertex \f$ v_2\f$. This edge, together with its twin \f$ e'\f$, correspond to a line segment that connects the points associated with \f$ v_1\f$ and \f$ v_2\f$ and separates the face \f$ f_1\f$ from \f$ f_2\f$. The predecessor \f$ e_{\rm prev}\f$ and successor \f$ e_{\rm next}\f$ of \f$ e\f$ are part of the chain that form the outer boundary of the face \f$ f_2\f$. The face \f$ f_1\f$ has a more complicated structure as it contains two holes in its interior: One hole consists of two adjacent faces \f$ f_3\f$ and \f$ f_4\f$, while the other hole is comprised of two edges. \f$ f_1\f$ also contains two isolated vertices \f$ u_1\f$ and \f$ u_2\f$ in its interior. +An arrangement of interior-disjoint line segments with some of the \dcel records that represent it. The unbounded face \f$ f_0\f$ has a single connected component that forms a hole inside it, and this hole is comprised of several faces. The half-edge \f$ e\f$ is directed from its source vertex \f$ v_1\f$ to its target vertex \f$ v_2\f$. This edge, together with its twin \f$ e'\f$, correspond to a line segment that connects the points associated with \f$ v_1\f$ and \f$ v_2\f$ and separates the face \f$ f_1\f$ from \f$ f_2\f$. The predecessor \f$ e_{\rm prev}\f$ and successor \f$ e_{\rm next}\f$ of \f$ e\f$ are part of the chain that form the outer boundary of the face \f$ f_2\f$. The face \f$ f_1\f$ has a more complicated structure as it contains two holes in its interior: One hole consists of two adjacent faces \f$ f_3\f$ and \f$ f_4\f$, while the other hole is comprised of two edges. \f$ f_1\f$ also contains two isolated vertices \f$ u_1\f$ and \f$ u_2\f$ in its interior. \cgalFigureEnd The \f$ x\f$-monotone curves of an arrangement are embedded in an @@ -110,7 +110,7 @@ to construct arrangements of different families of curves. In Section \ref arr_secnotif we review the notification mechanism that allows external classes to keep track of the changes that an arrangement instance goes through. Section \ref arr_secex_dcel -explains how to extend the \sc{Dcel} records, to store extra data +explains how to extend the \dcel records, to store extra data with them, and to efficiently update this data. In Section \ref arr_secoverlay we introduce the fundamental operation of overlaying two arrangements. @@ -127,7 +127,7 @@ the arrangement package. It is used to represent planar arrangements and it provides the interface needed to construct them, traverse them, and maintain them. An arrangement is defined by a geometric traits class that determines the family of planar -curves that form the arrangement, and a \sc{Dcel} class, which +curves that form the arrangement, and a \dcel class, which represents the topological structure of the planar subdivision. It supplies a minimal set of geometric operations (predicates and constructions) required to construct and maintain the arrangement @@ -159,7 +159,7 @@ parameters of the `Arrangement_2` template:
    • The `Dcel` template-parameter should be instantiated with a class that is a model of the `ArrangementDcel` concept. The value of this parameter is `Arr_default_dcel` by default. However, in - many applications it is necessary to extend the \sc{Dcel} features; + many applications it is necessary to extend the \dcel features; see Section \ref arr_secex_dcel for further explanations and examples.
    @@ -212,7 +212,7 @@ The simplest and most fundamental arrangement operations are the various traversal methods, which allow users to systematically go over the relevant features of the arrangement at hand. -As mentioned above, the arrangement is represented as a \sc{Dcel}, +As mentioned above, the arrangement is represented as a \dcel, which stores three containers of vertices, halfedges and faces. Thus, the `Arrangement_2` class supplies iterators for these containers. For example, the methods `vertices_begin()` and @@ -486,7 +486,7 @@ for more details and examples. \cgalFigureBegin{arr_figex_1,insert.png} - The various specialized insertion procedures. The inserted \f$ x\f$-monotone curve is drawn with a light dashed line, surrounded by two solid arrows that represent the pair of twin half-edges added to the \sc{Dcel}. Existing vertices are shown as black dots while new vertices are shown as light dots. Existing half-edges that are affected by the insertion operations are drawn as dashed arrows. (a) Inserting a curve as a new hole inside the face \f$ f\f$. (b) Inserting a curve from an existing vertex \f$ u\f$ that corresponds to one of its endpoints. (c) Inserting an \f$ x\f$-monotone curve whose endpoints are the already existing vertices \f$ u_1\f$ and \f$ u_2\f$. In our case, the new pair of half-edges close a new face \f$ f'\f$, where the hole \f$ h_1\f$, which used to belong to \f$ f\f$, now becomes an enclave in this new face. + The various specialized insertion procedures. The inserted \f$ x\f$-monotone curve is drawn with a light dashed line, surrounded by two solid arrows that represent the pair of twin half-edges added to the \dcel. Existing vertices are shown as black dots while new vertices are shown as light dots. Existing half-edges that are affected by the insertion operations are drawn as dashed arrows. (a) Inserting a curve as a new hole inside the face \f$ f\f$. (b) Inserting a curve from an existing vertex \f$ u\f$ that corresponds to one of its endpoints. (c) Inserting an \f$ x\f$-monotone curve whose endpoints are the already existing vertices \f$ u_1\f$ and \f$ u_2\f$. In our case, the new pair of half-edges close a new face \f$ f'\f$, where the hole \f$ h_1\f$, which used to belong to \f$ f\f$, now becomes an enclave in this new face. \cgalFigureEnd @@ -1349,7 +1349,7 @@ construct it from scratch. (ii) We have to insert \f$ m\f$ input curves to a non-empty arrangement `arr`. In the first case, we sweep over the input curves, compute -their intersection points and construct the \sc{Dcel} that represents +their intersection points and construct the \dcel that represents their planar arrangement. This process is performed in \f$ O\left((m + k)\log m\right)\f$ time, where \f$ k\f$ is the total number of intersection points. The running time is asymptotically better @@ -1567,7 +1567,7 @@ exists. This implied that collinearity indeed exists as explained above. \cgalAdvancedBegin \cgalFigureBegin{typenormal,unb_dcel.png} -A \sc{Dcel} representing an arrangement of four lines. Halfedges are drawn as thin arrows. The vertices \f$ v_1, \ldots, v_8\f$ lie at infinity, and are not associated with valid points. The halfedges that connect them are fictitious, and are not associated with concrete curves. The face denoted \f$ f_0\f$ (lightly shaded) is the fictitious "unbounded face" which lies outside the bounding rectangle (dashed) that bounds the actual arrangement. The four fictitious vertices \f$ v_{\rm bl}, v_{\rm tl}, v_{\rm br}\f$ and \f$ v_{\rm tr}\f$ represent the four corners of the bounding rectangle. +A \dcel representing an arrangement of four lines. Halfedges are drawn as thin arrows. The vertices \f$ v_1, \ldots, v_8\f$ lie at infinity, and are not associated with valid points. The halfedges that connect them are fictitious, and are not associated with concrete curves. The face denoted \f$ f_0\f$ (lightly shaded) is the fictitious "unbounded face" which lies outside the bounding rectangle (dashed) that bounds the actual arrangement. The four fictitious vertices \f$ v_{\rm bl}, v_{\rm tl}, v_{\rm br}\f$ and \f$ v_{\rm tr}\f$ represent the four corners of the bounding rectangle. \cgalFigureEnd @@ -1580,7 +1580,7 @@ finite curve endpoints and intersection points between curves in straightforward to compute the arrangement induced by this set. However, we would like to operate directly on the unbounded curves without having to preprocess them. Therefore, we use an implicit -bounding rectangle embedded in the \sc{Dcel} structure. +bounding rectangle embedded in the \dcel structure. \cgalFigureRef{arr_figunb_dcel} shows the arrangement of four lines that subdivide the plane into eight unbounded faces and two bounded ones. Notice that in this case the unbounded faces have outer @@ -1881,7 +1881,7 @@ of the `ArrangementXMonotoneTraits_2` concept. \subsection Arrangement_on_surface_2SupportingUnbounded Supporting Unbounded Curves An arrangement that supports unbounded \f$ x\f$-monotone curves maintains -an implicit bounding rectangle in the \sc{Dcel} structure; see +an implicit bounding rectangle in the \dcel structure; see Section \ref arr_ssecunb_rep. The unbounded ends of vertical rays, vertical lines, and curves with vertical asymptotes are represented by vertices that lie on the bottom or top sides of this bounding @@ -2840,7 +2840,7 @@ Geometric traits-class decorators allow you to attach auxiliary data to curves and to points. The data is automatically manipulated by the decorators and distributed to the constructed geometric entities. Note that additional information can alternatively be maintained by extending -the vertex, halfedge, or face types provided by the \sc{Dcel} class used +the vertex, halfedge, or face types provided by the \dcel class used by the arrangement; see the details in Section \ref arr_secex_dcel. The arrangement package includes a generic traits-class decorator @@ -3065,7 +3065,7 @@ depicted in \cgalFigureRef{arr_figex_19} : \cgalExample{Arrangement_on_surface_2/observer.cpp} -Observers are especially useful when the \sc{Dcel} records are +Observers are especially useful when the \dcel records are extended and store additional data, as they help updating this data on-line. See Section \ref arr_secex_dcel for more details and examples. @@ -3080,28 +3080,28 @@ objects and edges (halfedge pairs) are associated with it is possible to extend the traits-class type by using a traits-class decorator, as explained in Section \ref arr_ssecmeta_tr, which may be a sufficient solution for some applications. -However, the \sc{Dcel} faces are not associated with any geometric object, +However, the \dcel faces are not associated with any geometric object, so it is impossible to extend them using a traits-class decorator. -Extending the \sc{Dcel} face records comes handy is such cases. As a matter -of fact, it is possible to conveniently extend all \sc{Dcel} records +Extending the \dcel face records comes handy is such cases. As a matter +of fact, it is possible to conveniently extend all \dcel records (namely vertices, halfedges and faces), which can also be advantageous for some applications. All examples presented so far use the default `Arr_default_dcel`. This is done implicitly, as this class serves as a default parameter for -the `Arrangement_2` template. The default \sc{Dcel} class just associates +the `Arrangement_2` template. The default \dcel class just associates points with vertices and \f$ x\f$-monotone curves with halfedge, but nothing more. -In this section we show how to use alternative \sc{Dcel} types to extend the -desired \sc{Dcel} records. +In this section we show how to use alternative \dcel types to extend the +desired \dcel records. \subsection arr_ssecex_dcel_face Extending the DCEL Faces The `Arr_face_extended_dcel` class-template is used to associate auxiliary data field of type `FaceData` to -each face record in the \sc{Dcel}. +each face record in the \dcel. When an `Arrangement_2` object is parameterized by this -\sc{Dcel} class, its nested `Face` type is extended with the access function +\dcel class, its nested `Face` type is extended with the access function `data()` and with the modifier `set_data()`. Using these extra functions it is straightforward to access and maintain the auxiliary face-data field. @@ -3135,14 +3135,14 @@ segments:\cgalFootnote{For simplicity, the particular observer used must be atta The `Arr_extended_dcel` class-template is used to associate auxiliary data fields of types `VertexData` `HalfedgeData`, and `FaceData` to -each \sc{Dcel} vertex, halfedge, and face record types, respectively. +each \dcel vertex, halfedge, and face record types, respectively. When an `Arrangement_2` object is injected with this -\sc{Dcel} class, each one of its nested `Vertex`, `Halfedge` and +\dcel class, each one of its nested `Vertex`, `Halfedge` and `Face` classes is extended by the access function `data()` and by the modifier `set_data()`. -The next example shows how to use a \sc{Dcel} with extended vertex, +The next example shows how to use a \dcel with extended vertex, halfedge, and face records. In this example each vertex is associated with a color, which may be blue, red, or white, depending on whether the vertex is isolated, represents a segment endpoint, or whether it @@ -3161,11 +3161,11 @@ is copied to another arrangement instance: \cgalExample{Arrangement_on_surface_2/dcel_extension.cpp} \cgalAdvancedBegin -The various \sc{Dcel} classes presented in this section are perfectly +The various \dcel classes presented in this section are perfectly sufficient for most applications based on the arrangement package. -However, users may also use their own implementation of a \sc{Dcel} class +However, users may also use their own implementation of a \dcel class to instantiate the `Arrangement_2` class-template, in case they need -special functionality from their \sc{Dcel}. Such a class must be a model of the +special functionality from their \dcel. Such a class must be a model of the concept `ArrangementDcel`, whose exact specification is listed in the Reference Manual. \cgalAdvancedEnd @@ -3197,16 +3197,16 @@ types nested in geometry traits `Traits_R`. The same holds for all types nested in geometry traits `Traits_B`. The `ovl_traits` parameter is an instance of an overlay traits-class, which enables the creation of -`Dcel_R` records in the overlaid arrangement from the \sc{Dcel} features +`Dcel_R` records in the overlaid arrangement from the \dcel features of `arr_a` and `arr_b` that they correspond to. In principle, we distinguish between three levels of overlay:
    Simple overlay:
    An overlay of two arrangements that store no additional data -with their \sc{Dcel} records. That is, they are defined using the default -\sc{Dcel} class `Arr_default_dcel`. Typically, the overlaid -arrangement in this case stores no extra data with its \sc{Dcel} records as +with their \dcel records. That is, they are defined using the default +\dcel class `Arr_default_dcel`. Typically, the overlaid +arrangement in this case stores no extra data with its \dcel records as well (or if it does, the additional data fields cannot be computed by the overlay operation), so by overlaying the two arrangement we just compute the arrangement of all curves that induce `arr_a` and `arr_b`. @@ -3227,7 +3227,7 @@ the overlaid face. The `Arr_face_overlay_traits` class should be used as an overlay traits-class for face-overlay operations. It operates on arrangement, whose -\sc{Dcel} representation is based on the `Arr_face_extended_dcel` +\dcel representation is based on the `Arr_face_extended_dcel` class-template (see Section \ref arr_ssecex_dcel_face). The face-overlay traits-class is parameterized by a functor that is capable of combining two face-data fields of types `Dcel_A::Face_data` and @@ -3236,11 +3236,11 @@ object. The overlay traits-class uses this functor to properly construct the overlaid faces.
    Full overlay:
    An overlay of two arrangements that store additional data -fields with all their \sc{Dcel} records. That is, their \sc{Dcel} classes +fields with all their \dcel records. That is, their \dcel classes are instantiations of the `Arr_extended_dcel` class-template (see Section \ref arr_ssecex_dcel_all), where the resulting arrangement -also extends it \sc{Dcel} records with data fields computed on the basis -of the overlapping \sc{Dcel} features of the two input arrangements. +also extends it \dcel records with data fields computed on the basis +of the overlapping \dcel features of the two input arrangements.
    In the following subsections we give some examples for the simple and the @@ -3263,8 +3263,8 @@ The next program constructs two simple arrangements, as depicted in \subsection arr_ssecface_ovl Examples for a Face Overlay The following example shows how to compute the intersection of two polygons -using the `overlay()` function. It uses a face-extended \sc{Dcel} class -to define our arrangement class. The \sc{Dcel} extends each face with a Boolean +using the `overlay()` function. It uses a face-extended \dcel class +to define our arrangement class. The \dcel extends each face with a Boolean flag. A polygon is represented as a marked arrangement face, (whose flag is set). The example uses a face-overlay traits class, instantiated with a functor that simply performs a logical and operations on Boolean flags. @@ -3295,7 +3295,7 @@ when one constructs an arrangement induced by a set \f$ \cal C\f$ of arbitrary planar curves, she or he constructs a collection \f$ \cal C''\f$ of \f$ x\f$-monotone subcurves of \f$ \cal C\f$ that are pairwise disjoint in their interior, and these subcurves are associated with the arrangement edges (more precisely, with the -\sc{Dcel} halfedges). Doing so, the connection between the originating input +\dcel halfedges). Doing so, the connection between the originating input curves and the arrangement edges is lost. This loss might be acceptable for some applications. However, in many practical cases it is important to determine the input curves that give rise to the final subcurves. @@ -3308,8 +3308,8 @@ used for instantiating the template should be a model of the `ArrangementTraits_2` concept (see Section \ref arr_sssecinsert_gen). That is, it should define the `Curve_2` type (and not just the `X_monotone_curve_2` type). The `Dcel` parameter should model the -`ArrangementDcel` concept. Users can use the default \sc{Dcel} class or -an extended \sc{Dcel} class according to their needs. +`ArrangementDcel` concept. Users can use the default \dcel class or +an extended \dcel class according to their needs. \subsection arr_ssecarrwh_traverse Traversing an Arrangement with History @@ -3362,7 +3362,7 @@ instantiated by the same traits class. In this case, the resulting arrangement will store a consolidated container of input curves, and automatically preserve the cross-mapping between the arrangement edges and the consolidated curve set. Users can employ an overlay-traits class -to maintain any type of auxiliary data stored with the \sc{Dcel} features +to maintain any type of auxiliary data stored with the \dcel features (see Section \ref arr_secoverlay). \subsection arr_ssecmodif_traverse Modifying an Arrangement with History @@ -3503,7 +3503,7 @@ the arrangement features. Thus, they are ideal for arrangements instantiated using the `Arr_default_dcel` class. However, as explained in Section \ref arr_secex_dcel, one can easily extend the arrangement faces by using the `Arr_face_extended_dcel` -template, or extend all \sc{Dcel} records by using the `Arr_extended_dcel` +template, or extend all \dcel records by using the `Arr_extended_dcel` template. In such cases, it might be crucial that the auxiliary data fields are written to the file and read from there. @@ -3520,13 +3520,13 @@ auxiliary data that may be associated with the arrangement features. This is the default formatter used by the arrangement inserter and the arrangement extractor, as defined above.
  • `Arr_face_extended_text_formatter` operates on -arrangements whose \sc{Dcel} representation is based on the +arrangements whose \dcel representation is based on the `Arr_face_extended_dcel` class (see Section \ref arr_ssecex_dcel_face). It supports reading and writing the auxiliary data objects stored with the arrangement faces provided that the `FaceData` class supports an inserter and an extractor.
  • `Arr_extended_dcel_text_formatter` operates on -arrangements whose \sc{Dcel} representation is based on the +arrangements whose \dcel representation is based on the `Arr_extended_dcel` class (see Section \ref arr_ssecex_dcel_all). It supports reading and writing the auxiliary data objects stored with the arrangement vertices, edges @@ -3599,10 +3599,10 @@ the graph algorithms implemented in the bgl to `Arra An instance of `Arrangement_2` is adapted to a Boost graph through the provision of a set of free functions that operate on the arrangement features and conform with the relevant BGL concepts. Besides the straightforward -adaptation, which associates a vertex with each \sc{Dcel} vertex and an edge -with each \sc{Dcel} halfedge, the package also offer a dual adaptor, which -associates a graph vertex with each \sc{Dcel} face, such that two vertices are -connected, iff there is a \sc{Dcel} halfedge that connects the two corresponding +adaptation, which associates a vertex with each \dcel vertex and an edge +with each \dcel halfedge, the package also offer a dual adaptor, which +associates a graph vertex with each \dcel face, such that two vertices are +connected, iff there is a \dcel halfedge that connects the two corresponding faces. \subsection arr_ssecbgl_primal The Primal Arrangement Representation @@ -3706,7 +3706,7 @@ used for associating arbitrary data with the arrangement faces. In the following example we construct the same arrangement as in example `bgl_primal_adapter.cpp` (see \cgalFigureRef{arr_figex_bgl}), and perform breadth-first search on the graph faces, starting from the -unbounded face. We extend the \sc{Dcel} faces +unbounded face. We extend the \dcel faces with an unsigned integer, marking the discover time of the face using `boost` visitors and a property-map class that directly accesses the extended data of the faces: @@ -3728,7 +3728,7 @@ of the general ones; e.g., `insert()`.
  • When the curves to be inserted into an arrangement are segments that are pairwise disjoint in their interior, it is more efficient to use -the traits class `Arr_non_caching_segment_traits_2` rather then +the traits class `Arr_non_caching_segment_traits_2` rather than the default one (`Arr_segment_traits_2`). If the segments may intersect each other, the default traits class @@ -3751,7 +3751,7 @@ arrangement. The specialized insertion functions, i.e., can be used according to the available information. These functions hardly involve any geometric operations, if at all. They accept topologically related parameters, and use them to operate directly on -the \sc{Dcel} records, thus saving algebraic operations, which are +the \dcel records, thus saving algebraic operations, which are especially expensive when high-degree curves are involved. A polygon, represented by a list of segments along its boundary, can 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 16788a94596..99d4f50fbf4 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 @@ -408,7 +408,7 @@ namespace CGAL { size_type number_of_subcurves() const; /*! Obtain the \f$ k\f$th subcurve of the polycurve. - * \pre \f$k\f$ is not greater then or equal to \f$n-1\f$, where + * \pre \f$k\f$ is not greater than or equal to \f$n-1\f$, where * \f$n\f$ is the number of subcurves. */ typename SubcurveTraits_2::X_monotone_curve_2 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 1db0e105e69..e1cddea3f38 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 @@ -61,7 +61,7 @@ int main() // but not for this instance for(size_t i = 0; i < pre_segs.size(); ++i) { auto* curr_p = boost::get(&pre_segs[i]);; - CGAL_assertion(curr_p); + CGAL_assertion(curr_p != nullptr); segs.push_back(*curr_p); } // Construct an ellipse with equation 2*x^2+5*y^2-7=0 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 db91adb57cf..e913bc9f7db 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 @@ -159,11 +159,11 @@ namespace CGAL { { return CK_Equal_2()(a0, a1); } result_type - operator() ( const Line_arc_2 &a0, const Circular_arc_2 &a1) const + operator() ( const Line_arc_2 &/*a0*/, const Circular_arc_2 &/*a1*/) const { return false; } result_type - operator() ( const Circular_arc_2 &a0, const Line_arc_2 &a1) const + operator() ( const Circular_arc_2 &/*a0*/, const Line_arc_2 &/*a1*/) const { return false; } result_type 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 16a15d7ea56..790600b274e 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_dcel_base.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_dcel_base.h @@ -479,7 +479,18 @@ public: const Inner_ccb* inner_ccb() const { CGAL_precondition(is_on_inner_ccb()); - return (reinterpret_cast(_clean_pointer(this->p_comp))); + + const Inner_ccb* out = reinterpret_cast(_clean_pointer(this->p_comp)); + if (out->is_valid()) + return out; + + // else reduce path and get valid iccb + const Inner_ccb* valid = out->next(); + while (!valid->is_valid()) + valid = valid->next(); + const_cast(out)->set_next(const_cast(valid)); + const_cast(this)->set_inner_ccb(valid); + return valid; } /*! Get an incident inner CCB (non-const version). @@ -488,11 +499,28 @@ public: Inner_ccb* inner_ccb() { CGAL_precondition(is_on_inner_ccb()); - return (reinterpret_cast(_clean_pointer(this->p_comp))); + + Inner_ccb* out = reinterpret_cast(_clean_pointer(this->p_comp)); + if (out->is_valid()) + return out; + + // else reduce path and get valid iccb + Inner_ccb* valid = out->next(); + while (!valid->is_valid()) + valid = valid->next(); + out->set_next(valid); + set_inner_ccb(valid); + return valid; + } + + Inner_ccb* inner_ccb_no_redirect() + { + CGAL_precondition(is_on_inner_ccb()); + return reinterpret_cast(_clean_pointer(this->p_comp)); } /*! Set the incident inner CCB. */ - void set_inner_ccb(Inner_ccb *ic) + void set_inner_ccb(const Inner_ccb *ic) { // Set the component pointer and set its LSB. this->p_comp = _set_lsb(ic); @@ -769,57 +797,111 @@ public: typedef typename Face::Inner_ccb_iterator Inner_ccb_iterator; private: - Face* p_f; // The face the contains the CCB in its interior. + union + { + Face* f; // The face the contains the CCB in its interior. + Arr_inner_ccb* icc; // next inner CCB in chain to valid icc + } f_or_icc; Inner_ccb_iterator iter; // The inner CCB identifier. - bool iter_is_not_singular; + enum + { + ITER_IS_SINGULAR, // singular = default iterator, not initialized + ITER_IS_NOT_SINGULAR, // not singular = iterator was assigned and is valid + INVALID // invalid = the inner CCB is invalid and + // only links to another inner CCB + // in chain to valid CCB + } status; public: /*! Default constructor. */ - Arr_inner_ccb() : p_f(nullptr), iter_is_not_singular(false) {} + Arr_inner_ccb() : status(ITER_IS_SINGULAR) { f_or_icc.f = nullptr; } /*! Copy constructor. */ Arr_inner_ccb(const Arr_inner_ccb& other) : - p_f(other.p_f), iter_is_not_singular(other.iter_is_not_singular) - { if (other.iter_is_not_singular) iter = other.iter; } + f_or_icc(other.f_or_icc), status(other.status) + { if (other.status == ITER_IS_NOT_SINGULAR) iter = other.iter; } /*! Get a halfedge along the component (const version). */ - const Halfedge* halfedge() const { return (*iter); } + const Halfedge* halfedge() const + { + CGAL_assertion (is_valid()); + return (*iter); + } /*! Get a halfedge along the component (non-const version). */ - Halfedge* halfedge() { return (*iter); } + Halfedge* halfedge() + { + CGAL_assertion (is_valid()); + return (*iter); + } /*! Set a representative halfedge for the component. */ - void set_halfedge(Halfedge *he) { *iter = he; } + void set_halfedge(Halfedge *he) + { + CGAL_assertion (is_valid()); + *iter = he; + } /*! Get the incident face (const version). */ - const Face* face() const { return (p_f); } + const Face* face() const + { + CGAL_assertion (status != INVALID); + return f_or_icc.f; + } /*! Get the incident face (non-const version). */ - Face* face() { return (p_f); } + Face* face() + { + CGAL_assertion (status != INVALID); + return f_or_icc.f; + } /*! Set the incident face. */ - void set_face(Face* f) { p_f = f; } + void set_face(Face* f) + { + CGAL_assertion (status != INVALID); + f_or_icc.f = f; + } /*! Get the iterator (const version). */ Inner_ccb_iterator iterator() const { - CGAL_assertion(iter_is_not_singular); + CGAL_assertion(status == ITER_IS_NOT_SINGULAR); return (iter); } /*! Get the iterator (non-const version). */ Inner_ccb_iterator iterator() { - CGAL_assertion(iter_is_not_singular); + CGAL_assertion(status == ITER_IS_NOT_SINGULAR); return (iter); } /*! Set the inner CCB iterator. */ void set_iterator(Inner_ccb_iterator it) { + CGAL_assertion (is_valid()); iter = it; - iter_is_not_singular = true; + status = ITER_IS_NOT_SINGULAR; } + + /*! Check validity */ + bool is_valid() const { return (status != INVALID); } + + /*! Get the next CCB to primary chain. */ + Arr_inner_ccb* next() const + { + CGAL_assertion (status == INVALID); + return f_or_icc.icc; + } + + /*! Set the next CCB to primary chain. */ + void set_next(Arr_inner_ccb* next) + { + status = INVALID; + f_or_icc.icc = next; + } + }; /*! \class @@ -943,6 +1025,7 @@ public: typedef typename Face_list::iterator Face_iterator; typedef CGAL::N_step_adaptor_derived Edge_iterator; + typedef typename Inner_ccb_list::iterator Inner_ccb_iterator; // Definitions of const iterators. typedef typename Vertex_list::const_iterator Vertex_const_iterator; @@ -1019,6 +1102,9 @@ public: { return make_prevent_deref_range(edges_begin(), edges_end()); } + + Inner_ccb_iterator inner_ccbs_begin() { return in_ccbs.begin(); } + Inner_ccb_iterator inner_ccbs_end() { return in_ccbs.end(); } //@} /// \name Obtaining constant iterators. 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 393958f3424..285faa4c183 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h @@ -168,7 +168,7 @@ overlay(const Arrangement_on_surface_2& arr1 typedef Arrangement_on_surface_2 Arr_res; typedef typename Arr_res::Allocator Allocator; - // some type assertions (not all, but better then nothing). + // some type assertions (not all, but better than nothing). #if !defined(CGAL_NO_ASSERTIONS) typedef typename Agt2::Point_2 A_point; typedef typename Bgt2::Point_2 B_point; 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 7b714c12412..68dcb87a486 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 @@ -2741,14 +2741,24 @@ _insert_at_vertices(DHalfedge* he_to, he1->set_inner_ccb(ic1); he2->set_inner_ccb(ic1); - // Make all halfedges along ic2 to point to ic1. - DHalfedge* curr; + if (m_sweep_mode) + { + // Inner CCB are obtained using Halfedge::inner_ccb() which + // performs path reduction and always return valid iCCB + CGAL_assertion(ic1->is_valid()); + CGAL_assertion(ic2->is_valid()); + ic2->set_next(ic1); + } + else + { + // Make all halfedges along ic2 to point to ic1. + DHalfedge* curr; + for (curr = he2->next(); curr != he1; curr = curr->next()) + curr->set_inner_ccb(ic1); - for (curr = he2->next(); curr != he1; curr = curr->next()) - curr->set_inner_ccb(ic1); - - // Delete the redundant inner CCB. - _dcel().delete_inner_ccb(ic2); + // Delete the redundant inner CCB. + _dcel().delete_inner_ccb(ic2); + } // Notify the observers that we have merged the two inner CCBs. _notify_after_merge_inner_ccb(fh, (Halfedge_handle(he1))->ccb()); @@ -4042,7 +4052,7 @@ _defines_outer_ccb_of_new_face(const DHalfedge* he_to, // - No smallest has bin recorded so far, or // - The current target vertex and the recorded vertex are the same and // * The current curve is smaller than the recorded curve, or - // - The current curve end is smaller then the recorded curve end. + // - The current curve end is smaller than the recorded curve end. // smaller than its source, so we should check whether it is also smaller // Note that we compare the vertices lexicographically: first by the // indices, then by x, then by y. 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 fd441863314..4b868f09b2d 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 @@ -911,6 +911,14 @@ protected: bool m_own_traits; // inidicates whether the geometry // traits should be freed up. + bool m_sweep_mode = false; + // sweep mode efficiently + // merges inner CCB but + // keeps invalid inner CCB + // and memory overhead that + // should be cleaned + // afterwards + public: /// \name Constructors. //@{ @@ -941,6 +949,9 @@ public: /*! Destructor. */ virtual ~Arrangement_on_surface_2(); + /*! Change mode. */ + void set_sweep_mode (bool mode) { m_sweep_mode = mode; } + /*! Clear the arrangement. */ virtual void clear(); //@} @@ -1518,6 +1529,39 @@ public: //@} + /*! + * Cleans the inner CCB if sweep mode was used, by removing all + * non-valid inner CCBs + */ + void clean_inner_ccbs_after_sweep() + { + for (DHalfedge_iter he = _dcel().halfedges_begin(); + he != _dcel().halfedges_end(); ++ he) + { + if (!he->is_on_inner_ccb()) + continue; + + DInner_ccb* ic1 = he->inner_ccb_no_redirect(); + if (ic1->is_valid()) + continue; + + // Calling Halfedge::inner_ccb() reduces the path and makes the + // halfedge point to a correct CCB + DInner_ccb* ic2 = he->inner_ccb(); + CGAL_USE(ic2); + CGAL_assertion (ic2->halfedge()->is_on_inner_ccb() + && ic2->halfedge()->inner_ccb_no_redirect() == ic2); + } + + typename Dcel::Inner_ccb_iterator it = _dcel().inner_ccbs_begin(); + while (it != _dcel().inner_ccbs_end()) + { + typename Dcel::Inner_ccb_iterator current = it ++; + if (!current->is_valid()) + _dcel().delete_inner_ccb(&*current); + } + } + protected: /// \name Determining the boundary-side conditions. //@{ diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_internals.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_internals.h index 984ea6170a6..47afb1f2f68 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_internals.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_internals.h @@ -295,13 +295,6 @@ public: return y; } - //! \brief the same as \c evaluate but arguments are passed by value - //! (needed to substitute variables in bivariate polynomial) - inline static NT binded_eval(Poly_1 poly, NT x) - { - return evaluate(poly, x); - } - //! \brief evalutates a polynomial at certain x-coordinate static NT evaluate(const Poly_1& poly, const NT& x, bool *error_bounds_ = nullptr) @@ -913,10 +906,9 @@ void get_precached_poly(int var, const NT& key, int /* level */, Poly_1& poly) // } if(not_cached||not_found) { - poly = Poly_1(::boost::make_transform_iterator(coeffs->begin(), - boost::bind2nd(std::ptr_fun(binded_eval), key1)), - ::boost::make_transform_iterator(coeffs->end(), - boost::bind2nd(std::ptr_fun(binded_eval), key1))); + auto fn = [&key1](const Poly_1& poly){ return evaluate(poly, key1); }; + poly = Poly_1(::boost::make_transform_iterator(coeffs->begin(), fn), + ::boost::make_transform_iterator(coeffs->end(), fn)); if(not_cached) return; // all available space consumed: drop the least recently used entry diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h index 752389a0f35..56595cd3835 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h @@ -16,7 +16,6 @@ #include #include -#include /*! \file CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h * \brief @@ -107,11 +106,13 @@ struct Transform { template OutputPoly_2 operator()(const CGAL::Polynomial& p, Op op = Op()) const { - - Transform tr; + typedef typename InputPoly_2::NT NT_in; + typedef typename OutputPoly_2::NT NT_out; + Transform tr; + auto fn = [&op, &tr](const NT_in& v){ return tr(v, op); }; return OutputPoly_2( - ::boost::make_transform_iterator(p.begin(), boost::bind2nd(tr, op)), - ::boost::make_transform_iterator(p.end(), boost::bind2nd(tr, op))); + ::boost::make_transform_iterator(p.begin(), fn), + ::boost::make_transform_iterator(p.end(), fn)); } OutputPoly_2 operator()( diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_construction_ss_visitor.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_construction_ss_visitor.h index c8c9b9b57f0..1e3544ec566 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_construction_ss_visitor.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_construction_ss_visitor.h @@ -142,6 +142,9 @@ public: /* A notification issued before the sweep process starts. */ inline void before_sweep(); + /* A notification issued after the sweep process stops. */ + inline void after_sweep(); + /*! * A notification invoked before the sweep-line starts handling the given * event. @@ -267,7 +270,21 @@ private: // Notifies the helper that the sweep process now starts. template void Arr_construction_ss_visitor::before_sweep() -{ m_helper.before_sweep(); } +{ + m_helper.before_sweep(); + m_arr->set_sweep_mode(true); +} + + +//----------------------------------------------------------------------------- +// A notification issued after the sweep process stops. +template +void Arr_construction_ss_visitor::after_sweep() +{ + m_arr->clean_inner_ccbs_after_sweep(); + m_arr->set_sweep_mode(false); +} + //----------------------------------------------------------------------------- // A notification invoked before the sweep-line starts handling the given 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 f9f697a3b40..8fbcc861d5f 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 @@ -552,6 +552,8 @@ Arr_overlay_ss_visitor::update_event(Event* e, template void Arr_overlay_ss_visitor::after_sweep() { + Base::after_sweep(); + // Notify boundary vertices: typename Vertex_map::iterator it; for (it = m_vertices_map.begin(); it != m_vertices_map.end(); ++it) { 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 bc3f1b89e7a..8490bea5ce7 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 @@ -9,20 +9,6 @@ enable_testing() find_package(CGAL REQUIRED COMPONENTS Core) include(${CGAL_USE_FILE}) - -if(COMMAND target_compile_options) - # 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) -else() - # If CMake version is <= 2.8.11, use the usual CMake script. - - # create a target per cppfile - file( - GLOB cppfiles - RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) - foreach(cppfile ${cppfiles}) - create_single_source_cgal_program("${cppfile}") - endforeach() -endif() +# 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/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 d6ae0f045bb..20a279a59fd 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 @@ -1424,3 +1424,9 @@ compile_and_run(test_io) compile_and_run(test_sgm) compile_and_run(test_polycurve_intersection) +if(CGAL_DISABLE_GMP) + get_directory_property(LIST_OF_TESTS TESTS) + foreach(_test ${LIST_OF_TESTS}) + set_property(TEST ${_test} APPEND PROPERTY ENVIRONMENT CGAL_DISABLE_GMP=1) + endforeach() +endif() 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 c1183a846d8..2b9a9aee225 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 @@ -129,22 +129,36 @@ configure() { echo "Configuring... " rm -rf CMakeCache.txt CMakeFiles/ - echo "cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \ - -DCGAL_DIR=\"$CGAL_DIR\" \ - -DCGAL_CXX_FLAGS:STRING=\"$TESTSUITE_CXXFLAGS -I../../include\" \ - -DCGAL_EXE_LINKER_FLAGS=\"$TESTSUITE_LDFLAGS\" \ - -DCMAKE_BUILD_TYPE=NOTFOUND \ - ." - if eval 'cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \ - -DCGAL_DIR="$CGAL_DIR" \ - -DCGAL_CXX_FLAGS:STRING="$TESTSUITE_CXXFLAGS -I../../include" \ - -DCGAL_EXE_LINKER_FLAGS="$TESTSUITE_LDFLAGS" \ - -DCMAKE_BUILD_TYPE=NOTFOUND \ - .' ; then + if [ -f "$INIT_FILE" ] + then + if eval 'cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \ + -DCGAL_DIR="$CGAL_DIR" \ + -DCGAL_CXX_FLAGS:STRING="$CGAL_CXX_FLAGS $TESTSUITE_CXXFLAGS -I../../include" \ + -DCGAL_EXE_LINKER_FLAGS="$CGAL_EXE_LINKER_FLAGS $TESTSUITE_LDFLAGS" \ + .' ; then - echo " successful configuration" >> $ERRORFILE + echo " successful configuration" >> $ERRORFILE + else + echo " ERROR: configuration" >> $ERRORFILE + fi else - echo " ERROR: configuration" >> $ERRORFILE + echo "cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \ + -DCGAL_DIR=\"$CGAL_DIR\" \ + -DCGAL_CXX_FLAGS:STRING=\"$TESTSUITE_CXXFLAGS -I../../include\" \ + -DCGAL_EXE_LINKER_FLAGS=\"$TESTSUITE_LDFLAGS\" \ + -DCMAKE_BUILD_TYPE=NOTFOUND \ + ." + if eval 'cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \ + -DCGAL_DIR="$CGAL_DIR" \ + -DCGAL_CXX_FLAGS:STRING="$TESTSUITE_CXXFLAGS -I../../include" \ + -DCGAL_EXE_LINKER_FLAGS="$TESTSUITE_LDFLAGS" \ + -DCMAKE_BUILD_TYPE=NOTFOUND \ + .' ; then + + echo " successful configuration" >> $ERRORFILE + else + echo " ERROR: configuration" >> $ERRORFILE + fi fi } 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 5cfd7a64f2e..7e3bfe81659 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 @@ -3,7 +3,7 @@ #include #include -#include +#include #include diff --git a/BGL/doc/BGL/BGL.txt b/BGL/doc/BGL/BGL.txt index 130bb0444e5..e03f3304e30 100644 --- a/BGL/doc/BGL/BGL.txt +++ b/BGL/doc/BGL/BGL.txt @@ -16,9 +16,9 @@ faces as edges of the dual graph. The scope of \cgal is geometry and not graph algorithms. Nevertheless, this package provides the necessary classes and functions that enable using the algorithms of the Boost Graph Library \cgalCite{cgal:sll-bgl-02} -(\sc{Bgl} for short) with \cgal data structures. +(\bgl for short) with \cgal data structures. -Furthermore, this package extends the \sc{Bgl} +Furthermore, this package extends the \bgl by introducing concepts such as `HalfedgeGraph` and `FaceGraph` allowing to handle *halfedges* and *faces*. These concepts reflect the design of the halfedge data structure described @@ -26,7 +26,7 @@ in Chapter \ref PkgHalfedgeDS, with opposite halfedges and circular sequences of halfedges around vertices and around faces. This chapter is organized as follows: -- The first section, Section \ref BGLA, summarizes the main ideas of the \sc{Bgl}. +- The first section, Section \ref BGLA, summarizes the main ideas of the \bgl. - Section \ref BGLHeader then explains where to find header files and the chosen naming conventions, as we blend two different libraries. - The four following sections give examples on how to use CGAL graph and mesh data structures @@ -34,13 +34,13 @@ such as \link PkgSurfaceMesh Surface_mesh \endlink, \link PkgPolyhedron Polyhedron \endlink, \link PkgArrangementOnSurface2 Arrangement_2 \endlink, and the -\link PkgTriangulation2 2D triangulation \endlink classes as models of the \sc{Bgl} concepts. +\link PkgTriangulation2 2D triangulation \endlink classes as models of the \bgl concepts. - Starting with Section \ref BGLExtensions, we introduce new graph concepts, classes, -and functions that extend the functionalities of the \sc{Bgl}. +and functions that extend the functionalities of the \bgl. \section BGLA A Short Introduction to the Boost Graph Library -The algorithms of the \sc{Bgl} operate on models of various graph concepts. +The algorithms of the \bgl operate on models of various graph concepts. The traits class `boost::graph_traits` enable algorithms to determine the types of vertices and edges (similar to `std::iterator_traits` for iterators). Free functions that operate on graphs enable algorithms to obtain, @@ -53,7 +53,7 @@ arbitrary order. \subsection BGLGraphConcepts Graph Concepts -The \sc{Bgl} introduces several graph concepts, +The \bgl introduces several graph concepts, which have different sets of characteristics and requirements. For example, iterating through all vertices or all edges in a graph, obtaining the outgoing or in-going edges of a vertex, inserting vertices and edges into a graph, @@ -101,16 +101,16 @@ std::pair vertices(const Graph& g); \subsection BGLPropertyMaps Property Maps -Another feature extensively used in the \sc{Bgl} is the *property map*, +Another feature extensively used in the \bgl is the *property map*, which is offered by the Boost Property Map Library. Property maps are a general purpose interface for mapping key objects to corresponding value objects. -The \sc{Bgl} uses property maps to associate information with vertices and edges. +The \bgl uses property maps to associate information with vertices and edges. This mechanism uses a traits class (`boost::property_traits`) and free functions to read (`get`) and write (`put`) information in vertices, edges, and also in halfedges and faces for models of the \cgal graph concepts. -For example, the \sc{Bgl} +For example, the \bgl Dijksta's shortest path algorithm writes the predecessor of each vertex, as well as the distance to the source in such a property map. @@ -138,14 +138,14 @@ Examples of such event points in graph algorithms are when a vertex is traversed or when all outgoing edges of a vertex have been traversed.
    See also Section Visitor Concepts -in the \sc{Bgl} manual. +in the \bgl manual. \subsection BGLNamedParameters Named Parameters -The notion of named parameters was introduced in the \sc{Bgl}, +The notion of named parameters was introduced in the \bgl, and allow the user to specify only those parameters which are really needed, by name, making the parameter ordering unimportant. See also this page -in the manual of the \sc{Bgl} for more information. +in the manual of the \bgl for more information. Say there is a function `f()` that takes 3 parameters called name, age and gender, and you have variables `n`, `a` and `g` to pass as parameters to that function. @@ -186,32 +186,32 @@ refine(pmesh, \section BGLHeader Header Files, Namespaces, and Naming Conventions This package provides the necessary classes and functions that enable using -\cgal data structures as models of the \sc{Bgl} graph concepts. +\cgal data structures as models of the \bgl graph concepts. To this end, we offer partial specializations of the `boost::graph_traits` for various \cgal packages. For each such package, denoted `PACKAGE`, the partial specializations live in the namespace `boost` and are located in the header file `CGAL/boost/graph/graph_traits_PACKAGE.h`. Free functions are in the namespace `CGAL`, and the compiler uses argument-dependent lookup to find them. %Euler operations, described in Section \ref BGLEulerOperations, are in the namespace `CGAL::Euler`, as the function `remove_face()` is at the same time a low-level and an %Euler operation. -Concerning the naming conventions, we have to use those of the \sc{Bgl}, -as to fulfill the requirements of the concepts defined in the \sc{Bgl}. +Concerning the naming conventions, we have to use those of the \bgl, +as to fulfill the requirements of the concepts defined in the \bgl. Note that these partial specializations are often providing more than is required, making these classes not only models of the graph concepts -of the \sc{Bgl}, but also models of the CGAL graph concepts, that will be +of the \bgl, but also models of the CGAL graph concepts, that will be described in detail in Section \ref BGLExtensions. Correspondence tables -between the types of a \cgal data structure and their \sc{Bgl} equivalents +between the types of a \cgal data structure and their \bgl equivalents can be found in the \ref PkgBGLTraits documentation page. We present in the following sections some examples of utilization of some -\cgal data structures as \sc{Bgl} graphs. +\cgal data structures as \bgl graphs. \section BGLSurface_mesh The Class Surface_mesh as Model of the Boost Graph Concept -The class `Surface_mesh` is a model of most of the graph concepts of the \sc{Bgl} +The class `Surface_mesh` is a model of most of the graph concepts of the \bgl as well as the concepts provided by \cgal. A complete list can be found in the documentation of \link BGLSMGT boost::graph_traits \endlink. -The examples show how to use some of the \sc{Bgl} algorithms with `Surface_mesh` and show how to use +The examples show how to use some of the \bgl algorithms with `Surface_mesh` and show how to use the concepts provided by \cgal to implement a simple algorithm. \subsection BGLExampleMinimumSpanningTreeofaSurfaceMesh Example: Minimum Spanning Tree of a Surface_mesh @@ -221,16 +221,16 @@ More examples can be found in Chapters \ref PkgSurfaceMeshSimplification, \ref PkgSurfaceMeshSegmentation, and \ref PkgSurfaceMeshDeformation. The surface mesh class uses integer indices to address vertices and edges, -and it comes with a built-in property mechanism that maps nicely on the \sc{Bgl}. +and it comes with a built-in property mechanism that maps nicely on the \bgl. \cgalExample{BGL_surface_mesh/prim.cpp} \section BGLPolyhedral The Class Polyhedron_3 as Model of the Boost Graph Concept -The class `Polyhedron_3` is a model of most of the graph concepts of the \sc{Bgl} +The class `Polyhedron_3` is a model of most of the graph concepts of the \bgl as well as the concepts provided by \cgal. A complete list can be found in the documentation of \link BGLPolyGT boost::graph_traits \endlink. -The examples show how to use some of the \sc{Bgl} algorithms with `Polyhedron_3` and show how to use +The examples show how to use some of the \bgl algorithms with `Polyhedron_3` and show how to use the concepts provided by \cgal to implement a simple algorithm. \subsection BGLExampleMinimumSpanningTreeofaPolyhedral Example: Minimum Spanning Tree of a Polyhedral Surface @@ -243,7 +243,7 @@ More examples can be found in the Chapter \subsection BGLExampleUsingVerticesandEdgeswithanID Example: Using Vertices, and Edges with an ID -The following example program shows a call to the \sc{Bgl} +The following example program shows a call to the \bgl Kruskal's minimum spanning tree algorithm accessing the `id()` field stored in a polyhedron vertex. @@ -275,7 +275,7 @@ integers in the range `[0, t.number_of_vertices())`. \subsection BGLExampleStoringtheVertexIDintheVertex Example: Storing the Vertex ID in the Vertex -The algorithms of the \sc{Bgl} extensively use of the indices of +The algorithms of the \bgl extensively use of the indices of vertices. In the previous example we stored the indices in a `std::map` and turned that map in a property map. This property map was then passed as argument to the shortest path function. @@ -316,7 +316,7 @@ edges in our boost graph. Given an `Arrangement_2` instance, we can efficiently traverse its vertices and halfedges. Thus, the arrangement graph is a model of the concepts -`VertexListGraph` and `EdgeListGraph` introduced by the \sc{Bgl}. +`VertexListGraph` and `EdgeListGraph` introduced by the \bgl. At the same time, we use an iterator adapter of the circulator over the halfedges incident to a vertex (`Halfedge_around_target_circulator` - see Section \ref arr_sssectr_vertex "Traversal Methods for an Arrangement Vertex" @@ -327,11 +327,11 @@ is a model of the concept `BidirectionalGraph` (this concept refines It is important to notice that the vertex descriptors we use are `Vertex_handle` objects and not vertex indices. However, in order -to gain more efficiency in most \sc{Bgl} algorithm, it is better to have them +to gain more efficiency in most \bgl algorithm, it is better to have them indexed \f$ 0, 1, \ldots, (n-1)\f$, where \f$ n\f$ is the number of vertices. We therefore introduce the `Arr_vertex_index_map` class-template, which maintains a mapping of vertex handles to indices, as required by the -\sc{Bgl}. An instance of this class must be attached to a valid arrangement +\bgl. An instance of this class must be attached to a valid arrangement vertex when it is created. It uses the notification mechanism (see Section \ref arr_secnotif) to automatically maintain the mapping of vertices to indices, even when new vertices are inserted into the arrangement or @@ -340,7 +340,7 @@ existing vertices are removed. A complete description of the types correspondences can be found in the documentation of \link BGLArgtGT boost::graph_traits \endlink. -In most algorithm provided by the \sc{Bgl}, the output is given by +In most algorithm provided by the \bgl, the output is given by property maps, such that each map entry corresponds to a vertex. For example, when we compute the shortest paths from a given source vertex \f$ s\f$ to all other vertices we can obtain a map of distances and a map of @@ -353,7 +353,7 @@ template allows for an efficient mapping of `Vertex_handle` objects to properties of type `Type`. Note however that unlike the `Arr_vertex_index_map` class, the vertex property-map class is not kept synchronized with the number of vertices in the arrangement, so it -should not be reused in calls to the \sc{Bgl} functions in case the arrangement +should not be reused in calls to the \bgl functions in case the arrangement is modified in between these calls. \cgalFigureBegin{figex_bgl,ex_bgl.png} @@ -362,7 +362,7 @@ An arrangement of 7 line segments, as constructed by `ex_bgl_primal_adapter.cpp` In the following example we construct an arrangement of 7 line segments, as shown in \cgalFigureRef{figex_bgl}, -then use the \sc{Bgl} Dijkstra's shortest-paths algorithm to compute +then use the \bgl Dijkstra's shortest-paths algorithm to compute the graph distance of all vertices from the leftmost vertex in the arrangement \f$ v_0\f$. Note the usage of the `Arr_vertex_index_map` and the `Arr_vertex_property_map` classes. The latter one, instantiated by @@ -400,7 +400,7 @@ data with the arrangement faces. In the following example we construct the same arrangement as in example `ex_bgl_primal_adapter.cpp` (see \cgalFigureRef{arr_figex_bgl}), and perform breadth-first search on the graph faces, starting from the -unbounded face. We extend the \sc{Dcel} faces +unbounded face. We extend the \dcel faces with an unsigned integer, marking the discover time of the face and use a breadth-first-search visitor to obtain these times and update the faces accordingly: @@ -411,9 +411,9 @@ accordingly: The previous sections introduced partial specializations and free functions so that several \cgal data structures are adapted as models of some -of the \sc{Bgl} graph concepts. +of the \bgl graph concepts. In this section, we introduce new concepts, iterators, and property maps inspired -by the functionalities of the \sc{Bgl}. +by the functionalities of the \bgl. \subsection BGLExtensionsGraphConcepts Graph concepts @@ -485,7 +485,7 @@ stored in the vertex record.) \subsubsection BGLExampleNormalHalfedgeGraph Example: Calculating Facet Normals using HalfedgeGraph The following example program shows a simple algorithm for calculating -facet normals for a polyhedron using the \sc{Bgl} API. A +facet normals for a polyhedron using the \bgl API. A boost::vector_property_map is used to to store the calculated normals instead of changing the Polyhedron items class. @@ -579,13 +579,13 @@ as shown in the following example. \subsection BGLSeamMesh The Seam Mesh The class `Seam_mesh` allows to mark edges of a mesh as seam edges -so that they virtually become border edges when exploring a seam mesh with the \sc{Bgl} API. +so that they virtually become border edges when exploring a seam mesh with the \bgl API. The input mesh is referred to as underlying mesh of the seam mesh. We denote `tm` and `sm` the underlying mesh and the seam mesh respectively. Figure \cgalFigureRef{fig_Seam_mesh_1} shows an example of mesh on which two edges, defined by the halfedge pairs `h2-h3` and `h6-h7`, are marked as seams. -The introduction of virtual borders modifies the elementary \sc{Bgl} graph traversal +The introduction of virtual borders modifies the elementary \bgl graph traversal operations: when we circulate around the target of `h7` in the underlying mesh, we traverse `h7`, `h1`, `h3`, `h5`, before arriving at `h7` again. However, when we circulate in the seam mesh, we traverse `h7`, `h1`, `h3*`, 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 c106f1d9644..5518ffb5c0c 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 @@ -9,7 +9,7 @@ concept. It is equivalent to `HalfedgeDS_face_base< Refs, Tag_true>` with an added integer field which can be used to index faces -in \sc{Bgl} algorithms. +in \bgl algorithms. The class contains support for the incident halfedge pointer and the required type definitions. It can be used for deriving own faces. 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 965f513863a..f57951dc82e 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 @@ -7,7 +7,7 @@ namespace CGAL { The class `HalfedgeDS_halfedge_max_base_with_id` is a model of the `HalfedgeDSHalfedge` concept. It is equivalent to `HalfedgeDS_halfedge_base< Refs, Tag_true, Tag_true, Tag_true>` with an added integer -field which can be used to index halfedges in \sc{Bgl} algorithms. +field which can be used to index halfedges in \bgl algorithms. The class contains support for the previous, next, opposite, vertex and face pointers and the required type definitions. It can be used for deriving own halfedges. 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 328c65aa8c4..15fad92af97 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 @@ -8,7 +8,7 @@ The class `HalfedgeDS_vertex_max_base_with_id` is a model of the `HalfedgeDSVert concept. It is equivalent to `HalfedgeDS_vertex_base< Refs, Tag_true>` with an added integer field which can be used to index vertices -in \sc{Bgl} algorithms.. +in \bgl algorithms.. The class contains support for the point and the required type definitions. It can be used for deriving own vertices. 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 91f9fa32188..7db19153e87 100644 --- a/BGL/doc/BGL/CGAL/Polyhedron_items_with_id_3.h +++ b/BGL/doc/BGL/CGAL/Polyhedron_items_with_id_3.h @@ -7,7 +7,7 @@ namespace CGAL { The class `Polyhedron_items_with_id_3` is a model of the `PolyhedronItems_3` concept. It provides definitions for vertices with points, halfedges, and faces with plane equations, all of them with an additional integer -field which can be used to index the items in a \sc{Bgl} algorithm. +field which can be used to index the items in a \bgl algorithm. The polyhedron traits class must provide the respective types for the point and the plane equation. Vertices and facets both contain a halfedge handle to an incident 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 e1b380ac939..e6bdbbc6577 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 @@ -6,7 +6,7 @@ namespace CGAL { The class `Triangulation_face_base_with_id_2` is a model of the concept `TriangulationFaceBase_2`, the base face of a 2D-triangulation. It provides an integer field that can be used to -index faces for \sc{Bgl} algorithms. +index faces for \bgl algorithms. Note that the user is in charge of setting indices correctly before running a graph algorithm, by calling the function 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 0c71e6b72af..d9a58761062 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 @@ -6,7 +6,7 @@ namespace CGAL { The class `Triangulation_vertex_base_with_id_2` is a model of the concept `TriangulationVertexBase_2`, the base vertex of a 2D-triangulation. It provides an integer field that can be used to -index vertices for \sc{Bgl} algorithms. +index vertices for \bgl algorithms. Note that the user is in charge of setting indices correctly before running a graph algorithm, by calling the function diff --git a/BGL/doc/BGL/CGAL/boost/graph/properties.h b/BGL/doc/BGL/CGAL/boost/graph/properties.h index 40ca966a8e2..01f6df7b62f 100644 --- a/BGL/doc/BGL/CGAL/boost/graph/properties.h +++ b/BGL/doc/BGL/CGAL/boost/graph/properties.h @@ -4,7 +4,7 @@ namespace CGAL { /// \ingroup PkgBGLProperties /// @{ -/// The constant `vertex_index` is a property tag which identifies the index property of a vertex of a \sc{Bgl} +/// The constant `vertex_index` is a property tag which identifies the index property of a vertex of a \bgl /// Graph. /// \cgalModels PropertyTag enum vertex_index_t { vertex_index }; @@ -15,7 +15,7 @@ enum vertex_index_t { vertex_index }; /// \cgalModels 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 \sc{Bgl} +/// The constant `edge_index` is a property tag which identifies the index property of an edge of a \bgl /// Graph. /// \cgalModels PropertyTag enum edge_index_t { edge_index }; diff --git a/BGL/doc/BGL/Concepts/HalfedgeGraph.h b/BGL/doc/BGL/Concepts/HalfedgeGraph.h index 3769db82e16..a6fc002b0aa 100644 --- a/BGL/doc/BGL/Concepts/HalfedgeGraph.h +++ b/BGL/doc/BGL/Concepts/HalfedgeGraph.h @@ -2,7 +2,7 @@ \ingroup PkgBGLConcepts \cgalConcept -The concept `HalfedgeGraph` is a refinement of the \sc{Bgl} concept +The concept `HalfedgeGraph` is a refinement of the \bgl concept `IncidenceGraph` and adds the notion of a *halfedge*: Each edge is associated with two *opposite* halfedges with source and target vertices swapped. Furthermore, halfedges have a *successor* and *predecessor*, diff --git a/BGL/doc/BGL/NamedParameters.txt b/BGL/doc/BGL/NamedParameters.txt index d0a492fd54a..70a9e8a8029 100644 --- a/BGL/doc/BGL/NamedParameters.txt +++ b/BGL/doc/BGL/NamedParameters.txt @@ -2,7 +2,7 @@ \defgroup bgl_namedparameters Named Parameters \ingroup PkgBGLRef -The algorithms of the Boost Graph Library (\sc{Bgl}) often have many parameters with default +The algorithms of the Boost Graph Library (\bgl) often have many parameters with default values that are appropriate for most cases. In general, when no special treatment is applied, the values of such parameters are passed as a sequence. Deviating from the default for a certain parameter @@ -18,7 +18,7 @@ vertex_descriptor s = vertex(A, g); dijkstra_shortest_paths(g, s, predecessor_map(&p[0]).distance_map(&d[0])); \endcode -In the \sc{Bgl} manual, this is called +In the \bgl manual, this is called named parameters. The named parameters in the snippet use the tags `predecessor_map` and `distance_map` and they are concatenated using the dot operator.
    @@ -26,7 +26,7 @@ and they are concatenated using the dot operator.
    A similar mechanism was introduced in \cgal, with the small difference that the named parameters tag live in the `CGAL::parameters::` namespace and `CGAL::parameters::all_default()` can be used to indicate that default values of optional named parameters must be used. -As in the \sc{BGL}, named parameters in \cgal are also concatenated using +As in the \bgl, named parameters in \cgal are also concatenated using the dot operator, and a typical usage is thus: \code {.cpp} diff --git a/BGL/doc/BGL/PackageDescription.txt b/BGL/doc/BGL/PackageDescription.txt index 8a5d946cd9e..cf7e059049b 100644 --- a/BGL/doc/BGL/PackageDescription.txt +++ b/BGL/doc/BGL/PackageDescription.txt @@ -3,9 +3,9 @@ /*! \defgroup PkgBGLConcepts Concepts \ingroup PkgBGLRef - We extend the Boost Graph Library (\sc{Bgl} for short) with a set of new concepts. + We extend the Boost Graph Library (\bgl for short) with a set of new concepts. In order to make this documentation self-contained we here also document - concepts that are defined in the original version of the \sc{Bgl}. + concepts that are defined in the original version of the \bgl. The documentation of the concepts lists at the same time the functions related to it. Models of the concept and their related functions must be in the same namespace (they will be found by Koenig lookup). @@ -586,9 +586,9 @@ Methods to read and write graphs. \cgalPkgSummaryBegin \cgalPkgAuthors{Andreas Fabri, Fernando Cacciola, Philipp Moeller, and Ron Wein} \cgalPkgDesc{This package provides a framework for interfacing \cgal data structures - with the algorithms of the Boost Graph Library, or \sc{BGL} for short. + with the algorithms of the Boost Graph Library, or \bgl for short. It allows to run graph algorithms directly on \cgal data structures which are model - of the \sc{BGL} graph concepts, for example the shortest path algorithm + of the \bgl graph concepts, for example the shortest path algorithm on a Delaunay triangulation in order to compute the Euclidean minimum spanning tree. Furthermore, it introduces several new graph concepts describing halfedge data structures.} \cgalPkgManuals{Chapter_CGAL_and_the_Boost_Graph_Library,PkgBGLRef} @@ -621,7 +621,7 @@ Methods to read and write graphs. \cgalCRPSection{%CGAL Classes Adapted for the Graph API} -A number of \cgal structures have been adapted as graphs for the \sc{Bgl}. All +A number of \cgal structures have been adapted as graphs for the \bgl. All adapted types are listed here. The pages document which concepts they model, the properties they support, and any possible caveats that a user might encounter. diff --git a/BGL/doc/BGL/graph_traits.txt b/BGL/doc/BGL/graph_traits.txt index 87c96903b6f..d6f87e7b868 100644 --- a/BGL/doc/BGL/graph_traits.txt +++ b/BGL/doc/BGL/graph_traits.txt @@ -3,7 +3,7 @@ \ingroup PkgBGLRef -The \sc{Bgl} defines the class template +The \bgl defines the class template `boost::graph_traits` as a uniform interface to the properties and types of %graph types. @@ -156,7 +156,7 @@ vertex, or walking through the faces container. The mapping between vertices, edges, and faces of the triangulation and the graph is rather straightforward, but there are some subtleties. The -value type of the \sc{Bgl} iterators is the vertex or edge descriptor, +value type of the \bgl iterators is the vertex or edge descriptor, whereas in \cgal all iterators and circulators are also handles and hence have as value type Vertex or Edge. diff --git a/BGL/examples/BGL_polyhedron_3/CMakeLists.txt b/BGL/examples/BGL_polyhedron_3/CMakeLists.txt index 4ad3d613ab5..f63a444cc7c 100644 --- a/BGL/examples/BGL_polyhedron_3/CMakeLists.txt +++ b/BGL/examples/BGL_polyhedron_3/CMakeLists.txt @@ -19,23 +19,6 @@ if(NOT Boost_FOUND) endif() -find_package(OpenMesh QUIET) - -if(OpenMesh_FOUND) - include(UseOpenMesh) - add_definitions(-DCGAL_USE_OPENMESH) -else() - message(STATUS "Examples that use OpenMesh will not be compiled.") -endif() - -find_package(METIS) - -if(METIS_FOUND) - include_directories(${METIS_INCLUDE_DIRS}) -else() - message(STATUS "Examples that use the METIS library will not be compiled.") -endif() - # include for local directory # include for local package @@ -59,12 +42,21 @@ create_single_source_cgal_program("transform_iterator.cpp") create_single_source_cgal_program("copy_polyhedron.cpp") +find_package( OpenMesh QUIET ) if(OpenMesh_FOUND) target_link_libraries( copy_polyhedron PRIVATE ${OPENMESH_LIBRARIES} ) target_compile_definitions( copy_polyhedron PRIVATE -DCGAL_USE_OPENMESH ) +else() + message(STATUS "Examples that use OpenMesh will not be compiled.") endif() -if(METIS_FOUND) - create_single_source_cgal_program("polyhedron_partition.cpp") - target_link_libraries(polyhedron_partition PRIVATE ${METIS_LIBRARIES}) +find_package( METIS ) +if( METIS_FOUND ) + create_single_source_cgal_program( "polyhedron_partition.cpp" ) + if( METIS_FOUND ) + target_include_directories( polyhedron_partition PRIVATE ${METIS_INCLUDE_DIRS} ) + target_link_libraries( polyhedron_partition PRIVATE ${METIS_LIBRARIES} ) + else() + message( STATUS "Examples that use the METIS library will not be compiled." ) + endif() endif() diff --git a/BGL/examples/BGL_surface_mesh/CMakeLists.txt b/BGL/examples/BGL_surface_mesh/CMakeLists.txt index 92d4c226359..f07081a0cd8 100644 --- a/BGL/examples/BGL_surface_mesh/CMakeLists.txt +++ b/BGL/examples/BGL_surface_mesh/CMakeLists.txt @@ -13,12 +13,10 @@ create_single_source_cgal_program("surface_mesh_dual.cpp") create_single_source_cgal_program("connected_components.cpp") find_package(METIS) - -if(METIS_FOUND) - include_directories(${METIS_INCLUDE_DIRS}) - - create_single_source_cgal_program("surface_mesh_partition.cpp") - target_link_libraries(surface_mesh_partition PRIVATE ${METIS_LIBRARIES}) +if( METIS_FOUND ) + create_single_source_cgal_program( "surface_mesh_partition.cpp" ) + target_include_directories( surface_mesh_partition PRIVATE ${METIS_INCLUDE_DIRS} ) + target_link_libraries( surface_mesh_partition PRIVATE ${METIS_LIBRARIES} ) else() message(STATUS "Examples that use the METIS library will not be compiled.") endif() diff --git a/BGL/include/CGAL/boost/graph/IO/GOCAD.h b/BGL/include/CGAL/boost/graph/IO/GOCAD.h index 25cdf0ce780..966e4f4219d 100644 --- a/BGL/include/CGAL/boost/graph/IO/GOCAD.h +++ b/BGL/include/CGAL/boost/graph/IO/GOCAD.h @@ -18,7 +18,7 @@ #include #include #include - +#include #include #include @@ -271,7 +271,7 @@ bool read_GOCAD(const std::string& fname, Graph& g, /// \cgalParamNBegin{stream_precision} /// \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} /// \cgalParamType{int} -/// \cgalParamDefault{`6`} +/// \cgalParamDefault{`the precision of the stream `os``} /// \cgalParamNEnd /// \cgalNamedParamsEnd /// @@ -303,8 +303,7 @@ bool write_GOCAD(std::ostream& os, if(!os.good()) return false; - const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6); - os.precision(precision); + set_stream_precision_from_NP(os, np); os << "GOCAD TSurf 1\n" "HEADER {\n" @@ -380,7 +379,7 @@ bool write_GOCAD(std::ostream& os, const char* name, const Graph& g, /// \cgalParamNBegin{stream_precision} /// \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} /// \cgalParamType{int} -/// \cgalParamDefault{`6`} +/// \cgalParamDefault{`the precision of the stream `os``} /// \cgalParamNEnd /// \cgalNamedParamsEnd /// @@ -454,6 +453,7 @@ bool write_GOCAD(const std::string& fname, { std::ofstream os(fname); CGAL::set_mode(os, CGAL::IO::ASCII); + return write_GOCAD(os, fname.c_str(), g, np); } diff --git a/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_printer.h b/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_printer.h index 4ab13c13192..5fb75be5363 100644 --- a/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_printer.h +++ b/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_printer.h @@ -117,8 +117,7 @@ public: if(!m_os.good()) return false; - const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6); - m_os.precision(precision); + set_stream_precision_from_NP(m_os, np); VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, g)); diff --git a/BGL/include/CGAL/boost/graph/IO/OBJ.h b/BGL/include/CGAL/boost/graph/IO/OBJ.h index 8e1c9b5ea89..7d733c9f8b4 100644 --- a/BGL/include/CGAL/boost/graph/IO/OBJ.h +++ b/BGL/include/CGAL/boost/graph/IO/OBJ.h @@ -231,7 +231,7 @@ bool read_OBJ(const std::string& fname, Graph& g, \cgalParamNBegin{stream_precision} \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} \cgalParamType{int} - \cgalParamDefault{`6`} + \cgalParamDefault{`the precision of the stream `os``} \cgalParamNEnd \cgalNamedParamsEnd @@ -285,6 +285,11 @@ bool write_OBJ(std::ostream& os, const Graph& g, \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` must be available in `Graph`.} \cgalParamNEnd + \cgalParamNBegin{stream_precision} + \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} + \cgalParamType{int} + \cgalParamDefault{`6`} + \cgalParamNEnd \cgalNamedParamsEnd \returns `true` if writing was successful, `false` otherwise. diff --git a/BGL/include/CGAL/boost/graph/IO/OFF.h b/BGL/include/CGAL/boost/graph/IO/OFF.h index 0c95c7ea570..57685046e79 100644 --- a/BGL/include/CGAL/boost/graph/IO/OFF.h +++ b/BGL/include/CGAL/boost/graph/IO/OFF.h @@ -284,9 +284,9 @@ bool read_OFF(const std::string& fname, Graph& g, \deprecated This function is deprecated since \cgal 5.2, `CGAL::read_OFF()` should be used instead. */ template -CGAL_DEPRECATED bool read_off(std::ostream& os, Graph& g, const CGAL_BGL_NP_CLASS& np) +CGAL_DEPRECATED bool read_off(std::istream& is, Graph& g, const CGAL_BGL_NP_CLASS& np) { - return read_OFF(os, g, np); + return read_OFF(is, g, np); } /*! @@ -300,6 +300,18 @@ CGAL_DEPRECATED bool read_off(const char* fname, Graph& g, const CGAL_BGL_NP_CLA return read_OFF(fname, g, np); } +template +CGAL_DEPRECATED bool read_off(std::istream& is, Graph& g) +{ + return read_off(is, g, parameters::all_default()); +} + +template +CGAL_DEPRECATED bool read_off(const char* fname, Graph& g) +{ + return read_off(fname, g, parameters::all_default()); +} + #endif // CGAL_NO_DEPRECATED_CODE //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -374,7 +386,7 @@ bool write_OFF_BGL(std::ostream& os, \cgalParamNBegin{stream_precision} \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} \cgalParamType{int} - \cgalParamDefault{`6`} + \cgalParamDefault{`the precision of the stream `os``} \cgalParamNEnd \cgalNamedParamsEnd @@ -483,6 +495,7 @@ bool write_OFF(const std::string& fname, std::cerr<<"Could not create file."; return false; } + return write_OFF(os, g, np); } @@ -510,6 +523,11 @@ CGAL_DEPRECATED bool write_off(std::ostream& os, const Graph& g, const CGAL_BGL_ return write_OFF(os, g, np); } +template +CGAL_DEPRECATED bool write_off(std::ostream& os, const Graph& g) +{ + return write_off(os, g, CGAL::parameters::all_default()); +} /*! \ingroup PkgBGLIOFctDeprecated @@ -521,6 +539,11 @@ CGAL_DEPRECATED bool write_off(const char* fname, const Graph& g, const CGAL_BGL return write_OFF(fname, g, np); } +template +CGAL_DEPRECATED bool write_off(const char* fname, const Graph& g) +{ + return write_off(fname, g, parameters::all_default()); +} #endif // CGAL_NO_DEPRECATED_CODE } // namespace CGAL diff --git a/BGL/include/CGAL/boost/graph/IO/PLY.h b/BGL/include/CGAL/boost/graph/IO/PLY.h index ff65a977f7b..c571c07d629 100644 --- a/BGL/include/CGAL/boost/graph/IO/PLY.h +++ b/BGL/include/CGAL/boost/graph/IO/PLY.h @@ -311,7 +311,7 @@ bool read_PLY(const std::string& fname, Graph& g, \cgalParamNBegin{stream_precision} \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} \cgalParamType{int} - \cgalParamDefault{`6`} + \cgalParamDefault{`the precision of the stream `os``} \cgalParamExtra{This parameter is only meaningful while using ASCII encoding.} \cgalParamNEnd \cgalNamedParamsEnd @@ -361,8 +361,7 @@ bool write_PLY(std::ostream& os, if(!os.good()) return false; - const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6); - os.precision(precision); + set_stream_precision_from_NP(os, np); // Write header os << "ply" << std::endl @@ -550,6 +549,7 @@ bool write_PLY(const std::string& fname, { std::ofstream os(fname); CGAL::set_mode(os, CGAL::IO::ASCII); + return write_PLY(os, g, comments, np); } } diff --git a/BGL/include/CGAL/boost/graph/IO/STL.h b/BGL/include/CGAL/boost/graph/IO/STL.h index de10a9a95a5..78bd1fcb588 100644 --- a/BGL/include/CGAL/boost/graph/IO/STL.h +++ b/BGL/include/CGAL/boost/graph/IO/STL.h @@ -231,7 +231,7 @@ bool read_STL(const std::string& fname, Graph& g) { return read_STL(fname, g, pa \cgalParamNBegin{stream_precision} \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} \cgalParamType{int} - \cgalParamDefault{`6`} + \cgalParamDefault{`the precision of the stream `os``} \cgalParamExtra{This parameter is only meaningful while using ASCII encoding.} \cgalParamNEnd \cgalNamedParamsEnd @@ -262,8 +262,7 @@ bool write_STL(std::ostream& os, if(!os.good()) return false; - const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6); - os.precision(precision); + set_stream_precision_from_NP(os, np); if(get_mode(os) == IO::BINARY) { @@ -372,6 +371,7 @@ bool write_STL(const std::string& fname, const Graph& g, const CGAL_BGL_NP_CLASS { std::ofstream os(fname); CGAL::set_mode(os, CGAL::IO::ASCII); + return write_STL(os, g, np); } } diff --git a/BGL/include/CGAL/boost/graph/IO/VTK.h b/BGL/include/CGAL/boost/graph/IO/VTK.h index 1ba37f19d6c..894b3598b09 100644 --- a/BGL/include/CGAL/boost/graph/IO/VTK.h +++ b/BGL/include/CGAL/boost/graph/IO/VTK.h @@ -420,7 +420,7 @@ void write_polys_points(std::ostream& os, * \cgalParamNBegin{stream_precision} * \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} * \cgalParamType{int} - * \cgalParamDefault{`6`} + * \cgalParamDefault{`the precision of the stream `os``} * \cgalParamNEnd * \cgalNamedParamsEnd * @@ -439,8 +439,7 @@ bool write_VTP(std::ostream& os, if(!os.good()) return false; - const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6); - os.precision(precision); + set_stream_precision_from_NP(os, np); os << "\n" << " +CGAL_DEPRECATED bool write_vtp(std::ostream& os, const Graph& g) +{ + return write_vtp(os, g, parameters::all_default()); +} + #endif // CGAL_NO_DEPRECATED_CODE } // namespace CGAL diff --git a/BGL/include/CGAL/boost/graph/IO/WRL.h b/BGL/include/CGAL/boost/graph/IO/WRL.h index c9d2f69b6b5..dc8186862c7 100644 --- a/BGL/include/CGAL/boost/graph/IO/WRL.h +++ b/BGL/include/CGAL/boost/graph/IO/WRL.h @@ -59,7 +59,7 @@ namespace CGAL { \cgalParamNBegin{stream_precision} \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} \cgalParamType{int} - \cgalParamDefault{`6`} + \cgalParamDefault{`the precision of the stream `os``} \cgalParamNEnd \cgalNamedParamsEnd @@ -70,7 +70,8 @@ bool write_WRL(std::ostream& os, const Graph& g, const CGAL_BGL_NP_CLASS& np) { - IO::internal::Generic_facegraph_printer printer(os); + CGAL::VRML_2_ostream vos(os); + IO::internal::Generic_facegraph_printer printer(vos); return printer(g, np); } @@ -108,8 +109,8 @@ bool write_WRL(std::ostream& os, template bool write_WRL(const std::string& fname, const Graph& g, const CGAL_BGL_NP_CLASS& np) { - std::ifstream is(fname); - return write_WRL(is, g, np); + std::ofstream os(fname); + return write_WRL(os, g, np); } template @@ -130,6 +131,12 @@ CGAL_DEPRECATED bool write_wrl(std::ostream& os, const Graph& g, const CGAL_BGL_ return write_WRL(os, g, np); } +template +CGAL_DEPRECATED bool write_wrl(std::ostream& os, const Graph& g) +{ + return write_wrl(os, g, parameters::all_default()); +} + #endif // CGAL_NO_DEPRECATED_CODE } // namespace CGAL diff --git a/BGL/include/CGAL/boost/graph/copy_face_graph.h b/BGL/include/CGAL/boost/graph/copy_face_graph.h index ba4187b85b1..19755ac8e46 100644 --- a/BGL/include/CGAL/boost/graph/copy_face_graph.h +++ b/BGL/include/CGAL/boost/graph/copy_face_graph.h @@ -25,7 +25,7 @@ #include #include #include -#include +#include namespace CGAL { @@ -167,6 +167,8 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, for(tm_vertex_descriptor v : vertices(tm)) { tm_halfedge_descriptor h = halfedge(v, tm); + if (h==boost::graph_traits::null_halfedge()) + continue; tm_halfedge_descriptor next_around_vertex=h; do{ next_around_vertex=opposite(next(next_around_vertex, tm), tm); diff --git a/BGL/include/CGAL/boost/graph/named_params_helper.h b/BGL/include/CGAL/boost/graph/named_params_helper.h index 0993fb05d69..b3a32e15dc4 100644 --- a/BGL/include/CGAL/boost/graph/named_params_helper.h +++ b/BGL/include/CGAL/boost/graph/named_params_helper.h @@ -27,6 +27,20 @@ namespace CGAL { + namespace parameters + { + template + struct Is_default + { + typedef typename internal_np::Lookup_named_param_def < + Parameter, + NamedParameters, + internal_np::Param_not_found > ::type NP_type; + static const bool value = boost::is_same::value; + typedef CGAL::Boolean_tag type; + }; + } // end of parameters namespace + // forward declarations to avoid dependency to Solver_interface template class Default_diagonalize_traits; @@ -560,6 +574,21 @@ CGAL_DEF_GET_INITIALIZED_INDEX_MAP(face, typename boost::graph_traits::fa Alpha_expansion_boost_adjacency_list_tag >::type type; }; + + template + void set_stream_precision_from_NP(std::ostream& os, const NP& np) + { + using parameters::get_parameter; + using parameters::choose_parameter; + using parameters::is_default_parameter; + + if(!is_default_parameter(get_parameter(np, internal_np::stream_precision))) + { + const int precision = choose_parameter(get_parameter(np, + internal_np::stream_precision)); + os.precision(precision); + } + } } //namespace CGAL diff --git a/BGL/include/CGAL/boost/graph/parameters_interface.h b/BGL/include/CGAL/boost/graph/parameters_interface.h index 5a9f467dbb2..eebd236eaca 100644 --- a/BGL/include/CGAL/boost/graph/parameters_interface.h +++ b/BGL/include/CGAL/boost/graph/parameters_interface.h @@ -61,6 +61,7 @@ CGAL_add_named_parameter(geom_traits_t, geom_traits, geom_traits) CGAL_add_named_parameter(vertex_incident_patches_t, vertex_incident_patches, vertex_incident_patches_map) CGAL_add_named_parameter(density_control_factor_t, density_control_factor, density_control_factor) CGAL_add_named_parameter(use_delaunay_triangulation_t, use_delaunay_triangulation, use_delaunay_triangulation) +CGAL_add_named_parameter(use_2d_constrained_delaunay_triangulation_t, use_2d_constrained_delaunay_triangulation, use_2d_constrained_delaunay_triangulation) CGAL_add_named_parameter(fairing_continuity_t, fairing_continuity, fairing_continuity) CGAL_add_named_parameter(sparse_linear_solver_t, sparse_linear_solver, sparse_linear_solver) CGAL_add_named_parameter(number_of_relaxation_steps_t, number_of_relaxation_steps, number_of_relaxation_steps) @@ -117,6 +118,7 @@ CGAL_add_named_parameter(volume_threshold_t, volume_threshold, volume_threshold) CGAL_add_named_parameter(dry_run_t, dry_run, dry_run) CGAL_add_named_parameter(do_not_modify_t, do_not_modify, do_not_modify) CGAL_add_named_parameter(allow_self_intersections_t, allow_self_intersections, allow_self_intersections) +CGAL_add_named_parameter(non_manifold_feature_map_t, non_manifold_feature_map, non_manifold_feature_map) CGAL_add_named_parameter(polyhedral_envelope_epsilon_t, polyhedral_envelope_epsilon, polyhedral_envelope_epsilon) // List of named parameters that we use in the package 'Surface Mesh Simplification' diff --git a/BGL/include/CGAL/boost/graph/selection.h b/BGL/include/CGAL/boost/graph/selection.h index ec8dcd57366..668bc4707e0 100644 --- a/BGL/include/CGAL/boost/graph/selection.h +++ b/BGL/include/CGAL/boost/graph/selection.h @@ -561,6 +561,9 @@ regularize_face_selection_borders( /// \endcond /// \cond SKIP_IN_MANUAL + +namespace experimental { + // TODO: improve and document if useful // // Variant of regularization without graphcut but with brut-force @@ -703,6 +706,8 @@ regularize_face_selection_borders( put(is_selected, fd, true); } } + +} /// \endcond diff --git a/BGL/test/BGL/CMakeLists.txt b/BGL/test/BGL/CMakeLists.txt index d6ec47e9cae..3009a3ae873 100644 --- a/BGL/test/BGL/CMakeLists.txt +++ b/BGL/test/BGL/CMakeLists.txt @@ -98,6 +98,8 @@ create_single_source_cgal_program( create_single_source_cgal_program( "graph_traits_inheritance.cpp" ) +create_single_source_cgal_program("test_deprecated_io.cpp") + if(OpenMesh_FOUND) target_link_libraries(test_clear PRIVATE ${OPENMESH_LIBRARIES}) target_compile_definitions(test_clear PRIVATE -DCGAL_USE_OPENMESH) @@ -129,6 +131,8 @@ if (VTK_FOUND) if(VTK_LIBRARIES) target_link_libraries(test_bgl_read_write PRIVATE ${VTK_LIBRARIES}) target_compile_definitions(test_bgl_read_write PRIVATE -DCGAL_USE_VTK) + target_link_libraries(test_deprecated_io PRIVATE ${VTK_LIBRARIES}) + target_compile_definitions(test_deprecated_io PRIVATE -DCGAL_USE_VTK) else() message(STATUS "Tests that use VTK will not be compiled.") endif() diff --git a/BGL/test/BGL/test_Euler_operations.cpp b/BGL/test/BGL/test_Euler_operations.cpp index ed9e43126b0..21b8809897d 100644 --- a/BGL/test/BGL/test_Euler_operations.cpp +++ b/BGL/test/BGL/test_Euler_operations.cpp @@ -35,6 +35,57 @@ test_copy_face_graph_nm_umbrella() } } +template +void +test_copy_face_graph_isolated_vertices() +{ + typedef Kernel::Point_3 Point_3; + + { + T s, t; + add_vertex(s); + CGAL::copy_face_graph(s, t); + } + + { + T s, t; + add_vertex(t); + CGAL::copy_face_graph(s, t); + } + + { + T s, t; + CGAL::make_triangle(Point_3(), Point_3(), Point_3(), s); + add_vertex(s); + t=s; + CGAL::copy_face_graph(s, t); + } + + { + T s, t; + CGAL::make_triangle(Point_3(), Point_3(), Point_3(), s); + add_vertex(s); + add_vertex(t); + CGAL::copy_face_graph(s, t); + } + + { + T s, t; + CGAL::make_tetrahedron(Point_3(), Point_3(), Point_3(), Point_3(), s); + add_vertex(s); + t=s; + CGAL::copy_face_graph(s, t); + } + + { + T s, t; + CGAL::make_tetrahedron(Point_3(), Point_3(), Point_3(), Point_3(), s); + add_vertex(s); + add_vertex(t); + CGAL::copy_face_graph(s, t); + } +} + template void join_face_test() @@ -619,6 +670,7 @@ void test_Euler_operations() { test_copy_face_graph_nm_umbrella(); + test_copy_face_graph_isolated_vertices(); join_face_test(); add_vertex_and_face_to_border_test(); add_face_to_border_test(); diff --git a/BGL/test/BGL/test_bgl_read_write.cpp b/BGL/test/BGL/test_bgl_read_write.cpp index de6fd4918bb..5be2d9e33e9 100644 --- a/BGL/test/BGL/test_bgl_read_write.cpp +++ b/BGL/test/BGL/test_bgl_read_write.cpp @@ -171,10 +171,10 @@ void test_bgl_OFF(const char* filename) assert(ok); assert(num_vertices(fg) == 8 && num_faces(fg) == 4); - for(const auto v : vertices(fg)) + for(auto v : vertices(fg)) assert(get(vcm, v) != CGAL::Color()); - for(const auto f : faces(fg)) + for(auto f : faces(fg)) assert(get(fcm, f) != CGAL::Color()); // write with OFF @@ -192,10 +192,10 @@ void test_bgl_OFF(const char* filename) assert(ok); assert(are_equal_meshes(fg, fg2)); - for(const auto v : vertices(fg2)) + for(auto v : vertices(fg2)) assert(get(vcm2, v) != CGAL::Color()); - for(const auto f : faces(fg2)) + for(auto f : faces(fg2)) assert(get(fcm2, f) != CGAL::Color()); } @@ -211,7 +211,7 @@ void test_bgl_OFF(const char* filename) assert(ok); assert(are_equal_meshes(fg, fg2)); - for(const auto v : vertices(fg2)) + for(auto v : vertices(fg2)) assert(get(vcm2, v) != CGAL::Color()); } } @@ -224,7 +224,7 @@ void test_bgl_OFF(const char* filename) ok = CGAL::read_OFF("data/mesh_with_normals.off", fg, CGAL::parameters::vertex_normal_map(vnm)); assert(ok); - for(const auto v : vertices(fg)) + for(auto v : vertices(fg)) assert(get(vnm, v) != CGAL::NULL_VECTOR); // write with OFF @@ -240,7 +240,7 @@ void test_bgl_OFF(const char* filename) assert(ok); assert(are_equal_meshes(fg, fg2)); - for(const auto v : vertices(fg2)) + for(auto v : vertices(fg2)) assert(get(vnm2, v) != CGAL::NULL_VECTOR); } @@ -256,7 +256,7 @@ void test_bgl_OFF(const char* filename) assert(ok); assert(are_equal_meshes(fg, fg2)); - for(const auto v : vertices(fg2)) + for(auto v : vertices(fg2)) assert(get(vnm2, v) != CGAL::NULL_VECTOR); } } @@ -278,13 +278,13 @@ void test_bgl_OFF(const char* filename) assert(ok); assert(num_vertices(fg) != 0 && num_faces(fg) != 0); - for(const auto v : vertices(fg)) + for(auto v : vertices(fg)) { assert(get(vnm2, v) != CGAL::NULL_VECTOR); assert(get(vcm2, v) != CGAL::Color()); } - for(const auto f : faces(fg)) + for(auto f : faces(fg)) assert(get(fcm2, f) != CGAL::Color()); fg.clear(); is.close(); @@ -301,7 +301,7 @@ void test_bgl_OFF(const char* filename) assert(ok); assert(num_vertices(fg) != 0 && num_faces(fg) != 0); - for(const auto v : vertices(fg)) + for(auto v : vertices(fg)) { assert(get(vnm, v) != CGAL::NULL_VECTOR); assert(get(vcm, v) != CGAL::Color()); @@ -328,13 +328,13 @@ void test_bgl_OFF(const char* filename) assert(ok); assert(are_equal_meshes(fg, fg2)); - for(const auto v : vertices(fg2)) + for(auto v : vertices(fg2)) { assert(get(vnm2, v) != CGAL::NULL_VECTOR); assert(get(vcm2, v) != CGAL::Color()); } - for(const auto f : faces(fg2)) + for(auto f : faces(fg2)) assert(get(fcm2, f) != CGAL::Color()); } @@ -359,13 +359,13 @@ void test_bgl_OFF(const char* filename) assert(ok); assert(are_equal_meshes(fg, fg2)); - for(const auto v : vertices(fg2)) + for(auto v : vertices(fg2)) { assert(get(vnm2, v) != CGAL::NULL_VECTOR); assert(get(vcm2, v) != CGAL::Color()); } - for(const auto f : faces(fg2)) + for(auto f : faces(fg2)) assert(get(fcm2, f) != CGAL::Color()); } } @@ -526,12 +526,12 @@ void test_bgl_PLY(const std::string filename, assert(ok); assert(num_vertices(fg) == 4 && num_faces(fg) == 4); - for(const auto v : vertices(fg)) + for(auto v : vertices(fg)) { assert(get(vcm, v) != CGAL::Color()); } - for(const auto f : faces(fg)) + for(auto f : faces(fg)) assert(get(fcm, f) != CGAL::Color()); // write with PLY @@ -561,10 +561,10 @@ void test_bgl_PLY(const std::string filename, assert(are_equal_meshes(fg, fg2)); // @tmp -// for(const auto v : vertices(fg2)) +// for(auto v : vertices(fg2)) // assert(get(vcm2, v) != CGAL::Color()); -// for(const auto f : faces(fg2)) +// for(auto f : faces(fg2)) // assert(get(fcm2, f) != CGAL::Color()); } @@ -586,10 +586,10 @@ void test_bgl_PLY(const std::string filename, assert(are_equal_meshes(fg, fg2)); // @tmp -// for(const auto v : vertices(fg2)) +// for(auto v : vertices(fg2)) // assert(get(vcm2, v) != CGAL::Color()); -// for(const auto f : faces(fg2)) +// for(auto f : faces(fg2)) // assert(get(fcm2, f) != CGAL::Color()); } diff --git a/BGL/test/BGL/test_cgal_bgl_named_params.cpp b/BGL/test/BGL/test_cgal_bgl_named_params.cpp index 14ec4f0a0cd..277e4a1153d 100644 --- a/BGL/test/BGL/test_cgal_bgl_named_params.cpp +++ b/BGL/test/BGL/test_cgal_bgl_named_params.cpp @@ -63,6 +63,7 @@ void test(const NamedParameters& np) assert(get_parameter(np, CGAL::internal_np::vertex_incident_patches).v == 11); assert(get_parameter(np, CGAL::internal_np::density_control_factor).v == 12); assert(get_parameter(np, CGAL::internal_np::use_delaunay_triangulation).v == 13); + assert(get_parameter(np, CGAL::internal_np::use_2d_constrained_delaunay_triangulation).v == 4573); assert(get_parameter(np, CGAL::internal_np::fairing_continuity).v == 14); assert(get_parameter(np, CGAL::internal_np::sparse_linear_solver).v == 15); assert(get_parameter(np, CGAL::internal_np::number_of_relaxation_steps).v == 16); @@ -106,6 +107,8 @@ void test(const NamedParameters& np) assert(get_parameter(np, CGAL::internal_np::allow_self_intersections).v == 66); assert(get_parameter(np, CGAL::internal_np::polyhedral_envelope_epsilon).v == 67); assert(get_parameter(np, CGAL::internal_np::maximum_number_of_faces).v == 78910); + assert(get_parameter(np, CGAL::internal_np::non_manifold_feature_map).v == 60); + assert(get_parameter(np, CGAL::internal_np::filter).v == 61); // Named parameters that we use in the package 'Surface Mesh Simplification' assert(get_parameter(np, CGAL::internal_np::get_cost_policy).v == 34); @@ -163,6 +166,7 @@ void test(const NamedParameters& np) check_same_type<11>(get_parameter(np, CGAL::internal_np::vertex_incident_patches)); check_same_type<12>(get_parameter(np, CGAL::internal_np::density_control_factor)); check_same_type<13>(get_parameter(np, CGAL::internal_np::use_delaunay_triangulation)); + check_same_type<4573>(get_parameter(np, CGAL::internal_np::use_2d_constrained_delaunay_triangulation)); check_same_type<14>(get_parameter(np, CGAL::internal_np::fairing_continuity)); check_same_type<15>(get_parameter(np, CGAL::internal_np::sparse_linear_solver)); check_same_type<16>(get_parameter(np, CGAL::internal_np::number_of_relaxation_steps)); @@ -219,6 +223,8 @@ void test(const NamedParameters& np) check_same_type<62>(get_parameter(np, CGAL::internal_np::halfedges_keeper)); check_same_type<64>(get_parameter(np, CGAL::internal_np::do_simplify_border)); check_same_type<78910>(get_parameter(np, CGAL::internal_np::maximum_number_of_faces)); + check_same_type<60>(get_parameter(np, CGAL::internal_np::non_manifold_feature_map)); + check_same_type<61>(get_parameter(np, CGAL::internal_np::filter)); // Named parameters that we use in the package 'Surface Mesh Simplification' check_same_type<34>(get_parameter(np, CGAL::internal_np::get_cost_policy)); @@ -310,6 +316,7 @@ int main() .vertex_incident_patches_map(A<11>(11)) .density_control_factor(A<12>(12)) .use_delaunay_triangulation(A<13>(13)) + .use_2d_constrained_delaunay_triangulation(A<4573>(4573)) .fairing_continuity(A<14>(14)) .sparse_linear_solver(A<15>(15)) .number_of_relaxation_steps(A<16>(16)) @@ -344,6 +351,8 @@ int main() .throw_on_self_intersection(A<43>(43)) .clip_volume(A<44>(44)) .use_compact_clipper(A<45>(45)) + .non_manifold_feature_map(A<60>(60)) + .filter(A<61>(61)) .apply_per_connected_component(A<46>(46)) .output_iterator(A<47>(47)) .erase_all_duplicates(A<48>(48)) diff --git a/BGL/test/BGL/test_deprecated_io.cpp b/BGL/test/BGL/test_deprecated_io.cpp new file mode 100644 index 00000000000..5bd037191cc --- /dev/null +++ b/BGL/test/BGL/test_deprecated_io.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +int main() +{ + // OFF + 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); + assert(ok); + ok = CGAL::read_off("tmp.off", sm_in); + assert(ok); + assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1); + sm_in.clear(); + + std::ofstream os("tmp.off"); + ok = CGAL::write_off(os, sm_out); + assert(ok); + os.close(); + std::ifstream is("tmp.off"); + ok = CGAL::read_off(is, sm_in); + assert(ok); + assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1); + is.close(); + sm_in.clear(); +#ifdef CGAL_USE_VTK + //vtk + os.open("tmp.vtp"); + ok = CGAL::write_vtp(os, sm_out); + assert(ok); + os.close(); + + ok = CGAL::read_VTP("tmp.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"); + ok = CGAL::write_wrl(os, sm_out); + assert(ok); + os.close(); + return EXIT_SUCCESS; +} diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2.h index 4f1ed78e348..31eb450f116 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2.h @@ -1,460 +1,1018 @@ namespace CGAL { -/*! -\addtogroup boolean_complement Complement Functions -\ingroup PkgBooleanSetOperations2Ref -\anchor ref_bso_complement +/*! \addtogroup boolean_complement Complement Functions + * \ingroup PkgBooleanSetOperations2Ref + * \anchor ref_bso_complement + * + * There are several overloaded function templates called `complement()` that + * compute the \e complement of a given polygon `pgn`. Depending on the type of + * the polygon `pgn` the complement is either a single (general) polygon with + * holes, or several (general) poylgons with holes. In the latter case the + * `complement()` function template inserts the resulting poylgons with holes + * into a container via an output iterator. + * + * A function template in this group has one of the two following signatures: + * - `void complement(const Type1& pgn, Type2& res);` + * - `void complement(const Type1& pgn, Type2& res, const GpsTraits& traits);` + * + * \cgalHeading{Parameters} + * + * The types `Type` and `Type2` of the parameters must be convertible to the + * types specified in a row in the table below, respectively. + * + *
    + * + * + * + * + * + * + *
    `Type1` `Type2`
    `Polygon_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_with_holes_2`
    `General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_with_holes_2`
    + *
    + * + * \sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink + * \sa \link boolean_intersection `CGAL::intersection()` \endlink + * \sa \link boolean_join `CGAL::join()` \endlink + * \sa \link boolean_difference `CGAL::difference()` \endlink + * \sa \link boolean_symmetric_difference `CGAL::symmetric_difference()` \endlink + */ -The `complement` function is overloaded. Depending on the -type of polygon `pgn` the complement is either a single (general) polygon with -holes, or several (general) poylgons with holes. In the latter case -the `complement function` writes them into an output iterator -`oi`. - -\param pgn The input polygon for the `complement` function. It may be of the type -`Polygon_2`, `General_polygon_2`, `Polygon_with_holes_2`, or -`General_polygon_with_holes_2`. - - - -\sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink -\sa \link boolean_intersection `CGAL::intersection()` \endlink -\sa \link boolean_join `CGAL::join()` \endlink -\sa \link boolean_difference `CGAL::difference()` \endlink -\sa \link boolean_symmetric_difference `CGAL::symmetric_difference()` \endlink -*/ /// @{ -/*! - writes the complement of the polygon `pgn` into the polygon with holes `res`. - */ -template -void complement(const Polygon_2 & pgn, Polygon_with_holes_2 & res); +//////// Traits-less -/*! - writes the complement of the general polygon `pgn` into the general polygon with holes `res`. +/*! computes the complement of a polygon. + * \param pgn the input polygon. + * \param res the resulting complement of \p pgn. */ -template -void complement(const General_polygon_2 & pgn, General_polygon_with_holes_2 & res); +template +void complement(const Polygon_2& pgn, + Polygon_with_holes_2& res); -/*! - writes the complement of the polygon with holes `pgn` into the output iterator `oi`. - The value type of `oi` is `Polygon_with_holes_2`. +/*! computes the complement of a general polygon. + * \param pgn the input polygon. + * \param res the complement of \p pgn. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -OutputIterator complement(const Polygon_with_holes_2 & pgn, OutputIterator oi); +template +void +complement(const General_polygon_2& pgn, + General_polygon_with_holes_2 >& res); -/*! - writes the complement of the general polygon with holes `pgn` into the output iterator `oi`. - The value type of `oi` is `General_polygon_with_holes_2`. +/*! computes the complement of a polygon with holes. + * \param pgn the input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. */ -template -OutputIterator complement(const General_polygon_with_holes_2 > & pgn, OutputIterator oi); +template +OutputIterator complement(const Polygon_with_holes_2& pgn, + OutputIterator oi); + +/*! computes the complement of a general polygon with holes. + * \param pgn the input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2< >`. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template +OutputIterator +complement(const General_polygon_with_holes_2 >& pgn, + OutputIterator oi); + +//////// With Traits + +/*! computes the complement of a polygon. + * \param pgn the input polygon. + * \param res the resulting complement of \p pgn + * \param traits a traits object. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +void complement(const Polygon_2& pgn, + Polygon_with_holes_2& res, + const GpsTraits& traits); + +/*! computes the complement of a general polygon. + * \param pgn the input polygon. + * \param res the resulting complement of \p pgn + * \param traits a traits object. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +void +complement(const General_polygon_2& pgn, + General_polygon_with_holes_2 >& res, + const GpsTraits& traits); + +/*! computes the complement of a polygon with holes. + * \param pgn the input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator complement(const Polygon_with_holes_2& pgn, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the complement of the general polygon with holes. + * \param pgn the input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2< >`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator complement(const General_polygon_with_holes_2& pgn, + OutputIterator oi, + const GpsTraits& traits); + /// @} } /* namespace CGAL */ namespace CGAL { -/*! -\addtogroup boolean_difference Difference Functions -\ingroup PkgBooleanSetOperations2Ref -\anchor ref_bso_difference - -Each one of these functions computes the difference between two given -polygons `p1` and `p2`, and inserts the resulting polygons -with holes into an output container through the output iterator `oi`. -The value type of the `OutputIterator` is either -`Polygon_with_holes_2` or -`General_polygon_with_holes_2`. - -The signature of the function is: - - `%OutputIterator %difference(const Type1 & p1, const Type2 & p2, %OutputIterator oi);` - - -\cgalHeading{Parameters} - -The types of the parameters of the `difference()` function are any of the following combinations. - -
    - - - - - - - - - - -
    Type1Type2
    Polygon_2Polygon_2
    Polygon_2Polygon_with_holes_2
    Polygon_with_holes_2Polygon_2
    Polygon_with_holes_2Polygon_with_holes_2
    General_polygon_2General_polygon_2
    General_polygon_2General_polygon_with_holes_2
    General_polygon_with_holes_2General_polygon_2
    General_polygon_with_holes_2General_polygon_with_holes_2
    -
    - -\sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink -\sa \link boolean_intersection `CGAL::intersection()` \endlink -\sa \link boolean_join `CGAL::join()` \endlink -\sa \link boolean_symmetric_difference `CGAL::symmetric_difference()` \endlink - -*/ - +/*! \addtogroup boolean_difference Difference Functions + * \ingroup PkgBooleanSetOperations2Ref + * \anchor ref_bso_difference + * + * There are several overloaded function templates called `difference()` that + * compute the \e difference between two polygons and insert the resulting + * polygons with holes into a container via an output iterator. + * + * A function template in this group has one of the two following signatures: + * - `OutputIterator difference(const Type1& pgn1, const Type2& pgn2, + * OutputIterator oi);` + * - `OutputIterator difference(const Type1& pgn1, const Type2& pgn2, + * OutputIterator oi, const GpsTraits& traits);` + * + * \param oi the output iterator for the result. + * + * The types `Type1` and `Type2` of the parameters must be convertible to the + * types specified in a row in the table below, respectively. The 3rd column + * specifies the corresponding dereference type of the output iterator. + * + *
    + * + * + * + * + * + * + * + * + * + * + *
    `Type1` `Type2` %Dereference Type of `oi`
    `Polygon_2` `Polygon_2` `Polygon_with_holes_2`
    `Polygon_2` `Polygon_with_holes_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_with_holes_2` `Polygon_with_holes_2`
    `General_polygon_2` `General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_2` `General_polygon_with_holes_2``General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_with_holes_2``General_polygon_with_holes_2`
    + *
    + * + * \sa \link boolean_complement `CGAL::complement()` \endlink + * \sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink + * \sa \link boolean_intersection `CGAL::intersection()` \endlink + * \sa \link boolean_join `CGAL::join()` \endlink + * \sa \link boolean_symmetric_difference `CGAL::symmetric_difference()` \endlink + */ /// @{ -/*! - writes the difference of the polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `Polygon_with_holes_2`. + +//////// Traits-less + +/*! computes the difference of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. */ -template -OutputIterator difference(const Polygon_2 & p1, - const Polygon_2 & p2, +template +OutputIterator difference(const Polygon_2& pgn1, + const Polygon_2& pgn2, OutputIterator oi); -/*! - writes the difference of the polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `Polygon_with_holes_2`. +/*! computes the difference of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. */ -template -OutputIterator difference(const Polygon_2 & p1, - const Polygon_with_holes_2 & p2, +template +OutputIterator difference(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2, OutputIterator oi); -/*! - writes the difference of the polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `Polygon_with_holes_2`. +/*! computes the difference of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. */ -template -OutputIterator difference(const Polygon_with_holes_2 & p1, - const Polygon_2 & p2, +template +OutputIterator difference(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2, OutputIterator oi); -/*! - writes the difference of the polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `Polygon_with_holes_2`. +/*! computes the difference of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. */ -template -OutputIterator difference(const Polygon_with_holes_2 & p1, - const Polygon_with_holes_2 & p2, +template +OutputIterator difference(const Polygon_with_holes_2& pgn1, + const Polygon_with_holes_2& pgn2, OutputIterator oi); -/*! - writes the difference of the general polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `General_polygon_with_holes_2`. +/*! computes the difference of two general polygons and inserts the resulting + * general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `General_polygon_with_holes_2 >`. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept `ArrangementDirectionalXMonotoneTraits_2`. */ -template -OutputIterator difference(const General_polygon_2 & p1, - const General_polygon_2 & p2, +template +OutputIterator difference(const General_polygon_2& pgn1, + const General_polygon_2& pgn2, OutputIterator oi); -/*! - writes the difference of the general polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `General_polygon_with_holes_2`. +/*! computes the difference of two general polygons and inserts the resulting + * general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `General_polygon_with_holes_2 >`. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -OutputIterator difference(const General_polygon_with_holes_2 > & p1, - const General_polygon_2 & p2, +template +OutputIterator +difference(const General_polygon_with_holes_2 >& pgn1, + const General_polygon_2& pgn2, + OutputIterator oi); + +/*! computes the difference of two polygons and inserts the resulting + * general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `General_polygon_with_holes_2 >`. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template +OutputIterator +difference(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2, + OutputIterator oi); + +/*! computes the difference of two general polygons with holes and inserts the + * resulting general polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `General_polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. + */ +template +OutputIterator difference(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2, OutputIterator oi); +//////// With Traits -/*! - writes the difference of the general polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `General_polygon_with_holes_2`. +/*! computes the difference of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `Polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. */ -template -OutputIterator difference(const General_polygon_2 & p1, - const General_polygon_with_holes_2 > & p2, - OutputIterator oi); +template +OutputIterator difference(const Polygon_2& pgn1, + const Polygon_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); - -/*! - writes the difference of the general polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `General_polygon_with_holes_2`. +/*! computes the difference of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `Polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. */ -template -OutputIterator difference(const General_polygon_with_holes_2 & p1, - const General_polygon_with_holes_2 & p2, - OutputIterator oi); +template +OutputIterator difference(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the difference of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `Polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator difference(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the difference of two polygons with holes and inserts the resulting + * polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `Polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator difference(const Polygon_with_holes_2& pgn1, + const Polygon_with_holes_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the difference of two general polygons and inserts the resulting + * general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `General_polygon_with_holes_2 >`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator difference(const General_polygon_2& pgn1, + const General_polygon_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the difference of two general polygons and inserts the resulting + * general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `General_polygon_with_holes_2 >`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator +difference(const General_polygon_with_holes_2 >& pgn1, + const General_polygon_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the difference of two general polygons and inserts the resulting + * general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `General_polygon_with_holes_2 >`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator +difference(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the difference of two general polygons and inserts the resulting + * general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertibe to + * `General_polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator difference(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); /// @} } /* namespace CGAL */ namespace CGAL { -/*! -\addtogroup boolean_do_intersect Intersection Testing Functions -\ingroup PkgBooleanSetOperations2Ref -\anchor ref_bso_do_intersect - -Each one of these functions computes if the interior of two given -polygons `p1` and `p2` intersect. - -The signature of the function is: - - `bool do_intersect(const Type1 & p1, const Type2 & p2);` - - -\cgalHeading{Parameters} - -The types of the parameters of the \link ref_bso_do_intersect `do_intersect()` \endlink function are any of the following combinations. - -
    - - - - - - - - - - -
    Type1 Type2
    Polygon_2Polygon_2
    Polygon_2Polygon_with_holes_2
    Polygon_with_holes_2Polygon_2
    Polygon_with_holes_2Polygon_with_holes_2
    General_polygon_2General_polygon_2
    General_polygon_2General_polygon_with_holes_2
    General_polygon_with_holes_2General_polygon_2
    General_polygon_with_holes_2General_polygon_with_holes_2
    -
    - - -\sa \link boolean_intersection `CGAL::intersection()` \endlink -\sa \link boolean_join `CGAL::join()` \endlink -\sa \link boolean_difference `CGAL::difference()` \endlink -\sa \link boolean_symmetric_difference `CGAL::symmetric_difference()` \endlink - -*/ +/*! \addtogroup boolean_do_intersect Intersection Testing Functions + * \ingroup PkgBooleanSetOperations2Ref + * \anchor ref_bso_do_intersect + * + * There are several overloaded function templates called `do_intersect()` + * that determine whether the interior of two or more polygons intersect. + * + * A function template in this group that accepts two input polygons has one of + * the two following signatures: + * - `bool do_intersect(const Type1& pgn1, const Type2& pgn2);` + * - `bool do_intersect(const Type1& pgn1, const Type2& pgn2, + const GpsTraits& traits);` + * + * \cgalHeading{Parameters} + * + * The types `Type1` and `Type2` of the parameters must be convertible to the + * types specified in a row in the table below, respectively. + * + *
    + * + * + * + * + * + * + * + * + * + * + *
    `Type1` `Type2`
    `Polygon_2` `Polygon_2`
    `Polygon_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_2`
    `Polygon_with_holes_2` `Polygon_with_holes_2`
    `General_polygon_2` `General_polygon_2`
    `General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_2`
    `General_polygon_with_holes_2``General_polygon_with_holes_2`
    + *
    + * + * \sa \link boolean_complement `CGAL::complement()` \endlink + * \sa \link boolean_intersection `CGAL::intersection()` \endlink + * \sa \link boolean_join `CGAL::join()` \endlink + * \sa \link boolean_difference `CGAL::difference()` \endlink + * \sa \link boolean_symmetric_difference `CGAL::symmetric_difference()` \endlink + */ /// @{ -/*! - returns `true` if the polygons `p1` and `p2` intersect in their interior. +//////// Traits-less + +/*! determines whether two polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. */ -template -bool do_intersect(const Polygon_2 & p1, - const Polygon_2 & p2); +template +bool do_intersect(const Polygon_2& pgn1, + const Polygon_2& pgn2); -/*! - returns `true` if the polygons `p1` and `p2` intersect in their interior. +/*! determines whether two polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. */ -template -bool do_intersect(const Polygon_2 & p1, - const Polygon_with_holes_2 & p2); +template +bool do_intersect(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2); -/*! - returns `true` if the polygons `p1` and `p2` intersect in their interior. - returns `true` if the interior of polygons `p1` and `p2` intersect. +/*! determines whether two polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. */ -template -bool do_intersect(const Polygon_with_holes_2 & p1, - const Polygon_2 & p2); - -/*! - returns `true` if the polygons `p1` and `p2` intersect in their interior. +template +bool do_intersect(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2); +/*! determines whether two polygons with holes intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. */ -template -bool do_intersect(const Polygon_with_holes_2 & p1, - const Polygon_with_holes_2 & p2); +template +bool do_intersect(const Polygon_with_holes_2& pgn1, + const Polygon_with_holes_2& pgn2); -/*! - returns `true` if the general polygons `p1` and `p2` intersect in their interior. +/*! determines whether two general polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -bool do_intersect(const General_polygon_2 & p1, - const General_polygon_2 & p2); +template +bool do_intersect(const General_polygon_2& pgn1, + const General_polygon_2& pgn2); -/*! - returns `true` if the general polygons `p1` and `p2` intersect in their interior. +/*! determines whether two general polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -bool do_intersect(const General_polygon_2 & p1, - const General_polygon_with_holes_2 > & p2); +template +bool +do_intersect(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2); -/*! - returns `true` if the general polygons `p1` and `p2` intersect in their interior. +/*! determines whether two general polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -bool do_intersect(const General_polygon_with_holes_2 > & p1, - const General_polygon_2 & p2); +template +bool do_intersect(const General_polygon_with_holes_2 >& pgn1, + const General_polygon_2& pgn2); - -/*! - returns `true` if the general polygons `p1` and `p2` intersect in their interior. +/*! determines whether two general polygons with holes intersect in their + * interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. */ -template -bool do_intersect(const General_polygon_with_holes_2 & p1, - const General_polygon_with_holes_2 & p2); +template +bool do_intersect(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2); - /*! - returns `true`, if the set of general polygons (or general - polygons with holes) in the given range intersect in their interior, - and `false` otherwise. (The value type of the input iterator is - used to distinguish between the two). - */ -template +/*! Given a range of polygons or a range of polygons with holes (resp. a range + * of general polygons or a range of general polygons with holes) determines + * whether the open polygons (resp. general polygons) in the range have a common + * point. + * \param begin the first iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param end the past-the-end iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \return `true` if the pairwise intersections of all open polygons or polygons + * with holes (resp. general polygons or general polygons with holes) in + * the range [*begin,*end) overlap, and `false` otherwise. + */ +template bool do_intersect(InputIterator begin, InputIterator end); - /*! - returns `true`, if the set of general polygons and general - polygons with holes in the given two ranges respectively intersect in - their interior, and `false` otherwise. - */ -template -bool do_intersect(InputIterator1 pgn_begin1, - InputIterator1 pgn_end1, - InputIterator2 pgn_begin2, - InputIterator2 pgn_end2); +/*! Given a range of polygons (resp. general polygons) and a range of polygons + * with holes (resp. general polygons with holes) determines whether the open + * polygons (resp. general polygons) in the two ranges have a common point. + * \param begin1 the first iterator of the 1st input range. Its value type is + * `Polygon_2` (resp. `General_polygon_2`). + * \param end1 the past-the-end iterator of the 1st input range. Its value + * type is `Polygon_2` (resp. `General_polygon_2`). + * \param begin2 the first iterator of the 2nd input range. Its value type + * is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param end2 the past-the-end iterator of the 2nd input range. Its value + * type is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \return `true` if the pairwise intersections of all open polygons (resp. + * general polygons) and polygons with holes (resp. general polygons with + * holes) in the ranges [*begin1,*end1) and [*begin2,*end2), + * respectively, overlap, and `false` otherwise. + */ +template +bool do_intersect(InputIterator1 begin1, + InputIterator1 end1, + InputIterator2 begin2, + InputIterator2 end2); + +//////// With Traits + +/*! determines whether two polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool do_intersect(const Polygon_2& pgn1, + const Polygon_2& pgn2, + const GpsTraits& traits); + +/*! determines whether two polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool do_intersect(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2, + const GpsTraits& traits, + const GpsTraits& traits); + +/*! determines whether two polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool do_intersect(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2, + const GpsTraits& traits); + +/*! determines whether two polygons with holes intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool do_intersect(const Polygon_with_holes_2& pgn1, + const Polygon_with_holes_2& pgn2, + const GpsTraits& traits); + +/*! determines whether two general polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template +bool do_intersect(const General_polygon_2& pgn1, + const General_polygon_2& pgn2, + const GpsTraits& traits); + +/*! determines whether two general polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template +bool +do_intersect(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2, + const GpsTraits& traits); + +/*! determines whether two general polygons intersect in their interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template +bool +do_intersect(const General_polygon_with_holes_2 >& pgn1, + const General_polygon_2& pgn2, + const GpsTraits& traits); + +/*! determines whether two general polygons with holes intersect in their + * interior. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \return `true` if `pgn1` and `pgn2` intersect in their interiro and `false` + * otherwise. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool do_intersect(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2, + const GpsTraits& traits); + +/*! Given a range of polygons or a range of polygons with holes (resp. a range + * of general polygons or a range of general polygons with holes) determines + * whether the open polygons (resp. general polygons) in the range have a common + * point. + * \param begin the first iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param end the past-the-end iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param traits a traits object. + * \return `true` if the pairwise intersections of all open polygons or polygons + * with holes (resp. general polygons or general polygons with holes) in + * the range [*begin,*end) overlap, and `false` otherwise. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool do_intersect(InputIterator begin, InputIterator end, + const GpsTraits& traits); + +/*! Given a range of polygons (resp. general polygons) and a range of polygons + * with holes (resp. general polygons with holes) determines whether the open + * polygons (resp. general polygons) in the two ranges have a common point. + * \param begin1 the first iterator of the 1st input range. Its value type is + * `Polygon_2` (resp. `General_polygon_2`). + * \param end1 the past-the-end iterator of the 1st input range. Its value + * type is `Polygon_2` (resp. `General_polygon_2`). + * \param begin2 the first iterator of the 2nd input range. Its value type + * is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param end2 the past-the-end iterator of the 2nd input range. Its value + * type is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param traits a traits object. + * \return `true` if the pairwise intersections of all open polygons (resp. + * general polygons) and polygons with holes (resp. general polygons with + * holes) in the ranges [*begin1,*end1) and [*begin2,*end2), + * respectively, overlap, and `false` otherwise. + */ +template +bool do_intersect(InputIterator1 begin1, InputIterator1 end1, + InputIterator2 begin2, InputIterator2 end2, + const GpsTraits& traits); + /// @} } /* namespace CGAL */ namespace CGAL { -/*! -\addtogroup boolean_intersection Intersection Functions -\ingroup PkgBooleanSetOperations2Ref -\anchor ref_bso_intersection - -Each one of these functions computes the intersection of two given -polygons `p1` and `p2`, inserts the resulting polygons with -holes into an output container through a given output iterator -`oi`, and returns the output iterator. The value type of the -`OutputIterator` is either `Polygon_with_holes_2` or -`General_polygon_with_holes_2`. - - -The signature of the function is: - - `%OutputIterator %intersection(const Type1 & p1, const Type2 & p2, %OutputIterator oi);` - - - -\cgalHeading{Parameters} - -The types of the parameters of the `intersection()` function are any of the following combinations. - - -
    - - - - - - - - - - -
    Type1 Type2
    Polygon_2Polygon_2
    Polygon_2Polygon_with_holes_2
    Polygon_with_holes_2Polygon_2
    Polygon_with_holes_2Polygon_with_holes_2
    General_polygon_2General_polygon_2
    General_polygon_2General_polygon_with_holes_2
    General_polygon_with_holes_2General_polygon_2
    General_polygon_with_holes_2General_polygon_with_holes_2
    -
    - - -\sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink -\sa \link boolean_join `CGAL::join()` \endlink -\sa \link boolean_difference `CGAL::difference()` \endlink -\sa \link boolean_symmetric_difference `CGAL::symmetric_difference()` \endlink - -*/ - +/*! \addtogroup boolean_intersection Intersection Functions + * \ingroup PkgBooleanSetOperations2Ref + * \anchor ref_bso_intersection + * + * There are several overloaded function templates called `intersection()` that + * compute the \e intersection of two or more polygons and insert the resulting + * polygons with holes into a container via an output iterator. + * + * A function template in this group that accepts two input polygons has one of + * the two following signatures: + * - `OutputIterator %intersection(const Type1& pgn1, const Type2& pgn2, + * OutputIterator oi);` + * - `OutputIterator %intersection(const Type1& pgn1, const Type2& pgn2, + * OutputIterator oi, const GpsTraits& traits);` + * + * \param oi the output iterator for the result. + * + * The types `Type1` and `Type2` of the parameters must be convertible to the + * types specified in a row in the table below, respectively. The 3rd column + * specifies the corresponding dereference type of the output iterator. + * + *
    + * + * + * + * + * + * + * + * + * + * + *
    `Type1` `Type2` %Dereference Type of `oi`
    `Polygon_2` `Polygon_2` `Polygon_with_holes_2`
    `Polygon_2` `Polygon_with_holes_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_with_holes_2` `Polygon_with_holes_2`
    `General_polygon_2` `General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_2` `General_polygon_with_holes_2``General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_with_holes_2``General_polygon_with_holes_2`
    + *
    + * + * \sa \link boolean_complement `CGAL::complement()` \endlink + * \sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink + * \sa \link boolean_join `CGAL::join()` \endlink + * \sa \link boolean_difference `CGAL::difference()` \endlink + * \sa \link boolean_symmetric_difference `CGAL::symmetric_difference()` \endlink + */ /// @{ -/*! - writes the intersection of the polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `Polygon_with_holes_2`. +/*! computes the intersection of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. */ -OutputIterator intersection(const Type1 & p1, const Type2 & p2, +template +OutputIterator intersection(const Polygon_2& pgn1, + const Polygon_2& pgn2, OutputIterator oi); -/*! - writes the intersection of the polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `Polygon_with_holes_2`. +/*! computes the intersection of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. */ -template -OutputIterator intersection(const Polygon_2 & p1, - const Polygon_2 & p2, +template +OutputIterator intersection(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2, OutputIterator oi); -/*! - writes the intersection of the polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `Polygon_with_holes_2`. +/*! computes the intersection of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. */ -template -OutputIterator intersection(const Polygon_2 & p1, - const Polygon_with_holes_2 & p2, +template +OutputIterator intersection(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2, OutputIterator oi); -/*! - writes the intersection of the polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `Polygon_with_holes_2`. +/*! computes the intersection of two polygons and inserts the resulting polygons + * with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. */ -template -OutputIterator intersection(const Polygon_with_holes_2 & p1, - const Polygon_2 & p2, +template +OutputIterator intersection(const Polygon_with_holes_2& pgn1, + const Polygon_with_holes_2& pgn2, OutputIterator oi); -/*! - writes the intersection of the polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `Polygon_with_holes_2`. +/*! computes the intersection of two general polygons and inserts the resulting + * general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2 >`. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -OutputIterator intersection(const Polygon_with_holes_2 & p1, - const Polygon_with_holes_2 & p2, +template +OutputIterator intersection(const General_polygon_2& pgn1, + const General_polygon_2& pgn2, OutputIterator oi); -/*! - writes the intersection of the general polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `General_polygon_with_holes_2`. +/*! computes the intersection of two general polygons and inserts the resulting + * general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2 >`. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -OutputIterator intersection(const General_polygon_2 & p1, -const General_polygon_2 & p2, -OutputIterator oi); +template +OutputIterator +intersection(const General_polygon_with_holes_2 >& pgn1, + const General_polygon_2& pgn2, + OutputIterator oi); -/*! - writes the intersection of the general polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `General_polygon_with_holes_2`. +/*! computes the intersection of two general polygons and inserts the resulting + * general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2 >`. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -OutputIterator intersection(const General_polygon_with_holes_2 > & p1, - const General_polygon_2 & p2, - OutputIterator oi); +template +OutputIterator +intersection(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2, + OutputIterator oi); -/*! - writes the intersection of the general polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `General_polygon_with_holes_2`. +/*! computes the intersection of two general polygons with holes and inserts the + * resulting general polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. */ -template -OutputIterator intersection(const General_polygon_2 & p1, - const General_polygon_with_holes_2 > & p2, - OutputIterator oi); - -/*! - writes the intersection of the general polygons `p1` and `p2` into the output iterator `oi`. - The value type of `oi` is `General_polygon_with_holes_2`. - */ -template -OutputIterator intersection(const General_polygon_with_holes_2 & p1, - const General_polygon_with_holes_2 & p2, +template +OutputIterator intersection(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2, OutputIterator oi); -/*! - computes the intersection of the general polygons (or general polygons with - holes) in the given range. (The value type of the input iterator is - used to distinguish between the two.) The result, represented by a set - of general polygon with holes, is written into the output iterator `oi`. - The output iterator is returned. The value type of the `OutputIterator` is - `Traits::Polygon_with_holes_2`. -*/ -template +/*! Given a range of polygons (resp. general polygons) or a range of general + * polygons with holes (resp. general polygons with holes) computes the + * intersection of all polygons in the range and inserts the resulting polygons + * with holes (resp. general polygons with holes) into a container via an output + * iterator. + * \param begin the first iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param end the past-the-end iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2` (resp. `General_polygons_with_holes_2`). + * \return the past-the-end iterator of the output container. + */ +template OutputIterator intersection(InputIterator begin, InputIterator end, OutputIterator oi); -/*! - computes the intersection of the general polygons and general polygons - with holes in the given two ranges. The result, represented by a set - of general polygon with holes, is written into the output iterator `oi`. - The output iterator is returned. The value type of the `OutputIterator` is - `Traits::Polygon_with_holes_2`. -*/ -template -OutputIterator intersection(InputIterator1 pgn_begin1, -InputIterator1 pgn_end1, -InputIterator2 pgn_begin2, -InputIterator2 pgn_end2, -OutputIterator oi); +/*! Given a range of polygons (resp. general polygons) and a range of general + * polygons with holes (resp. general polygons with holes) computes the + * intersection of all polygons in the two ranges and inserts the resulting + * polygons with holes (resp. general polygons with holes) into a container via + * an output iterator. + * \param begin1 the first iterator of the 1st input range. Its value type is + * `Polygon_2` (resp. `General_polygon_2`). + * \param end1 the past-the-end iterator of the 1st input range. Its value + * type is `Polygon_2` (resp. `General_polygon_2`). + * \param begin2 the first iterator of the 2nd input range. Its value type + * is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param end2 the past-the-end iterator of the 2nd input range. Its value + * type is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2` (resp. `General_polygons_with_holes_2`). + * \return the past-the-end iterator of the output container. + */ +template +OutputIterator intersection(InputIterator1 begin1, + InputIterator1 end1, + InputIterator2 begin2, + InputIterator2 end2, + OutputIterator oi); /// @} @@ -462,372 +1020,1147 @@ OutputIterator oi); namespace CGAL { -/*! -\addtogroup boolean_join Union Functions -\ingroup PkgBooleanSetOperations2Ref -\anchor ref_bso_union - -Each one of these functions computes the union of two given polygons -`p1` and `p2`. If the two given polygons overlap, it returns -`true`, and places the resulting polygon in `p`. Otherwise, it -returns `false`. - - -The signature of the function is: - - `bool join(const Type1 & p1, const Type2 & p2, General_polygon_with_holes_2 & res);` - - -\cgalHeading{Parameters} - -The types of the parameters of the `join()` function are any of the following combinations. - -
    - - - - - - - - - - -
    Type1 Type2
    Polygon_2Polygon_2
    Polygon_2polygon_with_holes_2
    Polygon_with_holes_2Polygon_2
    Polygon_with_holes_2Polygon_with_holes_2
    General_polygon_2General_polygon_2
    General_polygon_2General_polygon_with_holes_2
    General_polygon_with_holes_2General_polygon_2
    General_polygon_with_holes_2General_polygon_with_holes_2
    -
    - -\sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink -\sa \link boolean_intersection `CGAL::intersection()` \endlink -\sa \link boolean_difference `CGAL::difference()` \endlink -\sa \link boolean_symmetric_difference `CGAL::symmetric_difference()` \endlink - -*/ +/*! \addtogroup boolean_join Union Functions + * \ingroup PkgBooleanSetOperations2Ref + * \anchor ref_bso_union + * + * There are several overloaded function templates called `join()` that + * compute the \e union of two polygons. + * + * A function template in this group has one of the two following signatures: + * - `bool join(const Type1& pgn1, const Type2& pgn2, Type3& res);` + * - `bool join(const Type1& pgn1, const Type2& pgn2, Type3& res, + * const GpsTraits& traits);` + * + * \cgalHeading{Parameters} + * + * The types `Type1`, `Type2`, and `Type3, of the parameters must be convertible + * to the types specified in a row in the table below, respectively. + * + *
    + * + * + * + * + * + * + * + * + * + * + *
    `Type1` `Type2` `Type3`
    `Polygon_2` `Polygon_2` `Polygon_with_holes_2`
    `Polygon_2` `Polygon_with_holes_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_with_holes_2` `Polygon_with_holes_2`
    `General_polygon_2` `General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_2` `General_polygon_with_holes_2``General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_with_holes_2``General_polygon_with_holes_2`
    + *
    + * + * \sa \link boolean_complement `CGAL::complement()` \endlink + * \sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink + * \sa \link boolean_intersection `CGAL::intersection()` \endlink + * \sa \link boolean_difference `CGAL::difference()` \endlink + * \sa \link boolean_symmetric_difference `CGAL::symmetric_difference()` \endlink + */ /// @{ -/*! - writes the union of the polygons `p1` and `p2` into the polygon with holes `res`. - Returns `true` if the two given polygons overlap. +//////// Traits-less + +/*! computes the union of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \return `true` if the two input polygons overlap. */ -template -bool join(const Polygon_2 & p1, - const Polygon_2 & p2, - General_polygon_with_holes_2 > & res); +template +bool join(const Polygon_2& pgn1, + const Polygon_2& pgn2, + General_polygon_with_holes_2 >& res); -/*! - writes the union of the polygons `p1` and `p2` into the polygon with holes `res`. - Returns `true` if the two given polygons overlap. +/*! computes the union of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \return `true` if the two input polygons overlap. */ -template -bool join(const Polygon_2 & p1, - const Polygon_with_holes_2 & p2, - General_polygon_with_holes_2 > & res); +template +bool join(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2, + General_polygon_with_holes_2 >& res); -/*! - writes the union of the polygons `p1` and `p2` into the polygon with holes `res`. - Returns `true` if the two given polygons overlap. +/*! computes the union of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \return `true` if the two input polygons overlap. */ -template -bool join(const Polygon_with_holes_2 & p2, - const Polygon_2 & p1, - General_polygon_with_holes_2 > & res); +template +bool join(const Polygon_with_holes_2& pgn2, + const Polygon_2& pgn1, + General_polygon_with_holes_2 >& res); -/*! - writes the union of the polygons `p1` and `p2` into the polygon with holes `res`. - Returns `true` if the two given polygons overlap. +/*! computes the union of two polygons with holes. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \return `true` if the two input polygons overlap. */ -template -bool join(const Polygon_with_holes_2 & p2, - const Polygon_with_holes_2 & p1, - General_polygon_with_holes_2 > & res); +template +bool join(const Polygon_with_holes_2& pgn2, + const Polygon_with_holes_2& pgn1, + General_polygon_with_holes_2 >& res); -/*! - writes the union of the general polygons `p1` and `p2` into the polygon with holes `res`. - Returns `true` if the two given polygons overlap. +/*! computes the union of two general polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \return `true` if the two input polygons overlap. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -bool join(const General_polygon_2 & p1, - const General_polygon_2 & p2, - General_polygon_with_holes_2 > & res); +template +bool join(const General_polygon_2& pgn1, + const General_polygon_2& pgn2, + General_polygon_with_holes_2 >& res); -/*! - writes the union of the polygons `p1` and `p2` into the polygon with holes `res`. - Returns `true` if the two given polygons overlap. +/*! computes the union of two general polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \return `true` if the two input polygons overlap. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -bool join(const General_polygon_2 & p1, - const General_polygon_with_holes_2 > & p2, - General_polygon_with_holes_2 > & res); +template +bool +join(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2, + General_polygon_with_holes_2 >& res); -/*! - writes the union of the general polygons `p1` and `p2` into the polygon with holes `res`. - Returns `true` if the two given polygons overlap. +/*! computes the union of two general polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \return `true` if the two input polygons overlap. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. */ -template -bool join(const General_polygon_with_holes_2 > & p2, - const General_polygon_2 & p1, - General_polygon_with_holes_2 > & res); +template +bool +join(const General_polygon_with_holes_2 >& pgn2, + const General_polygon_2& pgn1, + General_polygon_with_holes_2 >& res); -/*! - writes the union of the general polygons `p1` and `p2` into the polygon with holes `res`. - Returns `true` if the two given polygons overlap. +/*! computes the union of two general polygons with holes. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \return `true` if the two input polygons overlap. */ -template -bool join(const General_polygon_with_holes_2 & p1, - const General_polygon_with_holes_2 & p2, - Traits::Polygon_with_holes_2 & res); +template +bool join(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2, + General_polygon_with_holes_2& res); - -/*! - computes the union of the general polygons (or general polygons with - holes) in the given range. (The value type of the input iterator is - used to distinguish between the two.) The result, represented by a set - of general polygon with holes, is written into the output iterator `oi`. - The output iterator is - returned. The value type of the `OutputIterator` is - `Traits::Polygon_with_holes_2`. -*/ -template +/*! Given a range of polygons (resp. general polygons) or a range of general + * polygons with holes (resp. general polygons with holes) computes the + * union of all polygons in the range and inserts the resulting polygons + * with holes (resp. general polygons with holes) into a container via an output + * iterator. + * \param begin the first iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param end the past-the-end iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2` (resp. `General_polygons_with_holes_2`). + * \return the past-the-end iterator of the output container. + */ +template OutputIterator join(InputIterator begin, InputIterator end, -OutputIterator oi); + OutputIterator oi); - /*! - computes the union of the general polygons and general polygons - with holes in the given two ranges. The result, represented by a set - of general polygon with holes, is written into the output iterator `oi`. - The output iterator is - returned. The value type of the `OutputIterator` is - `Traits::Polygon_with_holes_2`. - */ -template -OutputIterator join(InputIterator1 pgn_begin1, InputIterator1 pgn_end1, -InputIterator2 pgn_begin2, InputIterator2 pgn_end2, -OutputIterator oi); +/*! Given a range of polygons (resp. general polygons) and a range of general + * polygons with holes (resp. general polygons with holes) computes the + * union of all polygons in the two ranges and inserts the resulting + * polygons with holes (resp. general polygons with holes) into a container via + * an output iterator. + * \param begin1 the first iterator of the 1st input range. Its value type is + * `Polygon_2` (resp. `General_polygon_2`). + * \param end1 the past-the-end iterator of the 1st input range. Its value + * type is `Polygon_2` (resp. `General_polygon_2`). + * \param begin2 the first iterator of the 2nd input range. Its value type + * is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param end2 the past-the-end iterator of the 2nd input range. Its value + * type is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2` (resp. `General_polygons_with_holes_2`). + * \return the past-the-end iterator of the output container. + */ +template +OutputIterator join(InputIterator1 begin1, InputIterator1 end1, + InputIterator2 begin2, InputIterator2 end2, + OutputIterator oi); + +//////// With Traits + +/*! computes the union of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \param traits a traits object. + * \return `true` if the two input polygons overlap. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool join(const Polygon_2& pgn1, + const Polygon_2& pgn2, + General_polygon_with_holes_2 >& res, + const GpsTraits& traits); + + +/*! computes the union of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \param traits a traits object. + * \return `true` if the two input polygons overlap. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool join(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2, + General_polygon_with_holes_2 >& res, + const GpsTraits& traits); + + +/*! computes the union of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \param traits a traits object. + * \return `true` if the two input polygons overlap. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool join(const Polygon_with_holes_2& pgn2, + const Polygon_2& pgn1, + General_polygon_with_holes_2 >& res, + const GpsTraits& traits); + + +/*! computes the union of two polygons with holes. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \param traits a traits object. + * \return `true` if the two input polygons overlap. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool join(const Polygon_with_holes_2& pgn2, + const Polygon_with_holes_2& pgn1, + General_polygon_with_holes_2 >& res, + const GpsTraits& traits); + + +/*! computes the union of two general polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \param traits a traits object. + * \return `true` if the two input polygons overlap. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool join(const General_polygon_2& pgn1, + const General_polygon_2& pgn2, + General_polygon_with_holes_2 >& res, + const GpsTraits& traits); + + +/*! computes the union of two general polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \param traits a traits object. + * \return `true` if the two input polygons overlap. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool +join(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2, + General_polygon_with_holes_2 >& res, + const GpsTraits& traits); + + +/*! computes the union of two general polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \param traits a traits object. + * \return `true` if the two input polygons overlap. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool join(const General_polygon_with_holes_2 >& pgn2, + const General_polygon_2& pgn1, + General_polygon_with_holes_2 >& res, + const GpsTraits& traits); + + +/*! computes the union of two general polygons with holes. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param res the resulting union of \p pgn1 and \p pgn2. + * \param traits a traits object. + * \return `true` if the two input polygons overlap. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +bool join(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2, + General_polygon_with_holes_2& res, + const GpsTraits& traits); + +/*! Given a range of polygons (resp. general polygons) or a range of general + * polygons with holes (resp. general polygons with holes) computes the + * union of all polygons in the range and inserts the resulting polygons + * with holes (resp. general polygons with holes) into a container via an output + * iterator. + * \param begin the first iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param end the past-the-end iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2` (resp. `General_polygons_with_holes_2`). + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator join(InputIterator begin, InputIterator end, + OutputIterator oi, + const GpsTraits& traits); + +/*! Given a range of polygons (resp. general polygons) and a range of general + * polygons with holes (resp. general polygons with holes) computes the + * union of all polygons in the two ranges and inserts the resulting + * polygons with holes (resp. general polygons with holes) into a container via + * an output iterator. + * \param begin1 the first iterator of the 1st input range. Its value type is + * `Polygon_2` (resp. `General_polygon_2`). + * \param end1 the past-the-end iterator of the 1st input range. Its value + * type is `Polygon_2` (resp. `General_polygon_2`). + * \param begin2 the first iterator of the 2nd input range. Its value type + * is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param end2 the past-the-end iterator of the 2nd input range. Its value + * type is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2` (resp. `General_polygons_with_holes_2`). + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator join(InputIterator1 begin1, InputIterator1 end1, + InputIterator2 begin2, InputIterator2 end2, + OutputIterator oi, + const GpsTraits& traits); /// @} } /* namespace CGAL */ namespace CGAL { -/*! -\addtogroup boolean_oriented_side Oriented Side Functions -\ingroup PkgBooleanSetOperations2Ref -\anchor ref_bso_oriented_side - -Each one of these functions returns `ON_POSITIVE_SIDE` if the two -given polygons `p1` and `p2` intersect in their interior, -`ON_NEGATIVE_SIDE` if `p1` and `p2` do not intersect at -all, and `ON_ORIENTED_BOUNDARY` if `p1` and `p2` intersect -only in their boundaries. - -The signature of the function is: - - `Oriented_side oriented_side(const Type1 & p1, const Type2 & p2);` - -\cgalHeading{Parameters} - -The types of the parameters of the `oriented_side()` function are any of the following combinations. - -
    - - - - - - - - - - -
    Type1Type2
    Polygon_2Polygon_2
    Polygon_2Polygon_with_holes_2
    Polygon_with_holes_2Polygon_2
    Polygon_with_holes_2Polygon_with_holes_2
    General_polygon_2General_polygon_2
    General_polygon_2General_polygon_with_holes_2
    General_polygon_with_holes_2General_polygon_2
    General_polygon_with_holes_2General_polygon_with_holes_2
    -
    - -\sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink - -*/ - +/*! \addtogroup boolean_oriented_side Oriented Side Functions + * \ingroup PkgBooleanSetOperations2Ref + * \anchor ref_bso_oriented_side + * + * There are several overloaded function templates called `Oriented_side()` + * that compute the relative position of either (i) two polygons or (ii) a + * point and a polygon. This group of function templates is divided into two + * subgroups. + * + * \cgalHeading{Oriented Side of two Polygons} + * + * Every function template in the first subgroup accepts two polygons `pgn1` and + * `pgn2`. It returns `ON_POSITIVE_SIDE` if the two given polygons `pgn1` and + * `pgn2` intersect in their interiors, `ON_NEGATIVE_SIDE` if `pgn1` and `pgn2` + * do not intersect at all, and `ON_ORIENTED_BOUNDARY` if `pgn1` and `pgn2` + * intersect only in their boundaries. + * + * A function template in this subgroup has one of the two following signatures: + * - `Oriented_side oriented_side(const Type1& pgn1, const Type2& pgn2);` + * - `Oriented_side oriented_side(const Type1& pgn1, const Type2& pgn2, + * const GpsTraits& traits);` + * + * \cgalHeading{Parameters} + * + * The types `Type1` and `Type2` of the parameters must be convertible to the types specified in a row in the following table, respectively. + * + *
    + * + * + * + * + * + * + * + * + * + * + *
    Type1 Type2
    `Polygon_2` `Polygon_2`
    `Polygon_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_2`
    `Polygon_with_holes_2` `Polygon_with_holes_2`
    `General_polygon_2` `General_polygon_2`
    `General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_2`
    `General_polygon_with_holes_2``General_polygon_with_holes_2`
    + *
    + * + * \cgalHeading{Oriented Side of a Point and a Polygon} + * + * The functions in the second group accept a point `p` and a polygon `pgn`. + * Each function in this group returns `ON_POSITIVE_SIDE` if the point `p` + * is in the interior of `pgn`, `ON_NEGATIVE_SIDE` if `p` is in the exterior + * of `pgn`, and `ON_ORIENTED_BOUNDARY` if `p` is on the boundary of `pgn`. + * + * A function in this subgroup has one of the two following signatures: + * - `Oriented_side oriented_side(const Point_2& p, const Type& pgn);` + * - `Oriented_side oriented_side(const Point_2& p, const Type& pgn, + * const GpsTraits& traits);` + * + * \cgalHeading{Parameters} + * + * `Type` must be convertible to one of + * `Polygon_2`, + * `Polygon_with_holes_2`, + * `General_polygon_2`, or + * `General_polygon_with_holes_2`. + * + * \sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink + */ /// @{ -template -Oriented_side oriented_side(const Polygon_2 & p1, - const Polygon_2 & p2); +// Polygon--Polygon Traits-less +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + */ +template +Oriented_side oriented_side(const Polygon_2& pgn1, + const Polygon_2& pgn2); -template -Oriented_side oriented_side(const Polygon_2 & p1, - const Polygon_with_holes_2 & p2); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + */ +template +Oriented_side +oriented_side(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + */ +template +Oriented_side oriented_side(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2); -template -Oriented_side oriented_side(const Polygon_with_holes_2 & p1, - const Polygon_2 & p2); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + */ +template +Oriented_side +oriented_side(const Polygon_with_holes_2& pgn1, + const Polygon_with_holes_2& pgn2); +/*! computes the relative position of two polygons. + * \param pgn1 1st the input polygon. + * \param pgn2 the 2nd input polygon. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template +Oriented_side oriented_side(const General_polygon_2& pgn1, + const General_polygon_2& pgn2); -template -Oriented_side oriented_side(const Polygon_with_holes_2 & p1, - const Polygon_with_holes_2 & p2); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template +Oriented_side +oriented_side(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template +Oriented_side +oriented_side(const General_polygon_with_holes_2 >& pgn1, + const General_polygon_2& pgn2); -template -Oriented_side oriented_side(const General_polygon_2 & p1, - const General_polygon_2 & p2); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + */ +template +Oriented_side oriented_side(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2); +//////// Polygon--Polygon With Traits -template -Oriented_side oriented_side(const General_polygon_2 & p1, - const General_polygon_with_holes_2 > & p2); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +Oriented_side oriented_side(const Polygon_2& pgn1, + const Polygon_2& pgn2, + const GpsTraits& traits); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +Oriented_side oriented_side(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2, + const GpsTraits& traits); -template -Oriented_side oriented_side(const General_polygon_with_holes_2 > & p1, - const General_polygon_2 & p2); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +Oriented_side oriented_side(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2, + const GpsTraits& traits); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +Oriented_side oriented_side(const Polygon_with_holes_2& pgn1, + const Polygon_with_holes_2& pgn2, + const GpsTraits& traits); -template -Oriented_side oriented_side(const General_polygon_with_holes_2 & p1, - const General_polygon_with_holes_2 & p2); +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + * + */ +template +Oriented_side oriented_side(const General_polygon_2& pgn1, + const General_polygon_2& pgn2, + const GpsTraits& traits); + +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + * + */ +template +Oriented_side +oriented_side(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2, + const GpsTraits& traits); + +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + * + */ +template +Oriented_side +oriented_side(const General_polygon_with_holes_2 >& pgn1, + const General_polygon_2& pgn2, + const GpsTraits& traits); + +/*! computes the relative position of two polygons. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param traits a traits object. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +Oriented_side oriented_side(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2, + const GpsTraits& traits); + +// Point--Polygon Traits-less + +/*! computes the relative position of a point and a polygon. + * \param p the input point. + * \param pgn the input polygon. + */ +template +Oriented_side oriented_side(const Point_2& p, + const Polygon_2& pgn); + +/*! computes the relative position of a point and a polygon. + * \param p the input point. + * \param pgn the input polygon. + */ +template +Oriented_side oriented_side(const Point_2& p, + const Polygon_with_holes_2& pgn); + +/*! computes the relative position of a point and a polygon. + * \param p the input point. + * \param pgn the input polygon. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template +Oriented_side oriented_side(const Point_2& p, + const General_polygon_2& pgn); + +/*! computes the relative position of a point and a polygon. + * \param p the input point. + * \param pgn the input polygon. + */ +template +Oriented_side oriented_side(const Point_2& p, + const General_polygon_with_holes_2& pgn); + +//////// Point--Polygon With Traits + +/*! computes the relative position of a point and a polygon. + * \param p the input point. + * \param pgn the input polygon. + * \param traits a traits object. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +Oriented_side oriented_side(const Point_2& p, + const Polygon_2& pgn, + const GpsTraits& traits); + +/*! computes the relative position of a point and a polygon. + * \param p the input point. + * \param pgn the input polygon. + * \param traits a traits object. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +Oriented_side oriented_side(const Point_2& p, + const Polygon_with_holes_2& pgn, + const GpsTraits& traits); + +/*! computes the relative position of a point and a polygon. + * \param p the input point. + * \param pgn the input polygon. + * \param traits a traits object. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +Oriented_side oriented_side(const Point_2& p, + const General_polygon_2& pgn, + const GpsTraits& traits); + +/*! computes the relative position of a point and a polygon. + * \param p the input point. + * \param pgn the input polygon. + * \param traits a traits object. + * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + */ +template +Oriented_side oriented_side(const Point_2& p, + const General_polygon_with_holes_2& pgn, + const GpsTraits& traits); /// @} } /* namespace CGAL */ namespace CGAL { -/*! -\addtogroup boolean_symmetric_difference Symmetric Difference Functions -\ingroup PkgBooleanSetOperations2Ref -\anchor ref_bso_symmetric_difference +/*! \addtogroup boolean_symmetric_difference Symmetric Difference Functions + * \ingroup PkgBooleanSetOperations2Ref + * \anchor ref_bso_symmetric_difference + * + * There are several overloaded function templates called + * `symmetric_difference()` that compute the \e symmetric difference + * between two or more input polygons and insert the resulting + * polygons with holes into a container via an output iterator. -Each one of these functions computes the symmetric difference between -two given polygons `p1` and `p2`, and inserts the resulting -polygons with holes into an output container through the output -iterator `oi`. The value type of the `OutputIterator` is either -`Polygon_with_holes_2` or -`General_polygon_with_holes_2`. - -The signature of the function is: - - `%OutputIterator symmetric_difference(const Type1 & p1, const Type2 & p2, %OutputIterator oi);` - -\cgalHeading{Parameters} - -The types of the parameters of the `symmetric_difference()` function are any of the following combinations. - -
    - - - - - - - - - - -
    Arg 1 typeArg 2 type
    Polygon_2Polygon_2
    Polygon_2Polygon_with_holes_2
    Polygon_with_holes_2Polygon_2
    Polygon_with_holes_2Polygon_with_holes_2
    General_polygon_2General_polygon_2
    General_polygon_2General_polygon_with_holes_2
    General_polygon_with_holes_2General_polygon_2
    General_polygon_with_holes_2General_polygon_with_holes_2
    -
    - - -\sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink -\sa \link boolean_intersection `CGAL::intersection()` \endlink -\sa \link boolean_join `CGAL::join()` \endlink -\sa \link boolean_difference `CGAL::difference()` \endlink - -*/ + * + * A function template in this group that accepts two input polygons has one of + * the two following signatures: + * - `OutputIterator symmetric_difference(const Type1& pgn1, const Type2& pgn2, + * OutputIterator oi);` + * - `OutputIterator symmetric_difference(const Type1& pgn1, const Type2& pgn2, + * OutputIterator oi, const GpsTraits& traits);` + * + * \param oi the output iterator for the result. + * + * The types `Type1` and `Type2` of the parameters must be convertible to the + * types specified in a row in the table below, respectively. The 3rd column + * specifies the corresponding dereference type of the output iterator. + * + *
    + * + * + * + * + * + * + * + * + * + * + *
    `Type1` `Type2` %Dereference Type of `oi`
    `Polygon_2` `Polygon_2` `Polygon_with_holes_2`
    `Polygon_2` `Polygon_with_holes_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_2` `Polygon_with_holes_2`
    `Polygon_with_holes_2` `Polygon_with_holes_2` `Polygon_with_holes_2`
    `General_polygon_2` `General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_2` `General_polygon_with_holes_2``General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_2` `General_polygon_with_holes_2`
    `General_polygon_with_holes_2``General_polygon_with_holes_2``General_polygon_with_holes_2`
    + *
    + * + * \sa \link boolean_complement `CGAL::complement()` \endlink + * \sa \link boolean_do_intersect `CGAL::do_intersect()` \endlink + * \sa \link boolean_intersection `CGAL::intersection()` \endlink + * \sa \link boolean_join `CGAL::join()` \endlink + * \sa \link boolean_difference `CGAL::difference()` \endlink + */ /// @{ -OutputIterator symmetric_difference(const Type1 & p1, const Type2 & p2, +//////// Traits-less + +/*! computes the symmetric difference between two polygons and inserts the + * resulting polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. + */ +template +OutputIterator symmetric_difference(const Polygon_2& pgn1, + const Polygon_2& pgn2, + OutputIterator oi); + +/*! computes the symmetric difference between two polygons and inserts the + * resulting polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. + */ +template +OutputIterator +symmetric_difference(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2, + OutputIterator oi); + +/*! computes the symmetric difference between two polygons and inserts the + * resulting polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. + */ +template +OutputIterator +symmetric_difference(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2, + OutputIterator oi); + + +/*! computes the symmetric difference between two polygons with holes and + * inserts the resulting polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. + */ +template +OutputIterator +symmetric_difference(const Polygon_with_holes_2& pgn1, + const Polygon_with_holes_2& pgn2, + OutputIterator oi); + +/*! computes the symmetric difference between two general polygons and inserts + * the resulting general polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2 >`. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template +OutputIterator symmetric_difference(const General_polygon_2& pgn1, + const General_polygon_2& pgn2, OutputIterator oi); -template -OutputIterator symmetric_difference(const Polygon_2 & p1, - const Polygon_2 & p2, - OutputIterator oi); - - -template +/*! computes the symmetric difference between two general polygons and inserts + * the resulting general polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2 >`. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template OutputIterator -symmetric_difference(const Polygon_2 & p1, - const Polygon_with_holes_2 & p2, - OutputIterator oi); - -template -OutputIterator -symmetric_difference(const Polygon_with_holes_2 & p1, - const Polygon_2 & p2, +symmetric_difference(const General_polygon_with_holes_2 >& pgn1, + const General_polygon_2& pgn2, OutputIterator oi); -template +/*! computes the symmetric difference between two general polygons and inserts + * the resulting general polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2 >`. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + */ +template OutputIterator -symmetric_difference(const Polygon_with_holes_2 & p1, - const Polygon_with_holes_2 & p2, +symmetric_difference(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2, OutputIterator oi); - -template -OutputIterator symmetric_difference(const General_polygon_2 & p1, - const General_polygon_2 & p2, - OutputIterator oi); - - -template +/*! computes the symmetric difference between two general polygons and inserts + * the resulting general polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2`. + * \return the past-the-end iterator of the output container. + */ +template OutputIterator -symmetric_difference(const General_polygon_with_holes_2 > & p1, - const General_polygon_2 & p2, +symmetric_difference(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2, OutputIterator oi); - -template -OutputIterator -symmetric_difference(const General_polygon_2 & p1, - const General_polygon_with_holes_2 > & p2, - OutputIterator oi); - - -template -OutputIterator -symmetric_difference(const General_polygon_with_holes_2 & p1, - const General_polygon_with_holes_2 & p2, - OutputIterator oi); - - /*! - computes the symmetric difference of the general polygons (or general - polygons with holes) in the given range. A point is contained in the - symmetric difference, if and only if it is contained in an odd number of - input polygons. (The value type of the input iterator is used to - distinguish between the two.) The result, represented by a set - of general polygon with holes, is inserted into an output container - through a given output iterator `oi`. The output iterator is - returned. The value type of the `OutputIterator` is - `Traits::Polygon_with_holes_2`. - */ -template +/*! Given a range of polygons (resp. general polygons) or a range of general + * polygons with holes (resp. general polygons with holes) computes the + * symmetric difference of all polygons in the range and inserts the resulting + * polygons with holes (resp. general polygons with holes) into a container via + * an output iterator. A point is contained in the symmetric difference, if and + * only if it is contained in an odd number of input polygons. + * \param begin the first iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param end the past-the-end iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2` (resp. `General_polygons_with_holes_2`). + * \return the past-the-end iterator of the output container. + */ +template OutputIterator symmetric_difference(InputIterator begin, InputIterator end, OutputIterator oi); - /*! - computes the symmetric difference of the general polygons and general polygons - with holes in the given two ranges. A point is contained in the - symmetric difference, if and only if it is contained in an odd number of - input polygons. The result, represented by a set of general polygon with - holes, is inserted into an output container through a given output - iterator `oi`. The output iterator is returned. The value type of - the `OutputIterator` is `Traits::Polygon_with_holes_2`. - */ -template -OutputIterator symmetric_difference(InputIterator1 pgn_begin1, - InputIterator1 pgn_end1, - InputIterator2 pgn_begin2, - InputIterator2 pgn_end2, +/*! Given a range of polygons (resp. general polygons) and a range of general + * polygons with holes (resp. general polygons with holes) computes the + * intersection of all polygons in the two ranges and inserts the resulting + * polygons with holes (resp. general polygons with holes) into a container via + * an output iterator. A point is contained in the symmetric difference, if and + * only if it is contained in an odd number of input polygons. + * \param begin1 the first iterator of the 1st input range. Its value type is + * `Polygon_2` (resp. `General_polygon_2`). + * \param end1 the past-the-end iterator of the 1st input range. Its value + * type is `Polygon_2` (resp. `General_polygon_2`). + * \param begin2 the first iterator of the 2nd input range. Its value type + * is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param end2 the past-the-end iterator of the 2nd input range. Its value + * type is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2` (resp. `General_polygons_with_holes_2`). + * \return the past-the-end iterator of the output container. + */ +template +OutputIterator symmetric_difference(InputIterator1 begin1, InputIterator1 end1, + InputIterator2 begin2, InputIterator2 end2, OutputIterator oi); + +//////// With Traits + +/*! computes the symmetric difference between two polygons and inserts the + * resulting polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator symmetric_difference(const Polygon_2& pgn1, + const Polygon_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the symmetric difference between two polygons and inserts the + * resulting polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator +symmetric_difference(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the symmetric difference between two polygons and inserts the + * resulting polygons with holes into a container via an output iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator +symmetric_difference(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + + +/*! computes the symmetric difference between two polygons with holes and + * inserts the resulting polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator +symmetric_difference(const Polygon_with_holes_2& pgn1, + const Polygon_with_holes_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the symmetric difference between two general polygons and inserts + * the resulting general polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2 >`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator symmetric_difference(const General_polygon_2& pgn1, + const General_polygon_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + + +/*! computes the symmetric difference between two general polygons and inserts + * the resulting general polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2 >`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator +symmetric_difference(const General_polygon_with_holes_2 >& pgn1, + const General_polygon_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + + +/*! computes the symmetric difference between two general polygons and inserts + * the resulting general polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2 >`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre `%ArrTraits` must be a model of the concept + * `ArrangementDirectionalXMonotoneTraits_2`. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator +symmetric_difference(const General_polygon_2& pgn1, + const General_polygon_with_holes_2 >& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! computes the symmetric difference between two general polygons and inserts + * the resulting general polygons with holes into a container via an output + * iterator. + * \param pgn1 the 1st input polygon. + * \param pgn2 the 2nd input polygon. + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `General_polygon_with_holes_2`. + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator +symmetric_difference(const General_polygon_with_holes_2& pgn1, + const General_polygon_with_holes_2& pgn2, + OutputIterator oi, + const GpsTraits& traits); + +/*! Given a range of polygons (resp. general polygons) or a range of general + * polygons with holes (resp. general polygons with holes) computes the + * symmetric difference of all polygons in the range and inserts the resulting + * polygons with holes (resp. general polygons with holes) into a container via + * an output iterator. A point is contained in the symmetric difference, if and + * only if it is contained in an odd number of input polygons. + * \param begin the first iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param end the past-the-end iterator of the input range. Its value type is + * either `Polygon_2` (resp. `General_polygon_2`) or `Polygon_with_holes_2` + * (resp. `General_polygon_with_holes_2`). + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2` (resp. `General_polygons_with_holes_2`). + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator symmetric_difference(InputIterator begin, InputIterator end, + OutputIterator oi, + const GpsTraits& traits); + +/*! Given a range of polygons (resp. general polygons) and a range of general + * polygons with holes (resp. general polygons with holes) computes the + * intersection of all polygons in the two ranges and inserts the resulting + * polygons with holes (resp. general polygons with holes) into a container via + * an output iterator. A point is contained in the symmetric difference, if and + * only if it is contained in an odd number of input polygons. + * \param begin1 the first iterator of the 1st input range. Its value type is + * `Polygon_2` (resp. `General_polygon_2`). + * \param end1 the past-the-end iterator of the 1st input range. Its value + * type is `Polygon_2` (resp. `General_polygon_2`). + * \param begin2 the first iterator of the 2nd input range. Its value type + * is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param end2 the past-the-end iterator of the 2nd input range. Its value + * type is `Polygon_with_holes_2` (resp. `General_polygon_with_holes_2`). + * \param oi the output iterator for the result. + * Its dereference type must be convertible to + * `Polygon_with_holes_2` (resp. `General_polygons_with_holes_2`). + * \param traits a traits object. + * \return the past-the-end iterator of the output container. + * \pre GpsTraits must be a model of `GeneralPolygonSetTraits_2`. + */ +template +OutputIterator symmetric_difference(InputIterator1 begin1, InputIterator1 end1, + InputIterator2 begin2, InputIterator2 end2, + OutputIterator oi, + const GpsTraits& traits); + /// @} } /* namespace CGAL */ - diff --git a/Boolean_set_operations_2/examples/Boolean_set_operations_2/oriented_side.cpp b/Boolean_set_operations_2/examples/Boolean_set_operations_2/oriented_side.cpp new file mode 100644 index 00000000000..80a4f3ff66f --- /dev/null +++ b/Boolean_set_operations_2/examples/Boolean_set_operations_2/oriented_side.cpp @@ -0,0 +1,45 @@ +/*! \file oriented_side.cpp + * Compute the oriented side of a point and a polygon with holes. + */ + +#include +#include + +typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; +typedef Kernel::Point_2 Point_2; +typedef CGAL::Polygon_2 Polygon_2; +typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; + +# define nice(os) ((os == CGAL::ON_ORIENTED_BOUNDARY) ? "on boundary" : \ + (os == CGAL::POSITIVE) ? "inside" : "outside") + +int main() { + Polygon_2 hole; + hole.push_back(Point_2(1, 1)); + hole.push_back(Point_2(1, 2)); + hole.push_back(Point_2(2, 2)); + hole.push_back(Point_2(2, 1)); + + Polygon_2 out; + out.push_back(Point_2(0, 0)); + out.push_back(Point_2(3, 0)); + out.push_back(Point_2(3, 3)); + out.push_back(Point_2(0, 3)); + + Polygon_with_holes_2 pwh(out, &hole, &hole+1); + std::cout << pwh << std::endl; + + auto os = CGAL::oriented_side(Point_2(0, 0), pwh); + std::cout << "(0,0) is : " << nice(os) << std::endl; + os = CGAL::oriented_side(Point_2(0.5, 0.5), pwh); + std::cout << "(0,0) is : " << nice(os) << std::endl; + os = CGAL::oriented_side(Point_2(1, 1), pwh); + std::cout << "(0,0) is : " << nice(os) << std::endl; + os = CGAL::oriented_side(Point_2(2.5, 2.5), pwh); + std::cout << "(0,0) is : " << nice(os) << std::endl; + os = CGAL::oriented_side(Point_2(3, 3), pwh); + std::cout << "(0,0) is : " << nice(os) << std::endl; + os = CGAL::oriented_side(Point_2(3.5, 3.5), pwh); + std::cout << "(0,0) is : " << nice(os) << std::endl; + return 0; +} diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2.h index 6d96107a443..8d854a38de4 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2.h @@ -809,7 +809,7 @@ OutputIterator complement (const Polygon_with_holes_2& pgn, } template -OutputIterator complement (const General_polygon_with_holes_2& pgn, +OutputIterator complement (const General_polygon_with_holes_2 >& pgn, OutputIterator oi, Traits& tr) { General_polygon_set_2 gps(tr); diff --git a/Bounding_volumes/examples/Approximate_min_ellipsoid_d/CMakeLists.txt b/Bounding_volumes/examples/Approximate_min_ellipsoid_d/CMakeLists.txt index 7e50747fa0f..f71cad75754 100644 --- a/Bounding_volumes/examples/Approximate_min_ellipsoid_d/CMakeLists.txt +++ b/Bounding_volumes/examples/Approximate_min_ellipsoid_d/CMakeLists.txt @@ -5,7 +5,7 @@ find_package(CGAL REQUIRED) # Use Eigen find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) # create a target per cppfile file( @@ -13,11 +13,11 @@ file( RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) foreach(cppfile ${cppfiles}) - if(NOT (${cppfile} STREQUAL "ellipsoid.cpp") OR TARGET CGAL::Eigen_support) + if(NOT (${cppfile} STREQUAL "ellipsoid.cpp") OR TARGET CGAL::Eigen3_support) get_filename_component(target ${cppfile} NAME_WE) create_single_source_cgal_program(${cppfile}) - if(TARGET CGAL::Eigen_support) - target_link_libraries(${target} PRIVATE CGAL::CGAL CGAL::Eigen_support) + if(TARGET CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::CGAL CGAL::Eigen3_support) else() target_link_libraries(${target} PRIVATE CGAL::CGAL) endif() diff --git a/Bounding_volumes/include/CGAL/Min_annulus_d.h b/Bounding_volumes/include/CGAL/Min_annulus_d.h index 70f45488c0b..0be72c1b427 100644 --- a/Bounding_volumes/include/CGAL/Min_annulus_d.h +++ b/Bounding_volumes/include/CGAL/Min_annulus_d.h @@ -32,9 +32,10 @@ #include #include #include -#include #include +#include + // here is how it works. We have d+2 variables: // R (big radius), r (small radius), c (center). The problem is // @@ -258,9 +259,6 @@ private: typedef QP_access_by_index ::const_iterator, int> Point_by_index; - typedef boost::binder2nd< std::divides > - Divide; - typedef std::vector Index_vector; typedef std::vector NT_vector; @@ -272,7 +270,7 @@ public: typedef CGAL::Join_input_iterator_1< Basic_variable_index_iterator, - CGAL::Unary_compose_1 > + std::function > Support_point_iterator; @@ -331,9 +329,7 @@ public: "support_points_begin: not enough points"); return Support_point_iterator( solver->basic_original_variable_indices_begin(), - CGAL::compose1_1( - Point_by_index( points.begin()), - boost::bind2nd( std::divides(), 2))); + [this](int i){ return Point_by_index(this->points.begin())(i/2); }); } Support_point_iterator @@ -342,9 +338,7 @@ public: "support_points_begin: not enough points"); return Support_point_iterator( solver->basic_original_variable_indices_end(), - CGAL::compose1_1( - Point_by_index( points.begin()), - boost::bind2nd( std::divides(), 2))); + [this](int i){ return Point_by_index(this->points.begin())(i/2); }); } int number_of_inner_support_points() const { return static_cast(inner_indices.size());} @@ -592,9 +586,7 @@ private: bool check_dimension( std::size_t offset = 0) { return ( std::find_if( points.begin()+offset, points.end(), - CGAL::compose1_1( boost::bind2nd( - std::not_equal_to(), d), - tco.access_dimension_d_object())) + [this](const Point& p){ return this->d != this->tco.access_dimension_d_object()(p); }) == points.end()); } // compute smallest enclosing annulus diff --git a/Bounding_volumes/include/CGAL/Rectangular_p_center_traits_2.h b/Bounding_volumes/include/CGAL/Rectangular_p_center_traits_2.h index 4233123e225..bc93c75bf74 100644 --- a/Bounding_volumes/include/CGAL/Rectangular_p_center_traits_2.h +++ b/Bounding_volumes/include/CGAL/Rectangular_p_center_traits_2.h @@ -290,8 +290,8 @@ bounding_box_2(ForwardIterator f, ForwardIterator l, const Traits& t) return rect(v(rect(*xmin, *ymin), 0), v(rect(*xmax, *ymax), 2)); } // bounding_box_2(f, l, t) template < class ForwardIterator > -inline typename -std::iterator_traits< ForwardIterator >::value_type::R::Iso_rectangle_2 +inline +auto bounding_box_2(ForwardIterator f, ForwardIterator l) // PRE: f != l. { diff --git a/Bounding_volumes/include/CGAL/min_quadrilateral_2.h b/Bounding_volumes/include/CGAL/min_quadrilateral_2.h index 867593b2d1d..dfa0eb1e30c 100644 --- a/Bounding_volumes/include/CGAL/min_quadrilateral_2.h +++ b/Bounding_volumes/include/CGAL/min_quadrilateral_2.h @@ -20,8 +20,7 @@ #include #include #include -#include -#include +#include #ifdef CGAL_OPTIMISATION_EXPENSIVE_PRECONDITION_TAG #include @@ -70,13 +69,16 @@ convex_bounding_box_2( typedef typename Traits::Point_2 Point_2; typedef typename Traits::Less_xy_2 Less_xy_2; typedef typename Traits::Less_yx_2 Less_yx_2; - typedef boost::function2 Greater_xy_2; - typedef boost::function2 Greater_yx_2; + typedef std::function Greater_xy_2; + typedef Greater_xy_2 Greater_yx_2; Less_xy_2 less_xy_2 = t.less_xy_2_object(); Less_yx_2 less_yx_2 = t.less_yx_2_object(); - Greater_xy_2 greater_xy_2 = boost::bind(less_xy_2, _2, _1); - Greater_yx_2 greater_yx_2 = boost::bind(less_yx_2, _2, _1); + Greater_xy_2 greater_xy_2 = [&less_xy_2](const Point_2& p1, const Point_2& p2) + { return less_xy_2(p2, p1); }; + Greater_yx_2 greater_yx_2 = [&less_yx_2](const Point_2& p1, const Point_2& p2) + { return less_yx_2(p2, p1); }; if (less_xy_2(*minx, *f) || (less_yx_2(*minx, *f) && !less_xy_2(*f, *minx))) @@ -268,21 +270,21 @@ namespace Optimisation { // --------------------------------------------------------------- // Right_of_implicit_line_2 // --------------------------------------------------------------- - typedef boost::function3 + typedef std::function Right_of_implicit_line_2; Right_of_implicit_line_2 right_of_implicit_line_2_object() const { - return boost::bind(has_on_negative_side_2_object(), - boost::bind(construct_line_2_object(), _2, _3), - _1); + return [this](const Point_2& p1, const Point_2& p2, const Direction_2& d) + { return this->has_on_negative_side_2_object()(this->construct_line_2_object()(p2, d), p1); }; } - typedef boost::function2 + typedef std::function Construct_direction_2; Construct_direction_2 construct_direction_2_object() const { - return boost::bind(Base::construct_direction_2_object(), - boost::bind(construct_vector_2_object(), _1, _2)); + return [this](const Point_2& p1, const Point_2& p2) + { return this->Base::construct_direction_2_object()( + this->construct_vector_2_object()(p1, p2)); }; } template < class Kernel > @@ -324,13 +326,11 @@ namespace Optimisation { rotate_direction_by_multiple_of_pi_2_object() const { return Rotate_direction_by_multiple_of_pi_2(*this); } - typedef boost::function2 + typedef std::function Less_angle_with_x_axis_2; Less_angle_with_x_axis_2 less_angle_with_x_axis_2_object() const { - return boost::bind(std::equal_to(), - boost::bind(compare_angle_with_x_axis_2_object(), - _1, _2), - SMALLER); + return [this](const Direction_2& d1, const Direction_2& d2) + { return this->compare_angle_with_x_axis_2_object()(d1, d2) == SMALLER; }; } }; diff --git a/Bounding_volumes/include/CGAL/pierce_rectangles_2.h b/Bounding_volumes/include/CGAL/pierce_rectangles_2.h index 9a3bfb91883..ebaf8081e1c 100644 --- a/Bounding_volumes/include/CGAL/pierce_rectangles_2.h +++ b/Bounding_volumes/include/CGAL/pierce_rectangles_2.h @@ -22,7 +22,6 @@ #include #include #include -#include #if defined(BOOST_MSVC) # pragma warning(push) @@ -235,14 +234,16 @@ struct Staircases : public Loc_domain< Traits_ > { do { brstc.push_back(*i++); i = find_if(i, ysort.end(), - boost::bind(this->traits.less_x_2_object(), brstc.back(), _1)); + [this](const Point_2& p) + { return this->traits.less_x_2_object()(this->brstc.back(), p);}); } while (i != ysort.end()); // top-left Riterator j = ysort.rbegin(); do { tlstc.push_back(*j++); j = find_if(j, ysort.rend(), - boost::bind(this->traits.less_x_2_object(), _1, tlstc.back())); + [this](const Point_2& p) + { return this->traits.less_x_2_object()(p, this->tlstc.back());}); } while (j != ysort.rend()); // build left-bottom and right-top staircases @@ -252,14 +253,16 @@ struct Staircases : public Loc_domain< Traits_ > { do { lbstc.push_back(*i++); i = find_if(i, xsort.end(), - boost::bind(this->traits.less_y_2_object(), _1, lbstc.back())); + [this](const Point_2& p) + { return this->traits.less_y_2_object()(p, this->lbstc.back());}); } while (i != xsort.end()); // right-top j = xsort.rbegin(); do { rtstc.push_back(*j++); j = find_if(j, xsort.rend(), - boost::bind(this->traits.less_y_2_object(), rtstc.back(), _1)); + [this](const Point_2& p) + { return this->traits.less_y_2_object()(this->rtstc.back(), p);}); } while (j != xsort.rend()); } // Staircases(b, e, t) @@ -300,16 +303,20 @@ struct Staircases : public Loc_domain< Traits_ > { min_element_if( this->pts.begin(), this->pts.end(), this->traits.less_x_2_object(), - boost::bind(std::logical_and< bool >(), - boost::bind(this->traits.less_x_2_object(), p, _1), - boost::bind(this->traits.less_y_2_object(), p, _1))); + [&p, this](const Point_2& pt) + { + return this->traits.less_x_2_object()(p, pt) && + this->traits.less_y_2_object()(p, pt); + }); Citerator j = max_element_if( this->pts.begin(), this->pts.end(), this->traits.less_x_2_object(), - boost::bind(std::logical_and< bool >(), - boost::bind(this->traits.less_x_2_object(), _1, q), - boost::bind(this->traits.less_y_2_object(), q, _1))); + [&q, this](const Point_2& pt) + { + return this->traits.less_x_2_object()(pt, q) && + this->traits.less_y_2_object()(q, pt); + }); return Intervall(i == this->pts.end() ? this->maxx : *i, j == this->pts.end() ? this->minx : *j); } // top_intervall() @@ -326,16 +333,20 @@ struct Staircases : public Loc_domain< Traits_ > { min_element_if( this->pts.begin(), this->pts.end(), this->traits.less_x_2_object(), - boost::bind(std::logical_and< bool >(), - boost::bind(this->traits.less_x_2_object(), p, _1), - boost::bind(this->traits.less_y_2_object(), _1, p))); + [&p, this](const Point_2& pt) + { + return this->traits.less_x_2_object()(p, pt) && + this->traits.less_y_2_object()(pt, p); + }); Citerator j = max_element_if( this->pts.begin(), this->pts.end(), this->traits.less_x_2_object(), - boost::bind(std::logical_and< bool >(), - boost::bind(this->traits.less_x_2_object(), _1, q), - boost::bind(this->traits.less_y_2_object(), _1, q))); + [&q, this](const Point_2& pt) + { + return this->traits.less_x_2_object()(pt, q) && + this->traits.less_y_2_object()(pt, q); + }); return Intervall(i == this->pts.end() ? this->maxx : *i, j == this->pts.end() ? this->minx : *j); } // bottom_intervall() @@ -352,16 +363,20 @@ struct Staircases : public Loc_domain< Traits_ > { min_element_if( this->pts.begin(), this->pts.end(), this->traits.less_y_2_object(), - boost::bind(std::logical_and< bool >(), - boost::bind(this->traits.less_x_2_object(), _1, p), - boost::bind(this->traits.less_y_2_object(), p, _1))); + [&p, this](const Point_2& pt) + { + return this->traits.less_x_2_object()(pt, p) && + this->traits.less_y_2_object()(p, pt); + }); Citerator j = max_element_if( this->pts.begin(), this->pts.end(), this->traits.less_y_2_object(), - boost::bind(std::logical_and< bool >(), - boost::bind(this->traits.less_x_2_object(), _1, q), - boost::bind(this->traits.less_y_2_object(), _1, q))); + [&q, this](const Point_2& pt) + { + return this->traits.less_x_2_object()(pt, q) && + this->traits.less_y_2_object()(pt, q); + }); return Intervall(i == this->pts.end() ? this->maxy : *i, j == this->pts.end() ? this->miny : *j); } // left_intervall() @@ -378,16 +393,20 @@ struct Staircases : public Loc_domain< Traits_ > { min_element_if( this->pts.begin(), this->pts.end(), this->traits.less_y_2_object(), - boost::bind(std::logical_and< bool >(), - boost::bind(this->traits.less_x_2_object(), p, _1), - boost::bind(this->traits.less_y_2_object(), p, _1))); + [&p, this](const Point_2& pt) + { + return this->traits.less_x_2_object()(p, pt) && + this->traits.less_y_2_object()(p, pt); + }); Citerator j = max_element_if( this->pts.begin(), this->pts.end(), this->traits.less_y_2_object(), - boost::bind(std::logical_and< bool >(), - boost::bind(this->traits.less_x_2_object(), q, _1), - boost::bind(this->traits.less_y_2_object(), _1, q))); + [&q, this](const Point_2& pt) + { + return this->traits.less_x_2_object()(q, pt) && + this->traits.less_y_2_object()(pt, q); + }); return Intervall(i == this->pts.end() ? this->maxy : *i, j == this->pts.end() ? this->miny : *j); } // right_intervall() @@ -487,6 +506,7 @@ two_cover_points( using std::less; typedef typename Traits::FT FT; + typedef typename Traits::Point_2 Point_2; typename Traits::Infinity_distance_2 dist = d.traits.infinity_distance_2_object(); typename Traits::Signed_infinity_distance_2 sdist = @@ -504,11 +524,8 @@ two_cover_points( if (d.end() == find_if(d.begin(), d.end(), - boost::bind(less(), - d.r, - boost::bind(Min(), - boost::bind(dist, d[0], _1), - boost::bind(dist, d[2], _1))))) + [&dist,&d](const Point_2& p) + { return d.r < Min()(dist(d[0], p), dist(d[2],p)); })) { *o++ = d[0]; *o++ = d[2]; @@ -520,11 +537,8 @@ two_cover_points( if (d.end() == find_if(d.begin(), d.end(), - boost::bind(less(), - d.r, - boost::bind(Min(), - boost::bind(dist, d[1], _1), - boost::bind(dist, d[3], _1))))) + [&dist,&d](const Point_2& p) + { return d.r < Min()(dist(d[1], p), dist(d[3],p)); })) { *o++ = d[1]; *o++ = d[3]; @@ -551,7 +565,6 @@ three_cover_points( CGAL_optimisation_precondition(!d.empty()); // typedefs: - typedef typename Traits::FT FT; typedef typename Traits::Point_2 Point_2; typedef typename Loc_domain< Traits >::Iterator Iterator; typename Traits::Infinity_distance_2 dist = @@ -565,7 +578,8 @@ three_cover_points( // find first point not covered by the rectangle at d[k] Iterator i = find_if(d.begin(), d.end(), - boost::bind(less(), d.r, boost::bind(dist, corner, _1))); + [&d,&dist, &corner](const Point_2& p) + { return d.r < dist(corner, p); }); // are all points already covered? if (i == d.end()) { @@ -608,12 +622,12 @@ three_cover_points( CGAL_optimisation_expensive_assertion( save_end == find_if(d.end(), save_end, - boost::bind(less(), d.r, boost::bind(dist, corner, _1)))); + [&d, &dist, &corner](const Point_2& p) + { return d.r < dist(corner, p); })); CGAL_optimisation_expensive_assertion( d.end() == find_if(d.begin(), d.end(), - boost::bind(std::greater_equal(), - d.r, - boost::bind(dist, corner, _1)))); + [&d,&dist, &corner](const Point_2& p) + { return d.r >= dist(corner, p); })); two_cover_points(d, o, ok); @@ -702,7 +716,8 @@ four_cover_points(Staircases< Traits >& d, OutputIterator o, bool& ok) // find first point not covered by the rectangle at d[k] Iterator i = find_if(d.begin(), d.end(), - boost::bind(less(), d.r, boost::bind(dist, corner, _1))); + [&d,&dist,&corner](const Point_2& p) + { return d.r < dist(corner, p); }); // are all points already covered? if (i == d.end()) { @@ -745,12 +760,12 @@ four_cover_points(Staircases< Traits >& d, OutputIterator o, bool& ok) CGAL_optimisation_expensive_assertion( save_end == find_if(d.end(), save_end, - boost::bind(less(), d.r, boost::bind(dist, corner, _1)))); + [&d,&dist,&corner](const Point_2& p) + { return d.r < dist(corner, p); })); CGAL_optimisation_expensive_assertion( d.end() == find_if(d.begin(), d.end(), - boost::bind(std::greater_equal(), - d.r, - boost::bind(dist, corner, _1)))); + [&d,&dist,&corner](const Point_2& p) + { return d.r >= dist(corner, p); })); three_cover_points(d, o, ok); diff --git a/Bounding_volumes/include/CGAL/rectangular_3_center_2.h b/Bounding_volumes/include/CGAL/rectangular_3_center_2.h index 531fe486fd4..cd3a1f14bee 100644 --- a/Bounding_volumes/include/CGAL/rectangular_3_center_2.h +++ b/Bounding_volumes/include/CGAL/rectangular_3_center_2.h @@ -22,8 +22,6 @@ #include #include #include -#include -#include namespace CGAL { @@ -38,8 +36,6 @@ rectangular_2_center_2( Traits& t) { using std::pair; - using std::greater; - using std::less; typedef typename Traits::Iso_rectangle_2 Rectangle; typedef typename Traits::Point_2 Point; @@ -53,7 +49,6 @@ rectangular_2_center_2( P_below_right; typedef typename Traits::Construct_point_2_below_left_implicit_point_2 P_below_left; - typedef boost::function1 Gamma; // fetch function objects from traits class CVertex v = t.construct_vertex_2_object(); @@ -72,15 +67,15 @@ rectangular_2_center_2( // two cases: top-left & bottom-right or top-right & bottom-left Min< FT > minft; - Gamma gamma1 = - boost::bind(minft, boost::bind(dist, v(bb, 0), _1), boost::bind(dist, v(bb, 2), _1)); - Gamma gamma2 = - boost::bind(minft, boost::bind(dist, v(bb, 1), _1), boost::bind(dist, v(bb, 3), _1)); + auto gamma1 = + [&minft, &bb, &dist, &v](const Point& p){ return minft(dist( v(bb, 0), p), dist(v(bb, 2),p));}; + auto gamma2 = + [&minft, &bb, &dist, &v](const Point& p){ return minft(dist( v(bb, 1), p), dist(v(bb, 3),p));}; pair< ForwardIterator, ForwardIterator > cand = min_max_element(f, l, - boost::bind(greater(), boost::bind(gamma1, _1), boost::bind(gamma1, _2)), - boost::bind(less(), boost::bind(gamma2, _1), boost::bind(gamma2, _2))); + [&gamma1](const Point& p1, const Point& p2){ return std::greater()(gamma1(p1), gamma1(p2)); }, + [&gamma2](const Point& p1, const Point& p2){ return std::less()(gamma2(p1), gamma2(p2)); }); // return the result if (gamma1(*cand.first) < gamma2(*cand.second)) { @@ -106,9 +101,6 @@ rectangular_3_center_2_type1( typename Traits::FT& rad, Traits& t) { - using std::max; - using std::less; - typedef typename Traits::FT FT; typedef typename Traits::Iso_rectangle_2 Rectangle; typedef typename Traits::Point_2 Point; @@ -124,7 +116,6 @@ rectangular_3_center_2_type1( P_below_right; typedef typename Traits::Construct_point_2_below_left_implicit_point_2 P_below_left; - typedef boost::function1 Gamma; // fetch function objects from traits class Rect rect = t.construct_iso_rectangle_2_object(); @@ -158,14 +149,14 @@ rectangular_3_center_2_type1( RandomAccessIterator e = l; bool b_empty = true; Min< FT > minft; - Gamma gamma = boost::bind(minft, - boost::bind(dist, v(r, i), _1), - boost::bind(dist, v(r, 2 + i), _1)); + auto gamma = [&minft, &dist, &v, &r, i](const Point& p) + { return minft(dist(v(r, i), p), dist(v(r, 2 + i), p)); }; while (e - s > 1) { // step (a) RandomAccessIterator m = s + (e - s - 1) / 2; - std::nth_element(s, m, e, boost::bind(less(), boost::bind(gamma, _1), boost::bind(gamma, _2))); + std::nth_element(s, m, e, [&gamma](const Point& p1, const Point& p2) + {return gamma(p1) < gamma(p2);}); // step (b) Rectangle b_prime = bounding_box_2(m + 1, e, t); @@ -220,8 +211,9 @@ struct Rectangular_3_center_2_type2_operations_base { typedef typename R::Infinity_distance_2 Infinity_distance_2; typedef typename R::Less_x_2 Less_x_2; typedef typename R::Less_y_2 Less_y_2; - typedef boost::function2 Greater_x_2; - typedef boost::function2 Greater_y_2; + typedef std::function Greater_x_2; + typedef Greater_x_2 Greater_y_2; typedef Min< Point_2, Less_x_2 > Min_x_2; typedef Max< Point_2, Less_x_2 > Max_x_2; typedef Min< Point_2, Less_y_2 > Min_y_2; @@ -236,15 +228,15 @@ struct Rectangular_3_center_2_type2_operations_base { Construct_point_2_below_right_implicit_point_2; typedef typename R::Construct_point_2_below_left_implicit_point_2 Construct_point_2_below_left_implicit_point_2; - typedef boost::function1 Delta; + typedef std::function Delta; Delta delta() const { return delta_; } Less_x_2 less_x_2_object() const { return r_.less_x_2_object(); } Less_y_2 less_y_2_object() const { return r_.less_y_2_object(); } Greater_x_2 greater_x_2_object() const - { return boost::bind(less_x_2_object(),_2,_1); } + { return [this](const Point_2& p1, const Point_2& p2){ return this->less_x_2_object()(p2, p1); }; } Greater_y_2 greater_y_2_object() const - { return boost::bind(less_y_2_object(),_2,_1); } + { return [this](const Point_2& p1, const Point_2& p2){ return this->less_y_2_object()(p2, p1); }; } Infinity_distance_2 distance() const { return r_.infinity_distance_2_object(); } Construct_vertex_2 construct_vertex_2_object() const @@ -277,7 +269,7 @@ struct Rectangular_3_center_2_type2_operations_base { public: Rectangular_3_center_2_type2_operations_base(R& r, const Point_2& p) - : r_(r), delta_(boost::bind(r.infinity_distance_2_object(), p, _1)) + : r_(r), delta_([&r, &p](const Point_2& q){ return r.infinity_distance_2_object()(p, q); }) {} }; @@ -846,10 +838,6 @@ rectangular_3_center_2_type2( Operations op) { BOOST_USING_STD_MAX(); - using std::less; - using std::greater; - using std::greater_equal; - using std::not_equal_to; using std::logical_and; using std::max_element; using std::find_if; @@ -894,7 +882,7 @@ rectangular_3_center_2_type2( { // First try whether the best radius so far can be reached at all RandomAccessIterator m = - partition(f, l, boost::bind(greater< FT >(), rad, boost::bind(op.delta(), _1))); + partition(f, l, [&rad, &op](const Point& p){ return rad > op.delta()(p); }); IP pos = min_max_element(m, l, op.compare_x(), op.compare_y()); // extreme points of the two other squares Point q_t = @@ -905,11 +893,11 @@ rectangular_3_center_2_type2( op.place_y_square(op.place_y_square(Q_r_empty, Q_r, *pos.second, r), r, rad); - boost::function1 le_rad = boost::bind(greater_equal(), rad, _1); + auto le_rad = [&rad](const FT& v){return rad >= v;}; RandomAccessIterator b1 = - partition(m, l, boost::bind(le_rad, boost::bind(op.distance(), q_t, _1))); + partition(m, l, [&le_rad, &op, q_t](const Point& p){ return le_rad(op.distance()(q_t, p)); }); RandomAccessIterator b2 = - partition(b1, l, boost::bind(le_rad, boost::bind(op.distance(), q_r, _1))); + partition(b1, l, [&le_rad, &op, q_r](const Point& p){ return le_rad(op.distance()(q_r, p)); }); if (b2 != l) return o; @@ -921,8 +909,7 @@ rectangular_3_center_2_type2( while (e - s > 6) { std::ptrdiff_t cutoff = (e - s) / 2; RandomAccessIterator m = s + cutoff - 1; - std::nth_element(s, m, e, - boost::bind(less(), boost::bind(op.delta(), _1), boost::bind(op.delta(), _2))); + std::nth_element(s, m, e, [&op](const Point& p1, const Point& p2){ return op.delta()(p1) < op.delta()(p2); }); // step (b) IP pos = min_max_element(m + 1, e, op.compare_x(), op.compare_y()); @@ -935,13 +922,11 @@ rectangular_3_center_2_type2( Point q_r = op.place_y_square(q_r_afap, r, op.delta()(*m)); // check for covering - boost::function1 - le_delta_m = boost::bind(greater_equal(), op.delta()(*m), _1); + auto le_delta_m = [&op, m](const FT& v){ return op.delta()(*m) >= v; }; RandomAccessIterator b1 = - partition(m + 1, e, - boost::bind(le_delta_m, boost::bind(op.distance(), q_t, _1))); + partition(m + 1, e, [&le_delta_m, &op, & q_t](const Point& p){ return le_delta_m(op.distance()(q_t, p)); }); RandomAccessIterator b2 = - partition(b1, e, boost::bind(le_delta_m, boost::bind(op.distance(), q_r, _1))); + partition(b1, e, [&le_delta_m, &op, & q_r](const Point& p){ return le_delta_m(op.distance()(q_r, p)); }); if (b2 != e) s = m; @@ -960,7 +945,7 @@ rectangular_3_center_2_type2( std::ptrdiff_t cutoff = (e - s) / fraction; RandomAccessIterator m = s + cutoff - 1; std::nth_element(s, m, e, - boost::bind(less(), boost::bind(op.delta(), _1), boost::bind(op.delta(), _2))); + [&op](const Point& p1, const Point& p2){ return op.delta()(p1) < op.delta()(p2); }); // step (b) IP pos = min_max_element(m + 1, e, op.compare_x(), op.compare_y()); @@ -1007,16 +992,16 @@ rectangular_3_center_2_type2( // partition the range [m+1, e) into ranges // [m+1, b1), [b1, b2), [b2, b3) and [b3, e) // R G cap q_t G cap q_r none - boost::function1 - le_delta_m = boost::bind(greater_equal(), op.delta()(*m), _1); + auto le_delta_m = [&op, m](const FT& v){ return op.delta()(*m) >= v; }; RandomAccessIterator b2 = - partition(m + 1, e, boost::bind(le_delta_m, boost::bind(op.distance(), q_t, _1))); + partition(m + 1, e, + [&le_delta_m, &op, &q_t](const Point& p) { return le_delta_m(op.distance()(q_t, p)); }); RandomAccessIterator b1 = partition(m + 1, b2, - boost::bind(le_delta_m, boost::bind(op.distance(), q_r, _1))); + [&le_delta_m, &op, &q_r](const Point& p) { return le_delta_m(op.distance()(q_r, p)); }); RandomAccessIterator b3 = - partition(b2, e, boost::bind(le_delta_m, boost::bind(op.distance(), q_r, _1))); - + partition(b2, e, + [&le_delta_m, &op, &q_r](const Point& p) { return le_delta_m(op.distance()(q_r, p)); }); // step (c) if (b3 != e || @@ -1100,9 +1085,8 @@ rectangular_3_center_2_type2( // step 1 RandomAccessIterator s_m = s_b + (s_e - s_b - 1) / 2; std::nth_element(s_b, s_m, s_e, - boost::bind(less(), - boost::bind(op.delta(), _1), - boost::bind(op.delta(), _2))); + [&op](const Point& p1, const Point& p2) + { return op.delta()(p1) < op.delta()(p2); }); // step 2 (as above) Point q_t_m = q_t_afap; @@ -1138,14 +1122,17 @@ CGAL_3CENTER_REPEAT_CHECK: // partition the range [s_b+1, e) into ranges // [s_b+1, b1), [b1, b2), [b2, b3) and [b3, e) // R G cap q_t G cap q_r none - boost::function1 - le_delta_sb = boost::bind(greater_equal(), op.delta()(*s_b), _1); - b2 = partition(s_b + 1, e, boost::bind(le_delta_sb, - boost::bind(op.distance(), q_t, _1))); - b1 = partition(s_b + 1, b2, boost::bind(le_delta_sb, - boost::bind(op.distance(), q_r, _1))); + auto le_delta_sb = [&op, s_b](const FT& v){ return op.delta()(*s_b) >= v;} ; + + b2 = partition(s_b + 1, e, + [&le_delta_sb, &op, &q_t](const Point& p) + { return le_delta_sb(op.distance()(q_t, p)); }); + b1 = partition(s_b + 1, b2, + [&le_delta_sb, &op, &q_r](const Point& p) + { return le_delta_sb(op.distance()(q_r, p)); }); b3 = partition(b2, e, - boost::bind(le_delta_sb, boost::bind(op.distance(), q_r, _1))); + [&le_delta_sb, &op, &q_r](const Point& p) + { return le_delta_sb(op.distance()(q_r, p)); }); if (b3 != e || (!Q_t_empty && op.compute_x_distance(q_t, Q_t) > op.delta()(*s_b)) || @@ -1183,7 +1170,7 @@ CGAL_3CENTER_REPEAT_CHECK: std::vector< Point > tmppts(f, l); RandomAccessIterator ii = partition(tmppts.begin(), tmppts.end(), - boost::bind(le_delta_sb, boost::bind(op.delta(), _1))); + [&le_delta_sb, &op](const FT& v){ return le_delta_sb(op.delta()(v)); }); IP tmppos = min_max_element(ii, tmppts.end(), op.compare_x(), op.compare_y()); ) @@ -1228,12 +1215,8 @@ CGAL_3CENTER_REPEAT_CHECK: // we have to take the next smaller radius RandomAccessIterator next = max_element_if(s, s_b, - boost::bind(less(), - boost::bind(op.delta(), _1), - boost::bind(op.delta(), _2)), - boost::bind(not_equal_to(), - op.delta()(*s_b), - boost::bind(op.delta(), _1))); + [&op](const Point& p1, const Point& p2){ return op.delta()(p1) < op.delta()(p2); }, + [&op, s_b](const Point& p){ return op.delta()(*s_b) != op.delta()(p); }); rho_max = op.delta()(*s_b); q_t_at_rho_max = q_t, q_r_at_rho_max = q_r; CGAL_optimisation_assertion(op.delta()(*next) < op.delta()(*s_b)); @@ -1243,14 +1226,13 @@ CGAL_3CENTER_REPEAT_CHECK: q_r = op.place_y_square(q_r_afap, r, op.delta()(*next)); // again check for covering - boost::function1 - le_delta_next = boost::bind(greater_equal(), op.delta()(*next), _1); + auto le_delta_next = [&op, next](const FT& v){ return op.delta()(*next) >= v; }; b2 = partition(s_b, e, - boost::bind(le_delta_next, boost::bind(op.distance(), q_t, _1))); + [&op, &le_delta_next, &q_t](const Point& p){ return le_delta_next( op.distance()(q_t,p) ); }); b1 = partition(s_b, b2, - boost::bind(le_delta_next, boost::bind(op.distance(), q_r, _1))); + [&op, &le_delta_next, &q_r](const Point& p){ return le_delta_next( op.distance()(q_r,p) ); }); b3 = partition(b2, e, - boost::bind(le_delta_next, boost::bind(op.distance(), q_r, _1))); + [&op, &le_delta_next, &q_r](const Point& p){ return le_delta_next( op.distance()(q_r,p) ); }); if (b3 != e || (!Q_t_empty && op.compute_x_distance(q_t, Q_t) > op.delta()(*next)) || @@ -1304,7 +1286,7 @@ CGAL_3CENTER_REPEAT_CHECK: Point q_t_afap = op.place_x_square(Q_t_empty, Q_t, r); Point q_r_afap = op.place_y_square(Q_r_empty, Q_r, r); if (s != e) { - sort(s, e, boost::bind(less(), boost::bind(op.delta(), _1), boost::bind(op.delta(), _2))); + sort(s, e, [&op](const Point& p1, const Point& p2){ return op.delta()(p1) < op.delta()(p2);}); rho_max = op.delta()(*--t); } else rho_max = rho_min; @@ -1347,16 +1329,15 @@ CGAL_3CENTER_REPEAT_CHECK: q_r = op.place_y_square(q_r_afap, r, try_rho); // check for covering - boost::function1 - greater_rho_max = boost::bind(less(), try_rho, _1); + auto greater_rho_max = [&try_rho](const FT& v){ return try_rho < v; }; if ((!Q_t_empty && op.compute_x_distance(q_t, Q_t) > try_rho) || (!Q_r_empty && op.compute_y_distance(q_r, Q_r) > try_rho) || e != find_if( t + 1, e, - boost::bind(logical_and(), - boost::bind(greater_rho_max, boost::bind(op.distance(), q_t, _1)), - boost::bind(greater_rho_max, boost::bind(op.distance(), q_r, _1))))) + [&greater_rho_max, &q_t, &q_r, &op](const Point& p) + { return greater_rho_max(op.distance()(q_t,p)) && + greater_rho_max(op.distance()(q_r,p)); })) { rho_min = try_rho; q_t_q_r_cover_at_rho_min = 0; @@ -1393,17 +1374,15 @@ CGAL_3CENTER_REPEAT_CHECK: CGAL_optimisation_assertion(rho_min >= 0); FT rad_2 = q_t_q_r_cover_at_rho_min; if (s_at_rho_min != e_at_rho_min) { - boost::function1 - mydist = boost::bind(Min(), - boost::bind(op.distance(), q_t_at_rho_min, _1), - boost::bind(op.distance(), q_r_at_rho_min, _1)); + auto mydist = [&q_t_at_rho_min, &q_r_at_rho_min, &op](const Point& p) + { return Min()( op.distance()(q_t_at_rho_min, p), + op.distance()(q_r_at_rho_min, p)); }; rad_2 = max BOOST_PREVENT_MACRO_SUBSTITUTION ( rad_2, mydist(*max_element(s_at_rho_min, e_at_rho_min, - boost::bind(less< FT >(), - boost::bind(mydist, _1), - boost::bind(mydist, _2))))); + [&mydist](const Point& p1, const Point& p2) + { return mydist(p1) < mydist(p2); }))); } CGAL_optimisation_assertion(rad_2 == 0 || rad_2 > rho_min); diff --git a/Bounding_volumes/include/CGAL/rectangular_p_center_2.h b/Bounding_volumes/include/CGAL/rectangular_p_center_2.h index 6034a94f173..1d680e9572f 100644 --- a/Bounding_volumes/include/CGAL/rectangular_p_center_2.h +++ b/Bounding_volumes/include/CGAL/rectangular_p_center_2.h @@ -316,7 +316,6 @@ rectangular_p_center_2_matrix_search( const Traits& t) { typedef typename Traits::FT FT; - using std::minus; return rectangular_p_center_2_matrix_search( f, @@ -325,7 +324,9 @@ rectangular_p_center_2_matrix_search( r, pf, t, - boost::bind(Max(), 0, boost::bind(minus(), _1, _2))); + std::function( + [](const FT& a, const FT& b) { return Max()(0, std::minus()(a,b)); } + )); } // Pcenter_matrix_search( ... ) diff --git a/Bounding_volumes/test/Bounding_volumes/CMakeLists.txt b/Bounding_volumes/test/Bounding_volumes/CMakeLists.txt index 37a505cf115..35c50a1d638 100644 --- a/Bounding_volumes/test/Bounding_volumes/CMakeLists.txt +++ b/Bounding_volumes/test/Bounding_volumes/CMakeLists.txt @@ -10,7 +10,7 @@ include(${CGAL_USE_FILE}) # Use Eigen find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) # create a target per cppfile file( @@ -19,11 +19,11 @@ file( ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) foreach(cppfile ${cppfiles}) if(NOT (${cppfile} STREQUAL "Approximate_min_ellipsoid_d.cpp") - OR TARGET CGAL::Eigen_support) + OR TARGET CGAL::Eigen3_support) get_filename_component(target ${cppfile} NAME_WE) create_single_source_cgal_program(${cppfile}) - if(TARGET CGAL::Eigen_support) - target_link_libraries(${target} PRIVATE CGAL::CGAL CGAL::Eigen_support) + if(TARGET CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::CGAL CGAL::Eigen3_support) else() target_link_libraries(${target} PRIVATE CGAL::CGAL) endif() diff --git a/Box_intersection_d/include/CGAL/Box_intersection_d/Box_d.h b/Box_intersection_d/include/CGAL/Box_intersection_d/Box_d.h index 08718db8abd..a6326ed6cae 100644 --- a/Box_intersection_d/include/CGAL/Box_intersection_d/Box_d.h +++ b/Box_intersection_d/include/CGAL/Box_intersection_d/Box_d.h @@ -24,6 +24,7 @@ #include #include +#include namespace CGAL { @@ -63,8 +64,9 @@ class Box_d; template class Box_d< NT_, N, ID_NONE> { protected: - NT_ lo[N]; - NT_ hi[N]; + std::array lo; + std::array hi; + public: typedef NT_ NT; typedef std::size_t ID; @@ -72,8 +74,8 @@ public: Box_d() {} Box_d(bool complete) { init(complete); } Box_d(NT l[N], NT h[N]) { - std::copy( l, l + N, lo ); - std::copy( h, h + N, hi ); + std::copy( l, l + N, &lo[0] ); + std::copy( h, h + N, &hi[0] ); } void init (bool complete = false) { NT inf = box_limits::inf(); diff --git a/CGAL_Core/src/CGAL_Core/BigFloat.cpp b/CGAL_Core/src/CGAL_Core/BigFloat.cpp deleted file mode 100644 index 6a566a4ffdf..00000000000 --- a/CGAL_Core/src/CGAL_Core/BigFloat.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************** - * Core Library Version 1.7, August 2004 - * Copyright (c) 1995-2004 Exact Computation Project - * All rights reserved. - * - * This file is part of CGAL (www.cgal.org). - * - * File: BigFloat.cpp - * Synopsis: - * BigFloat numbers with error bounds - * - * EXACTNESS PROPERTY: - * ================== - * For BigFloats that are exact (i.e., error=0), - * addition/subtraction and multiplication return the - * exact result (i.e., error=0). We also introduce the operation - * div2(), which simply divides a BigFloat by 2, - * but this again preserves exactness. Such exactness - * properties are used in our Newton iteration/Sturm Sequences. - * - * Written by - * Chee Yap - * Chen Li - * Zilin Du - * - * WWW URL: http://cs.nyu.edu/exact/ - * Email: exact@cs.nyu.edu - * - * $URL$ - * $Id$ - * SPDX-License-Identifier: LGPL-3.0-or-later - ***************************************************************************/ - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif diff --git a/CGAL_Core/src/CGAL_Core/CMakeLists.txt b/CGAL_Core/src/CGAL_Core/CMakeLists.txt deleted file mode 100644 index 182b102f6b6..00000000000 --- a/CGAL_Core/src/CGAL_Core/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -include(CGAL_SetupCGAL_CoreDependencies) - -message("Configuring libCGAL_Core") -if(CGAL_Core_FOUND) - - collect_cgal_library(CGAL_Core "") - - if(CGAL_HEADER_ONLY) - set(keyword INTERFACE) - else() - set(keyword PUBLIC) - endif() - - cgal_setup_cgal_core_dependencies(CGAL_Core ${keyword}) - - message("libCGAL_Core is configured") -endif() diff --git a/CGAL_Core/src/CGAL_Core/CoreAux.cpp b/CGAL_Core/src/CGAL_Core/CoreAux.cpp deleted file mode 100644 index 936a9c3439c..00000000000 --- a/CGAL_Core/src/CGAL_Core/CoreAux.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/**************************************************************************** - * Core Library Version 1.7, August 2004 - * Copyright (c) 1995-2004 Exact Computation Project - * All rights reserved. - * - * This file is part of CGAL (www.cgal.org). - * - * File: CoreAux.cpp - * Synopsis: - * Auxiliary routines such as ceiling of log_2, etc. - * they are not specific to any Core classes. - * - * Written by - * Chee Yap - * Chen Li - * Zilin Du - * - * WWW URL: http://cs.nyu.edu/exact/ - * Email: exact@cs.nyu.edu - * - * $URL$ - * $Id$ - * SPDX-License-Identifier: LGPL-3.0-or-later - ***************************************************************************/ - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif diff --git a/CGAL_Core/src/CGAL_Core/CoreDefs.cpp b/CGAL_Core/src/CGAL_Core/CoreDefs.cpp deleted file mode 100644 index 56b0d1df410..00000000000 --- a/CGAL_Core/src/CGAL_Core/CoreDefs.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/**************************************************************************** - * Core Library Version 1.7, August 2004 - * Copyright (c) 1995-2004 Exact Computation Project - * All rights reserved. - * - * This file is part of CGAL (www.cgal.org). - * - * File: CoreDefs.cpp - * Synopsis: - * Useful parameters for Core Library which users may change - * - * Written by - * Chee Yap - * Chen Li - * Zilin Du - * - * WWW URL: http://cs.nyu.edu/exact/ - * Email: exact@cs.nyu.edu - * - * $URL$ - * $Id$ - * SPDX-License-Identifier: LGPL-3.0-or-later - ***************************************************************************/ - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif diff --git a/CGAL_Core/src/CGAL_Core/CoreIO.cpp b/CGAL_Core/src/CGAL_Core/CoreIO.cpp deleted file mode 100644 index a0c42cc65da..00000000000 --- a/CGAL_Core/src/CGAL_Core/CoreIO.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/**************************************************************************** - * Core Library Version 1.7, August 2004 - * Copyright (c) 1995-2004 Exact Computation Project - * All rights reserved. - * - * This file is part of CGAL (www.cgal.org). - * - * File: CoreIO.cpp - * - * Written by - * Zilin Du - * Chee Yap - * - * WWW URL: http://cs.nyu.edu/exact/ - * Email: exact@cs.nyu.edu - * - * $URL$ - * $Id$ - * SPDX-License-Identifier: LGPL-3.0-or-later - ***************************************************************************/ - -#ifndef CGAL_HEADER_ONLY -#include -#endif diff --git a/CGAL_Core/src/CGAL_Core/Expr.cpp b/CGAL_Core/src/CGAL_Core/Expr.cpp deleted file mode 100644 index 747f202da46..00000000000 --- a/CGAL_Core/src/CGAL_Core/Expr.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/**************************************************************************** - * Core Library Version 1.7, August 2004 - * Copyright (c) 1995-2004 Exact Computation Project - * All rights reserved. - * - * This file is part of CGAL (www.cgal.org). - * - * File: Expr.cpp - * - * Written by - * Koji Ouchi - * Chee Yap - * Igor Pechtchanski - * Vijay Karamcheti - * Chen Li - * Zilin Du - * Sylvain Pion - * - * WWW URL: http://cs.nyu.edu/exact/ - * Email: exact@cs.nyu.edu - * - * $URL$ - * $Id$ - * SPDX-License-Identifier: LGPL-3.0-or-later - ***************************************************************************/ - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif diff --git a/CGAL_Core/src/CGAL_Core/GmpIO.cpp b/CGAL_Core/src/CGAL_Core/GmpIO.cpp deleted file mode 100644 index 89adf2ebec7..00000000000 --- a/CGAL_Core/src/CGAL_Core/GmpIO.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * Core Library Version 1.7, August 2004 - * Copyright (c) 1995-2004 Exact Computation Project - * All rights reserved. - * - * This file is part of CGAL (www.cgal.org). - * - * file: GmpIO.cpp - * Adapted from multi-files under /cxx in GMP's source distribution - * - * Zilin Du, 2003 - * - * $URL$ - * $Id$ - * SPDX-License-Identifier: LGPL-3.0-only - ***************************************************************************/ - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif diff --git a/CGAL_Core/src/CGAL_Core/Real.cpp b/CGAL_Core/src/CGAL_Core/Real.cpp deleted file mode 100644 index aab3de549fc..00000000000 --- a/CGAL_Core/src/CGAL_Core/Real.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/**************************************************************************** - * Core Library Version 1.7, August 2004 - * Copyright (c) 1995-2004 Exact Computation Project - * All rights reserved. - * - * This file is part of CGAL (www.cgal.org). - * - * File: Real.cpp - * Synopsis: The Real class is a superclass for all the number - * systems in the Core Library (int, long, float, double, - * BigInt, BigRat, BigFloat, etc) - * - * Written by - * Koji Ouchi - * Chee Yap - * Chen Li - * Zilin Du - * Sylvain Pion - * - * WWW URL: http://cs.nyu.edu/exact/ - * Email: exact@cs.nyu.edu - * - * $URL$ - * $Id$ - * SPDX-License-Identifier: LGPL-3.0-or-later - ***************************************************************************/ - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif diff --git a/CGAL_Core/src/CGAL_Core/extLong.cpp b/CGAL_Core/src/CGAL_Core/extLong.cpp deleted file mode 100644 index d2072c3d388..00000000000 --- a/CGAL_Core/src/CGAL_Core/extLong.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/**************************************************************************** - * Core Library Version 1.7, August 2004 - * Copyright (c) 1995-2004 Exact Computation Project - * All rights reserved. - * - * This file is part of CGAL (www.cgal.org). - * - * File: extLong.cpp - * Synopsis: - * The class extLong is basically a wrapper around the machine - * type long. It is an important class to provide several - * additional facilities to detect overflows and undefined values. - * Future development includes extensions to level arithmetic - * (i.e., if a number overflows level i, we will go to level i+1). - * Level i representation of a number n is just i iterations - * of log_2 applied to n. - * - * Written by - * Chee Yap - * Chen Li - * Zilin Du - * Sylvain Pion - * - * WWW URL: http://cs.nyu.edu/exact/ - * Email: exact@cs.nyu.edu - * - * $URL$ - * $Id$ - * SPDX-License-Identifier: LGPL-3.0-or-later - ***************************************************************************/ - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/CMakeLists.txt b/CGAL_ImageIO/src/CGAL_ImageIO/CMakeLists.txt deleted file mode 100644 index f24e6d39961..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -message("Configuring libCGAL_ImageIO") - -collect_cgal_library(CGAL_ImageIO "") - -include(CGAL_SetupCGAL_ImageIODependencies) - -if(CGAL_HEADER_ONLY) - set(keyword "INTERFACE") -endif() - -cgal_setup_cgal_imageio_dependencies(CGAL_ImageIO ${keyword}) - -if(COMMAND add_config_flag) - set(CGAL_HAS_IMAGEIO TRUE) - add_config_flag(CGAL_HAS_IMAGEIO) -endif() - -if(ZLIB_FOUND) - get_dependency_version(ZLIB) -endif() - -message("libCGAL_ImageIO is configured") diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/ImageIO.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/ImageIO.cpp deleted file mode 100644 index f5760138ccf..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/ImageIO.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005, 2006 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// Copyright (c) 2007 Geometrica Project, INRIA Sophia-Antipolis (France) -// Copyright (c) 2008 GeometryFactory, Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/Image_3.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/Image_3.cpp deleted file mode 100644 index 98be1910a61..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/Image_3.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 INRIA Sophia-Antipolis (France). -// 2008 GeometryFactory, Sophia Antipolis (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) : Laurent Rineau, Pierre Alliez - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/LICENSE b/CGAL_ImageIO/src/CGAL_ImageIO/LICENSE deleted file mode 100644 index 08d4e2694b8..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2005, 2006 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// The files in this directory are part of the ImageIO Library. -// You can redistribute them and/or modify them under the terms of the -// GNU Lesser General Public License as published by the Free Software Foundation; -// either version 3 of the License, or (at your option) any later version. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// These files are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// Author(s) : Olivier Clatz, Herve Delingette et Gregoire Malandain diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/analyze.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/analyze.cpp deleted file mode 100644 index 7f627a9cb86..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/analyze.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/bmp.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/bmp.cpp deleted file mode 100644 index 0b8494a966a..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/bmp.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/bmpendian.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/bmpendian.cpp deleted file mode 100644 index 9545c6cfb3d..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/bmpendian.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/bmpread.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/bmpread.cpp deleted file mode 100644 index 2c905338b8e..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/bmpread.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/convert.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/convert.cpp deleted file mode 100644 index a0a610b1a79..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/convert.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/fgetns.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/fgetns.cpp deleted file mode 100644 index e123117e3c0..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/fgetns.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/gif.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/gif.cpp deleted file mode 100644 index 62d5c585087..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/gif.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/gis.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/gis.cpp deleted file mode 100644 index 0551ff6a5f9..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/gis.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/inr.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/inr.cpp deleted file mode 100644 index 4b3870cf55c..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/inr.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/iris.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/iris.cpp deleted file mode 100644 index 4e7eeffc803..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/iris.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/mincio.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/mincio.cpp deleted file mode 100644 index c3e71de7b49..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/mincio.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/pnm.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/pnm.cpp deleted file mode 100644 index 45bb0b3c455..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/pnm.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/recbuffer.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/recbuffer.cpp deleted file mode 100644 index c7a23780a65..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/recbuffer.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/recline.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/recline.cpp deleted file mode 100644 index fc57c491bef..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/recline.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ImageIO/src/CGAL_ImageIO/reech4x4.cpp b/CGAL_ImageIO/src/CGAL_ImageIO/reech4x4.cpp deleted file mode 100644 index af0e25c09c5..00000000000 --- a/CGAL_ImageIO/src/CGAL_ImageIO/reech4x4.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) -// All rights reserved. -// -// This file is part of the ImageIO Library, and as been adapted for CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/CGAL_ipelets/demo/CGAL_ipelets/CMakeLists.txt b/CGAL_ipelets/demo/CGAL_ipelets/CMakeLists.txt index 6bfda2f562d..4d66a2089a4 100644 --- a/CGAL_ipelets/demo/CGAL_ipelets/CMakeLists.txt +++ b/CGAL_ipelets/demo/CGAL_ipelets/CMakeLists.txt @@ -23,8 +23,8 @@ find_package(CGAL REQUIRED COMPONENTS Core) include(${CGAL_USE_FILE}) find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "NOTICE: This project requires the Eigen library, and will not be compiled." @@ -32,85 +32,31 @@ if(NOT TARGET CGAL::Eigen_support) return() endif() -find_package(IPE 6) +find_package(IPE 7) if(IPE_FOUND) - include_directories(BEFORE ${IPE_INCLUDE_DIR}) - - if(${IPE_VERSION} EQUAL "7") - set(WITH_IPE_7 ON) - elseif(${IPE_VERSION} EQUAL "6") - set(WITH_IPE_7 OFF) - else() - message( - "-- Error: ${IPE_VERSION} is not a supported version of IPE (only 6 and 7 are)." - ) + if ( NOT ${IPE_VERSION} EQUAL "7") + message("-- Error: ${IPE_VERSION} is not a supported version of IPE (only 7 is).") set(IPE_FOUND FALSE) endif() - # starting ipe 7.2.1, a compiler with c++11 must be used to compile ipelets - if(${IPE_VERSION} EQUAL "7" - AND ${IPE_MINOR_VERSION_1} GREATER "1" - AND ${IPE_MINOR_VERSION_2} GREATER "0") - message( - STATUS - "Starting from Ipe 7.2.1 a compiler with c++11 support must be used") - - list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_generalized_initializers has_cpp11) - if(has_cpp11 LESS 0) - message( - STATUS - "NOTICE: This demo requires a C++11 compiler and will not be compiled." - ) - return() - endif() - - # Use C++11 for this directory and its sub-directories. - set(CMAKE_CXX_STANDARD 11) - set(CMAKE_CXX_STANDARD_REQUIRED TRUE) - - endif() endif() -if(IPE_FOUND AND IPE_VERSION) - if(WITH_IPE_7) - add_definitions(-DCGAL_USE_IPE_7) - endif() +if(IPE_FOUND AND IPE_VERSION) message("-- Using IPE version ${IPE_VERSION} compatibility.") #setting installation directory get_filename_component(IPE_LIBRARY_DIR ${IPE_LIBRARIES} PATH) - if(IPE_FOUND AND NOT IPELET_INSTALL_DIR) - if(WITH_IPE_7) + if (IPE_FOUND AND NOT IPELET_INSTALL_DIR) remove_leading_zero(IPE_MINOR_VERSION_1) remove_leading_zero(IPE_MINOR_VERSION_2) - set(INSTALL_PATHS - "${IPE_LIBRARY_DIR}/ipe/7.${IPE_MINOR_VERSION_1}.${IPE_MINOR_VERSION_2}/ipelets/" - ) - find_path( - IPELET_INSTALL_DIR - NAMES libgoodies.lua goodies.lua - PATHS ${INSTALL_PATHS} - DOC "The folder where ipelets will be installed" ENV IPELETPATH) - else() - foreach(VER RANGE 28 40) - string(REPLACE XX ${VER} PATHC - "${IPE_LIBRARY_DIR}/ipe/6.0preXX/ipelets/") - set(INSTALL_PATHS ${INSTALL_PATHS} ${PATHC}) - endforeach() - set(INSTALL_PATHS ${INSTALL_PATHS} ${PATHC}) - set(INSTALL_PATHS ${INSTALL_PATHS} /usr/lib64/ipe/6.0/ipelets) - set(INSTALL_PATHS ${INSTALL_PATHS} /usr/lib/ipe/6.0/ipelets) - - find_library( - IPELET_INSTALL_DIR_FILES - NAMES align - PATHS ${INSTALL_PATHS} ENV IPELETPATH) - if(IPELET_INSTALL_DIR_FILES) - get_filename_component(IPELET_INSTALL_DIR ${IPELET_INSTALL_DIR_FILES} - PATH) - endif() - endif() + set(INSTALL_PATHS "${IPE_LIBRARY_DIR}/ipe/7.${IPE_MINOR_VERSION_1}.${IPE_MINOR_VERSION_2}/ipelets/") + find_path(IPELET_INSTALL_DIR + NAMES libgoodies.lua goodies.lua + PATHS ${INSTALL_PATHS} + DOC "The folder where ipelets will be installed" + ENV IPELETPATH + ) endif() set(CGAL_IPELETS ${CGAL_IPELETS}) @@ -146,32 +92,32 @@ if(IPE_FOUND AND IPE_VERSION) foreach(IPELET ${CGAL_IPELETS}) add_library(CGAL_${IPELET} MODULE ${IPELET}.cpp) + target_include_directories(CGAL_${IPELET} BEFORE PRIVATE ${IPE_INCLUDE_DIR}) + add_to_cached_list(CGAL_EXECUTABLE_TARGETS CGAL_${IPELET}) - target_link_libraries(CGAL_${IPELET} PRIVATE CGAL::CGAL CGAL::Eigen_support + target_link_libraries(CGAL_${IPELET} PRIVATE CGAL::CGAL CGAL::Eigen3_support ${IPE_LIBRARIES}) if(IPELET_INSTALL_DIR) install(TARGETS CGAL_${IPELET} DESTINATION ${IPELET_INSTALL_DIR}) - if(WITH_IPE_7) - install(FILES ./lua/libCGAL_${IPELET}.lua - DESTINATION ${IPELET_INSTALL_DIR}) #only for ipe 7 - endif() - endif() + install(FILES ./lua/libCGAL_${IPELET}.lua DESTINATION ${IPELET_INSTALL_DIR}) #only for ipe 7 + endif () cgal_add_compilation_test(CGAL_${IPELET}) endforeach(IPELET) if(CGAL_Core_FOUND) target_link_libraries(CGAL_cone_spanners PRIVATE CGAL::CGAL_Core - CGAL::Eigen_support) + CGAL::Eigen3_support) endif() #example in doc not installed add_library(simple_triangulation MODULE simple_triangulation.cpp) add_to_cached_list(CGAL_EXECUTABLE_TARGETS simple_triangulation) - target_link_libraries(simple_triangulation CGAL::Eigen_support + target_link_libraries(simple_triangulation CGAL::Eigen3_support ${IPE_LIBRARIES}) + target_include_directories(simple_triangulation BEFORE PRIVATE ${IPE_INCLUDE_DIR}) + if (WITH_IPE_7) + target_compile_definitions(simple_triangulation PRIVATE CGAL_USE_IPE_7) + endif() cgal_add_compilation_test(simple_triangulation) else() - message( - STATUS - "NOTICE: This program requires the Ipe include files and library, and will not be compiled." - ) + message(STATUS "NOTICE: This program requires the Ipe include files and library, and will not be compiled.") endif() diff --git a/CGAL_ipelets/demo/CGAL_ipelets/generator.cpp b/CGAL_ipelets/demo/CGAL_ipelets/generator.cpp index 7c99e967f8b..92104a15cff 100644 --- a/CGAL_ipelets/demo/CGAL_ipelets/generator.cpp +++ b/CGAL_ipelets/demo/CGAL_ipelets/generator.cpp @@ -110,11 +110,7 @@ void generator::protected_run(int fn) else segments.reserve(nbelements); - #ifdef CGAL_USE_IPE_7 get_IpePage()->deselectAll(); - #else - get_IpePage()->DeselectAll(); - #endif switch(fn){ case 0:{//random point in a circle diff --git a/CGAL_ipelets/demo/CGAL_ipelets/hull.cpp b/CGAL_ipelets/demo/CGAL_ipelets/hull.cpp index 4e43d342d5b..abd2a7842b5 100644 --- a/CGAL_ipelets/demo/CGAL_ipelets/hull.cpp +++ b/CGAL_ipelets/demo/CGAL_ipelets/hull.cpp @@ -126,7 +126,6 @@ void enveloppeIpelet::protected_run(int fn) Vsite0.insert(Vsite0.end(),*(Vsite0.begin()+1)); std::vector::iterator Vsiteite0 = Vsite0.begin(); std::vector::iterator Vsiteite00 = Vsite0.end()-2; - #ifdef CGAL_USE_IPE_7 for(std::vector::iterator it=Vsiteite00 ; it!=Vsiteite0 ; --it){//draw precise convex hull computing tangency point to circles double c_rad = it->weight(); if(c_rad!=0){ @@ -155,36 +154,6 @@ void enveloppeIpelet::protected_run(int fn) ipe::Shape shape; shape.appendSubPath(SSPseg_ipe); get_IpePage()->append(ipe::EPrimarySelected,CURRENTLAYER,new ipe::Path(CURRENTATTRIBUTES,shape)); - #else - for(std::vector::iterator it=Vsiteite00 ; it!=Vsiteite0 ; --it){//draw precise convex hull computing tangency point to circles - double c_rad = it->weight(); - if(c_rad!=0){ - Point_2 p_pt = (it-1)->point(); //previous neighbor - Point_2 c_pt = it->point(); - Point_2 n_pt = (it+1)->point(); //next neighbor - double p_rad = (it-1)->weight(); - double n_rad = (it+1)->weight(); - IpeVector pt_ipe=tangency_point(c_rad,p_rad,c_pt,p_pt); - IpeVector pt_ipe0=tangency_point(c_rad,n_rad,c_pt,n_pt,-1); - - if(it!=Vsiteite00) - SSPseg_ipe->AppendSegment(pt_ipe1,pt_ipe0); - SSPseg_ipe->AppendArc(IpeMatrix(c_rad,0,0,c_rad,c_pt.x(),c_pt.y()),pt_ipe0,pt_ipe); - pt_ipe1=pt_ipe; - } - else{ - Point_2 c_pt = it->point(); - IpeVector pt_ipe=IpeVector(c_pt.x(),c_pt.y()); - if(it!=Vsiteite00) - SSPseg_ipe->AppendSegment(pt_ipe1,pt_ipe); - pt_ipe1=pt_ipe; - } - } - SSPseg_ipe->SetClosed(true); - IpePath* obj_ipe1 = new IpePath(get_IpeletHelper()->Attributes()); - obj_ipe1 -> AddSubPath(SSPseg_ipe); - get_IpePage()->push_back(IpePgObject(IpePgObject::ESecondary,get_IpeletHelper()->CurrentLayer(),obj_ipe1)); - #endif } break; diff --git a/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base.h b/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base.h index a3062e941ad..1b82d19a3e2 100644 --- a/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base.h +++ b/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base.h @@ -13,8 +13,4 @@ #include -#ifdef CGAL_USE_IPE_7 #include -#else -#include -#endif diff --git a/CGAL_ipelets/include/CGAL/grabbers.h b/CGAL_ipelets/include/CGAL/grabbers.h index 2850186ea7e..dc5a8b0e5d6 100644 --- a/CGAL_ipelets/include/CGAL/grabbers.h +++ b/CGAL_ipelets/include/CGAL/grabbers.h @@ -14,7 +14,7 @@ #ifndef CGAL_GRABBER_H #define CGAL_GRABBER_H -#include +#include namespace CGAL{ diff --git a/Cartesian_kernel/include/CGAL/constructions/kernel_ftC2.h b/Cartesian_kernel/include/CGAL/constructions/kernel_ftC2.h index 3f5dd1ae3bb..d4a62c21c91 100644 --- a/Cartesian_kernel/include/CGAL/constructions/kernel_ftC2.h +++ b/Cartesian_kernel/include/CGAL/constructions/kernel_ftC2.h @@ -246,8 +246,8 @@ bisector_of_linesC2(const FT &pa, const FT &pb, const FT &pc, FT &a, FT &b, FT &c) { // We normalize the equations of the 2 lines, and we then add them. - FT n1 = CGAL_NTS sqrt(CGAL_NTS square(pa) + CGAL_NTS square(pb)); - FT n2 = CGAL_NTS sqrt(CGAL_NTS square(qa) + CGAL_NTS square(qb)); + FT n1 = CGAL_NTS approximate_sqrt( FT(CGAL_NTS square(pa) + CGAL_NTS square(pb)) ); + FT n2 = CGAL_NTS approximate_sqrt( FT(CGAL_NTS square(qa) + CGAL_NTS square(qb)) ); a = n2 * pa + n1 * qa; b = n2 * pb + n1 * qb; c = n2 * pc + n1 * qc; diff --git a/Cartesian_kernel/include/CGAL/constructions/kernel_ftC3.h b/Cartesian_kernel/include/CGAL/constructions/kernel_ftC3.h index 63a1442f511..ac1dced802c 100644 --- a/Cartesian_kernel/include/CGAL/constructions/kernel_ftC3.h +++ b/Cartesian_kernel/include/CGAL/constructions/kernel_ftC3.h @@ -366,10 +366,10 @@ bisector_of_planesC3(const FT &pa, const FT &pb, const FT &pc, const FT &pd, FT &a, FT &b, FT &c, FT &d) { // We normalize the equations of the 2 planes, and we then add them. - FT n1 = CGAL_NTS sqrt(CGAL_NTS square(pa) + CGAL_NTS square(pb) + - CGAL_NTS square(pc)); - FT n2 = CGAL_NTS sqrt(CGAL_NTS square(qa) + CGAL_NTS square(qb) + - CGAL_NTS square(qc)); + FT n1 = CGAL_NTS approximate_sqrt( FT(CGAL_NTS square(pa) + CGAL_NTS square(pb) + + CGAL_NTS square(pc)) ); + FT n2 = CGAL_NTS approximate_sqrt( FT(CGAL_NTS square(qa) + CGAL_NTS square(qb) + + CGAL_NTS square(qc)) ); a = n2 * pa + n1 * qa; b = n2 * pb + n1 * qb; c = n2 * pc + n1 * qc; diff --git a/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt b/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt index 78bf951d49a..3df4da89e33 100644 --- a/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt +++ b/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt @@ -12,7 +12,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL) +find_package(Qt5 QUIET COMPONENTS Script OpenGL) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/Circular_kernel_3/demo/Circular_kernel_3/Circular_kernel_3.cpp b/Circular_kernel_3/demo/Circular_kernel_3/Circular_kernel_3.cpp index 513722fec61..0b41052abad 100644 --- a/Circular_kernel_3/demo/Circular_kernel_3/Circular_kernel_3.cpp +++ b/Circular_kernel_3/demo/Circular_kernel_3/Circular_kernel_3.cpp @@ -1,17 +1,12 @@ #include "Viewer.h" #include - +#include int main(int argc, char** argv) { - // Read command lines arguments. + CGAL::Qt::init_ogl_context(4,3); QApplication application(argc,argv); - // Instantiate the viewer. Viewer viewer; - //for Windows -#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) - application.setAttribute(Qt::AA_UseDesktopOpenGL); -#endif viewer.setWindowTitle("Intersection points of randomly generated circles."); // Make the viewer window visible on screen. diff --git a/Circular_kernel_3/demo/Circular_kernel_3/Viewer.cpp b/Circular_kernel_3/demo/Circular_kernel_3/Viewer.cpp index c026e1cce0b..38e0a192414 100644 --- a/Circular_kernel_3/demo/Circular_kernel_3/Viewer.cpp +++ b/Circular_kernel_3/demo/Circular_kernel_3/Viewer.cpp @@ -11,6 +11,14 @@ Viewer::Viewer(QWidget* parent ) { extension_is_found = false; } +Viewer::~Viewer() +{ + makeCurrent(); + for(int i=0; i<3; ++i) + vao[i].destroy(); + for(int i=0; i<9; ++i) + buffers[i].destroy(); +} void Viewer::compile_shaders() { @@ -32,16 +40,16 @@ void Viewer::compile_shaders() //Vertex source code const char vertex_source[] = { - "#version 120 \n" - "attribute highp vec4 vertex;\n" - "attribute highp vec3 normal;\n" - "attribute highp vec4 center;\n" + "#version 150 \n" + "in highp vec4 vertex;\n" + "in highp vec3 normal;\n" + "in highp vec4 center;\n" "uniform highp mat4 mvp_matrix;\n" "uniform highp mat4 mv_matrix; \n" - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" + "out highp vec4 fP; \n" + "out highp vec3 fN; \n" "void main(void)\n" "{\n" " fP = mv_matrix * vertex; \n" @@ -52,15 +60,16 @@ void Viewer::compile_shaders() //Vertex source code const char fragment_source[] = { - "#version 120 \n" - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" + "#version 150 \n" + "in highp vec4 fP; \n" + "in highp vec3 fN; \n" "uniform highp vec4 color; \n" "uniform highp vec4 light_pos; \n" "uniform highp vec4 light_diff; \n" "uniform highp vec4 light_spec; \n" "uniform highp vec4 light_amb; \n" "uniform float spec_power ; \n" + "out highp vec4 out_color; \n" "void main(void) { \n" @@ -75,7 +84,7 @@ void Viewer::compile_shaders() " highp vec4 diffuse = max(dot(N,L), 0.0) * light_diff * color; \n" " highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n" - "gl_FragColor = light_amb*color + diffuse ; \n" + "out_color = light_amb*color + diffuse ; \n" "} \n" "\n" }; @@ -111,8 +120,8 @@ void Viewer::compile_shaders() //Vertex source code const char vertex_source_no_ext[] = { - "#version 120 \n" - "attribute highp vec4 vertex;\n" + "#version 150 \n" + "in highp vec4 vertex;\n" "uniform highp mat4 mvp_matrix;\n" "void main(void)\n" "{\n" @@ -123,10 +132,11 @@ void Viewer::compile_shaders() //Vertex source code const char fragment_source_no_ext[] = { - "#version 120 \n" + "#version 150 \n" "uniform highp vec4 color; \n" + "out highp vec4 out_color; \n" "void main(void) { \n" - "gl_FragColor = color; \n" + "out_color = color; \n" "} \n" "\n" }; @@ -669,8 +679,6 @@ void Viewer::compute_elements() { pos_points.resize(0); pos_lines.resize(0); - // Restore previous viewer state. - restoreStateFromFile(); //random generator of points within a sphere typedef CGAL::Creator_uniform_3 Creator; diff --git a/Circular_kernel_3/demo/Circular_kernel_3/Viewer.h b/Circular_kernel_3/demo/Circular_kernel_3/Viewer.h index ea178e756a0..cad037ce2c8 100644 --- a/Circular_kernel_3/demo/Circular_kernel_3/Viewer.h +++ b/Circular_kernel_3/demo/Circular_kernel_3/Viewer.h @@ -13,6 +13,7 @@ class Viewer : public CGAL::QGLViewer { public: Viewer(QWidget* parent = 0); + ~Viewer(); GLuint dl_nb; protected : virtual void draw(); diff --git a/Classification/examples/Classification/CMakeLists.txt b/Classification/examples/Classification/CMakeLists.txt index f149d1557ac..3d2e6ebfc28 100644 --- a/Classification/examples/Classification/CMakeLists.txt +++ b/Classification/examples/Classification/CMakeLists.txt @@ -56,8 +56,8 @@ if(NOT TARGET CGAL::TensorFlow_support) endif() find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library, and will not be compiled.") set(Classification_dependencies_met FALSE) @@ -105,7 +105,7 @@ foreach(target example_deprecated_conversion) if(TARGET ${target}) target_link_libraries( - ${target} PUBLIC CGAL::Eigen_support CGAL::Boost_iostreams_support + ${target} PUBLIC CGAL::Eigen3_support CGAL::Boost_iostreams_support CGAL::Boost_serialization_support) if(TARGET CGAL::TBB_support) target_link_libraries(${target} PUBLIC CGAL::TBB_support) diff --git a/Classification/examples/Classification/example_cluster_classification.cpp b/Classification/examples/Classification/example_cluster_classification.cpp index c635e32dc31..bd68016d589 100644 --- a/Classification/examples/Classification/example_cluster_classification.cpp +++ b/Classification/examples/Classification/example_cluster_classification.cpp @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include diff --git a/Classification/include/CGAL/Classification/ETHZ/Random_forest_classifier.h b/Classification/include/CGAL/Classification/ETHZ/Random_forest_classifier.h index 6b22c41ad00..9df36610a44 100644 --- a/Classification/include/CGAL/Classification/ETHZ/Random_forest_classifier.h +++ b/Classification/include/CGAL/Classification/ETHZ/Random_forest_classifier.h @@ -290,14 +290,10 @@ public: The output file is written in a binary format that is readable by the `load_configuration()` method. */ -#if defined(DOXYGEN_RUNNING) || \ - (defined(CGAL_LINKED_WITH_BOOST_IOSTREAMS) && \ - defined(CGAL_LINKED_WITH_BOOST_SERIALIZATION)) void save_configuration (std::ostream& output) const { m_rfc->write(output); } -#endif /*! \brief loads a configuration from the stream `input`. @@ -314,9 +310,6 @@ public: format for ETHZ Random Forest changed in CGAL 5.2. */ -#if defined(DOXYGEN_RUNNING) || \ - (defined(CGAL_LINKED_WITH_BOOST_IOSTREAMS) && \ - defined(CGAL_LINKED_WITH_BOOST_SERIALIZATION)) void load_configuration (std::istream& input) { CGAL::internal::liblearning::RandomForest::ForestParams params; @@ -324,7 +317,6 @@ public: m_rfc->read(input); } -#endif /// @} diff --git a/Classification/include/CGAL/Classification/Evaluation.h b/Classification/include/CGAL/Classification/Evaluation.h index eeff26f73d6..afdde15e216 100644 --- a/Classification/include/CGAL/Classification/Evaluation.h +++ b/Classification/include/CGAL/Classification/Evaluation.h @@ -123,7 +123,7 @@ public: CGAL_precondition (m_labels.is_valid_ground_truth (ground_truth)); CGAL_precondition (m_labels.is_valid_ground_truth (result)); - for (const auto& p : CGAL::make_range + for (const auto p : CGAL::make_range (boost::make_zip_iterator(boost::make_tuple(ground_truth.begin(), result.begin())), boost::make_zip_iterator(boost::make_tuple(ground_truth.end(), result.end())))) { diff --git a/Classification/test/Classification/CMakeLists.txt b/Classification/test/Classification/CMakeLists.txt index 629f3a46c29..dc1c43862b7 100644 --- a/Classification/test/Classification/CMakeLists.txt +++ b/Classification/test/Classification/CMakeLists.txt @@ -38,8 +38,8 @@ if(NOT TARGET CGAL::Boost_iostreams_support) endif() find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library, and will not be compiled.") set(Classification_dependencies_met FALSE) @@ -57,7 +57,7 @@ create_single_source_cgal_program("test_classification_io.cpp") foreach(target test_classification_point_set test_classification_io) target_link_libraries( - ${target} PUBLIC CGAL::Eigen_support CGAL::Boost_iostreams_support + ${target} PUBLIC CGAL::Eigen3_support CGAL::Boost_iostreams_support CGAL::Boost_serialization_support) if(TARGET CGAL::TBB_support) target_link_libraries(${target} PUBLIC CGAL::TBB_support) diff --git a/Convex_hull_2/examples/Convex_hull_2/ch_graham_anderson.cpp b/Convex_hull_2/examples/Convex_hull_2/ch_graham_anderson.cpp index bc98d8c91ed..019ede1ed24 100644 --- a/Convex_hull_2/examples/Convex_hull_2/ch_graham_anderson.cpp +++ b/Convex_hull_2/examples/Convex_hull_2/ch_graham_anderson.cpp @@ -2,7 +2,6 @@ #include #include #include -#include typedef CGAL::Exact_predicates_inexact_constructions_kernel K; @@ -23,7 +22,8 @@ ch_graham_anderson( InputIterator first, InputIterator beyond, std::vector< Point_2 > V (first, beyond); typename std::vector< Point_2 >::iterator it = std::min_element(V.begin(), V.end(), Less_xy_2()); - std::sort( V.begin(), V.end(), boost::bind(Less_rotate_ccw_2(), *it, _1, _2) ); + const Point_2 p = *it; + std::sort( V.begin(), V.end(), [&p](const Point_2& p1, const Point_2& p2){return Less_rotate_ccw_2()(p, p1, p2);} ); if ( *(V.begin()) != *(V.rbegin()) ) { result = CGAL::ch_graham_andrew_scan( V.begin(), V.end(), result, ch_traits); diff --git a/Convex_hull_2/include/CGAL/Convex_hull_2/ch_akl_toussaint_impl.h b/Convex_hull_2/include/CGAL/Convex_hull_2/ch_akl_toussaint_impl.h index c06435efcef..0fdc1a0367b 100644 --- a/Convex_hull_2/include/CGAL/Convex_hull_2/ch_akl_toussaint_impl.h +++ b/Convex_hull_2/include/CGAL/Convex_hull_2/ch_akl_toussaint_impl.h @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -296,9 +295,11 @@ ch_akl_toussaint(ForwardIterator first, ForwardIterator last, std::sort( std::next(region2.begin() ), region2.end(), ch_traits.less_xy_2_object() ); std::sort( std::next(region3.begin() ), region3.end(), - boost::bind(ch_traits.less_xy_2_object(), _2, _1) ); + [&ch_traits](const Point_2& p1, const Point_2& p2) + { return ch_traits.less_xy_2_object()(p2, p1); }); std::sort( std::next(region4.begin() ), region4.end(), - boost::bind(ch_traits.less_xy_2_object(), _2, _1) ); + [&ch_traits](const Point_2& p1, const Point_2& p2) + { return ch_traits.less_xy_2_object()(p2, p1); }); if (! equal_points(*w,*s) ) { diff --git a/Convex_hull_2/include/CGAL/Convex_hull_2/ch_bykat_impl.h b/Convex_hull_2/include/CGAL/Convex_hull_2/ch_bykat_impl.h index 32334e4e7f9..bcd0f1b13c0 100644 --- a/Convex_hull_2/include/CGAL/Convex_hull_2/ch_bykat_impl.h +++ b/Convex_hull_2/include/CGAL/Convex_hull_2/ch_bykat_impl.h @@ -26,7 +26,6 @@ #include #include #include -#include namespace CGAL { template @@ -43,7 +42,6 @@ ch_bykat(InputIterator first, InputIterator last, typedef typename Traits::Equal_2 Equal_2; Left_turn_2 left_turn = ch_traits.left_turn_2_object(); - Less_dist less_dist = ch_traits.less_signed_distance_to_line_2_object(); Equal_2 equal_points = ch_traits.equal_2_object(); if (first == last) return result; @@ -77,18 +75,23 @@ ch_bykat(InputIterator first, InputIterator last, H.push_back( a ); L.push_back( P.begin() ); R.push_back( l = std::partition(P.begin(), P.end(), - boost::bind(left_turn, boost::cref(a), boost::cref(b), _1))); - r = std::partition( l, P.end(), boost::bind(left_turn, boost::cref(b), boost::cref(a), _1)); + [&left_turn, &a, &b](const Point_2& p){ return left_turn(a,b,p); }) ); + r = std::partition( l, P.end(), [&left_turn, &a, &b](const Point_2& p){ return left_turn(b,a,p); }); for (;;) { + // This functor must be in the for loop so that the Convex_hull_constructive traits_2 works correctly + Less_dist less_dist = ch_traits.less_signed_distance_to_line_2_object(); if ( l != r) { - Point_2 c = *std::min_element( l, r, boost::bind(less_dist, boost::cref(a), boost::cref(b), _1, _2)); + Point_2 c = *std::min_element( l, r, [&less_dist,&a,&b](const Point_2&p1, const Point_2& p2) + { return less_dist(a, b, p1, p2); }); H.push_back( b ); L.push_back( l ); - R.push_back( l = std::partition(l, r, boost::bind(left_turn, boost::cref(b), boost::cref(c), _1))); - r = std::partition(l, r, boost::bind(left_turn, boost::cref(c), boost::cref(a), _1)); + R.push_back( l = std::partition(l, r, [&left_turn,&c,&b](const Point_2&p) + { return left_turn(b, c, p); })); + r = std::partition(l, r, [&left_turn,&c,&a](const Point_2&p) + { return left_turn(c, a, p); }); b = c; } else @@ -173,8 +176,10 @@ ch_bykat_with_threshold(InputIterator first, InputIterator last, H.push_back( a ); L.push_back( Pbegin ); Left_turn_2 left_turn = ch_traits.left_turn_2_object(); - R.push_back( l = std::partition( Pbegin, Pend, boost::bind(left_turn, boost::cref(a), boost::cref(b), _1))); - r = std::partition( l, Pend, boost::bind(left_turn, boost::cref(b), boost::cref(a), _1)); + R.push_back( l = std::partition( Pbegin, Pend, [&left_turn,&a,&b](const Point_2&p) + { return left_turn(a, b, p); })); + r = std::partition( l, Pend, [&left_turn,&a,&b](const Point_2&p) + { return left_turn(b, a, p); }); Less_dist less_dist = ch_traits.less_signed_distance_to_line_2_object(); for (;;) @@ -183,11 +188,14 @@ ch_bykat_with_threshold(InputIterator first, InputIterator last, { if ( r-l > CGAL_ch_THRESHOLD ) { - Point_2 c = *std::min_element( l, r, boost::bind(less_dist, boost::cref(a), boost::cref(b), _1, _2)); + Point_2 c = *std::min_element( l, r, [&less_dist,&a,&b](const Point_2&p1, const Point_2& p2) + { return less_dist(a, b, p1, p2); }); H.push_back( b ); L.push_back( l ); - R.push_back( l = std::partition(l, r, boost::bind(left_turn, boost::cref(b), boost::cref(c), _1))); - r = std::partition(l, r, boost::bind(left_turn, boost::cref(c), boost::cref(a), _1)); + R.push_back( l = std::partition(l, r, [&left_turn,&c,&b](const Point_2&p) + { return left_turn(b, c, p); })); + r = std::partition(l, r, [&left_turn,&a,&c](const Point_2&p) + { return left_turn(c, a, p); }); b = c; } else @@ -201,8 +209,8 @@ ch_bykat_with_threshold(InputIterator first, InputIterator last, } else { - std::sort(std::next(l), r, - boost::bind(ch_traits.less_xy_2_object(), _2, _1) ); + std::sort(std::next(l), r, [&ch_traits](const Point_2&p1, const Point_2& p2) + { return ch_traits.less_xy_2_object()(p2, p1); }); } ch__ref_graham_andrew_scan(l, std::next(r), res, ch_traits); std::swap( a, *l); diff --git a/Convex_hull_2/include/CGAL/Convex_hull_2/ch_eddy_impl.h b/Convex_hull_2/include/CGAL/Convex_hull_2/ch_eddy_impl.h index 2a7b29c2ddd..19df2467657 100644 --- a/Convex_hull_2/include/CGAL/Convex_hull_2/ch_eddy_impl.h +++ b/Convex_hull_2/include/CGAL/Convex_hull_2/ch_eddy_impl.h @@ -25,7 +25,6 @@ #include #include #include -#include namespace CGAL { @@ -45,7 +44,8 @@ ch__recursive_eddy(List& L, CGAL_ch_precondition( \ std::find_if(a_it, b_it, \ - boost::bind(left_turn, *b_it, *a_it, _1)) \ + [&left_turn, a_it, b_it](const Point_2& p) + { return left_turn(*b_it, *a_it, p); }) \ != b_it ); @@ -53,11 +53,14 @@ ch__recursive_eddy(List& L, Less_dist less_dist = ch_traits.less_signed_distance_to_line_2_object(); ListIterator c_it = std::min_element( f_it, b_it, // max before - boost::bind(less_dist, *a_it, *b_it, _1, _2)); + [&less_dist, a_it, b_it](const Point_2& p1, const Point_2& p2) + { return less_dist(*a_it, *b_it, p1, p2); }); Point_2 c = *c_it; - c_it = std::partition(f_it, b_it, boost::bind(left_turn, c, *a_it, _1)); - f_it = std::partition(c_it, b_it, boost::bind(left_turn, *b_it, c, _1)); + c_it = std::partition(f_it, b_it, [&left_turn, &c, a_it](const Point_2& p) + {return left_turn(c, *a_it, p);}); + f_it = std::partition(c_it, b_it, [&left_turn, &c, b_it](const Point_2& p) + {return left_turn(*b_it, c, p);}); c_it = L.insert(c_it, c); L.erase( f_it, b_it ); @@ -104,7 +107,8 @@ ch_eddy(InputIterator first, InputIterator last, L.erase(e); e = std::partition(L.begin(), L.end(), - boost::bind(left_turn, ep, wp, _1) ); + [&left_turn, &wp, &ep](const Point_2& p) + {return left_turn(ep, wp, p);} ); L.push_front(wp); e = L.insert(e, ep); @@ -112,7 +116,8 @@ ch_eddy(InputIterator first, InputIterator last, { ch__recursive_eddy( L, L.begin(), e, ch_traits); } - w = std::find_if( e, L.end(), boost::bind(left_turn, wp, ep, _1) ); + w = std::find_if( e, L.end(), [&left_turn, &wp, &ep](const Point_2& p) + { return left_turn(wp, ep, p); }); if ( w == L.end() ) { L.erase( ++e, L.end() ); diff --git a/Convex_hull_2/include/CGAL/Convex_hull_2/ch_jarvis_impl.h b/Convex_hull_2/include/CGAL/Convex_hull_2/ch_jarvis_impl.h index c5d3309cbd0..65b2d1fc29c 100644 --- a/Convex_hull_2/include/CGAL/Convex_hull_2/ch_jarvis_impl.h +++ b/Convex_hull_2/include/CGAL/Convex_hull_2/ch_jarvis_impl.h @@ -24,7 +24,6 @@ #include #include #include -#include namespace CGAL { @@ -65,7 +64,8 @@ ch_jarvis_march(ForwardIterator first, ForwardIterator last, Point previous_point = start_p; ) ForwardIterator it = std::min_element( first, last, - boost::bind(rotation_predicate, boost::cref(start_p), _1, _2) ); + [&start_p, &rotation_predicate](const Point& p1, const Point& p2) + {return rotation_predicate(start_p, p1, p2);} ); while (! equal_points(*it, stop_p) ) { CGAL_ch_exactness_assertion( \ @@ -80,7 +80,8 @@ ch_jarvis_march(ForwardIterator first, ForwardIterator last, constructed_points <= count_points + 1 ); it = std::min_element( first, last, - boost::bind(rotation_predicate, *it, _1, _2) ); + [it, &rotation_predicate](const Point& p1, const Point& p2) + {return rotation_predicate(*it, p1, p2);} ); } CGAL_ch_postcondition( \ is_ccw_strongly_convex_2( res.output_so_far_begin(), \ diff --git a/Convex_hull_2/include/CGAL/Convex_hull_2/convexity_check_2_impl.h b/Convex_hull_2/include/CGAL/Convex_hull_2/convexity_check_2_impl.h index 2b9d92a8edb..3e5b88d8d6a 100644 --- a/Convex_hull_2/include/CGAL/Convex_hull_2/convexity_check_2_impl.h +++ b/Convex_hull_2/include/CGAL/Convex_hull_2/convexity_check_2_impl.h @@ -18,7 +18,6 @@ #include #include -#include namespace CGAL { @@ -139,8 +138,6 @@ ch_brute_force_check_2(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, const Traits& ch_traits) { - using namespace boost; - typedef typename Traits::Left_turn_2 Left_of_line; ForwardIterator1 iter11; ForwardIterator2 iter21; @@ -165,12 +162,13 @@ ch_brute_force_check_2(ForwardIterator1 first1, ForwardIterator1 last1, while (iter22 != last2) { iter11 = std::find_if( first1, last1, - bind(left_turn, *iter22++, *iter21++, _1) ); + [left_turn, iter22, iter21](const auto& p){ return left_turn(*iter22, *iter21, p); } ); + ++iter22; ++iter21; if (iter11 != last1 ) return false; } iter11 = std::find_if( first1, last1, - bind(left_turn, *first2, *iter21, _1) ); + [left_turn, first2, iter21](const auto& p){ return left_turn(*first2, *iter21, p); } ); if (iter11 != last1 ) return false; return true; } @@ -203,7 +201,8 @@ ch_brute_force_chain_check_2(ForwardIterator1 first1, while (iter22 != last2) { iter11 = std::find_if( first1, last1, - bind(left_turn, *iter22++, *iter21++, _1) ); + [left_turn, iter22, iter21](const auto& p){ return left_turn(*iter22, *iter21, p); } ); + ++iter22; ++iter21; if (iter11 != last1 ) return false; } diff --git a/Convex_hull_3/include/CGAL/convex_hull_3.h b/Convex_hull_3/include/CGAL/convex_hull_3.h index 995c978abd8..cf35a6d78af 100644 --- a/Convex_hull_3/include/CGAL/convex_hull_3.h +++ b/Convex_hull_3/include/CGAL/convex_hull_3.h @@ -43,7 +43,6 @@ #include #include -#include #include #include #include @@ -576,7 +575,8 @@ farthest_outside_point(Face_handle f, std::list& outside_set, Outside_set_iterator farthest_it = std::max_element(outside_set.begin(), outside_set.end(), - boost::bind(less_dist_to_plane, plane, _1, _2)); + [&less_dist_to_plane,&plane](const Point& p1, const Point& p2) + { return less_dist_to_plane(plane, p1, p2); }); return farthest_it; } @@ -795,8 +795,10 @@ ch_quickhull_face_graph(std::list& points, // plane. std::pair min_max; min_max = CGAL::min_max_element(points.begin(), points.end(), - boost::bind(compare_dist, plane, _1, _2), - boost::bind(compare_dist, plane, _1, _2)); + [&compare_dist, &plane](const Point_3& p1, const Point_3& p2) + { return compare_dist(plane, p1, p2); }, + [&compare_dist, &plane](const Point_3& p1, const Point_3& p2) + { return compare_dist(plane, p1, p2); }); P3_iterator max_it; if (coplanar(*point1_it, *point2_it, *point3_it, *min_max.second)) { @@ -929,8 +931,10 @@ convex_hull_3(InputIterator first, InputIterator beyond, Less_dist less_dist = traits.less_distance_to_point_3_object(); P3_iterator_pair endpoints = min_max_element(points.begin(), points.end(), - boost::bind(less_dist, *points.begin(), _1, _2), - boost::bind(less_dist, *points.begin(), _1, _2)); + [&points, &less_dist](const Point_3& p1, const Point_3& p2) + { return less_dist(*points.begin(), p1, p2); }, + [&points, &less_dist](const Point_3& p1, const Point_3& p2) + { return less_dist(*points.begin(), p1, p2); }); typename Traits::Construct_segment_3 construct_segment = traits.construct_segment_3_object(); @@ -1032,8 +1036,10 @@ void convex_hull_3(InputIterator first, InputIterator beyond, Less_dist less_dist = traits.less_distance_to_point_3_object(); P3_iterator_pair endpoints = min_max_element(points.begin(), points.end(), - boost::bind(less_dist, *points.begin(), _1, _2), - boost::bind(less_dist, *points.begin(), _1, _2)); + [&points, &less_dist](const Point_3& p1, const Point_3& p2) + { return less_dist(*points.begin(), p1, p2); }, + [&points, &less_dist](const Point_3& p1, const Point_3& p2) + { return less_dist(*points.begin(), p1, p2); }); Convex_hull_3::internal::add_isolated_points(*endpoints.first, polyhedron); Convex_hull_3::internal::add_isolated_points(*endpoints.second, polyhedron); return; diff --git a/Distance_2/include/CGAL/squared_distance_2_1.h b/Distance_2/include/CGAL/squared_distance_2_1.h index f9b62838e91..171b8fd1e81 100644 --- a/Distance_2/include/CGAL/squared_distance_2_1.h +++ b/Distance_2/include/CGAL/squared_distance_2_1.h @@ -234,7 +234,7 @@ namespace internal { c2s = CGAL::abs(wcross(seg1.source(), seg1.target(), seg2.source(), k)); c2e = CGAL::abs(wcross(seg1.source(), seg1.target(), seg2.target(), k)); - Comparison_result dm = compare(c2s,c2e); + Comparison_result dm = CGAL::compare(c2s,c2e); if (dm == SMALLER) { return internal::squared_distance(seg2.source(), seg1, k); @@ -249,7 +249,7 @@ namespace internal { } else { c1s = CGAL::abs(wcross(seg2.source(), seg2.target(), seg1.source(), k)); c1e = CGAL::abs(wcross(seg2.source(), seg2.target(), seg1.target(), k)); - Comparison_result dm = compare(c1s,c1e); + Comparison_result dm = CGAL::compare(c1s,c1e); if (crossing2) { if (dm == SMALLER) { return internal::squared_distance(seg1.source(), seg2, k); @@ -272,7 +272,7 @@ namespace internal { c2s = CGAL::abs(wcross(seg1.source(), seg1.target(), seg2.source(), k)); c2e = CGAL::abs(wcross(seg1.source(), seg1.target(), seg2.target(), k)); - dm = compare(c2s,c2e); + dm = CGAL::compare(c2s,c2e); if (dm == EQUAL) // should not happen. return internal::squared_distance_parallel(seg1, seg2, k); diff --git a/Distance_3/include/CGAL/squared_distance_3.h b/Distance_3/include/CGAL/squared_distance_3.h index b805dd8af33..b55542f5e7f 100644 --- a/Distance_3/include/CGAL/squared_distance_3.h +++ b/Distance_3/include/CGAL/squared_distance_3.h @@ -21,5 +21,6 @@ #include #include #include +#include #endif diff --git a/Distance_3/include/CGAL/squared_distance_3_2.h b/Distance_3/include/CGAL/squared_distance_3_2.h index d3d20182a1f..78af20db08f 100644 --- a/Distance_3/include/CGAL/squared_distance_3_2.h +++ b/Distance_3/include/CGAL/squared_distance_3_2.h @@ -225,6 +225,7 @@ squared_distance_to_triangle( const typename K::Point_3 & t0, const typename K::Point_3 & t1, const typename K::Point_3 & t2, + bool & inside, const K& k) { typename K::Construct_vector_3 vector; @@ -239,6 +240,7 @@ squared_distance_to_triangle( && on_left_of_triangle_edge(pt, normal, t2, t0, k)) { // the projection of pt is inside the triangle + inside = true; return squared_distance_to_plane(normal, vector(t0, pt), k); } else { @@ -267,10 +269,12 @@ squared_distance( const K& k) { typename K::Construct_vertex_3 vertex; + bool inside = false; return squared_distance_to_triangle(pt, vertex(t, 0), vertex(t, 1), vertex(t, 2), + inside, k); } diff --git a/Distance_3/include/CGAL/squared_distance_3_3.h b/Distance_3/include/CGAL/squared_distance_3_3.h new file mode 100644 index 00000000000..8f2987a0d5f --- /dev/null +++ b/Distance_3/include/CGAL/squared_distance_3_3.h @@ -0,0 +1,126 @@ +// Copyright (c) 1998-2021 +// Utrecht University (The Netherlands), +// ETH Zurich (Switzerland), +// INRIA Sophia-Antipolis (France), +// Max-Planck-Institute Saarbruecken (Germany), +// and Tel-Aviv University (Israel). All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Geert-Jan Giezeman, Andreas Fabri + + +#ifndef CGAL_DISTANCE_3_3_H +#define CGAL_DISTANCE_3_3_H + +#include + +#include +#include + +namespace CGAL { + +namespace internal { + +template +inline +typename K::FT +squared_distance(const typename K::Tetrahedron_3 & t, + const typename K::Point_3 & pt, + const K& k) +{ + bool on_bounded_side = true; + const typename K::Point_3 t0 = t[0]; + const typename K::Point_3 t1 = t[1]; + const typename K::Point_3 t2 = t[2]; + const typename K::Point_3 t3 = t[3]; + + bool dmin_initialized = false; + typename K::FT dmin; + bool inside = false; + if(orientation(t0,t1,t2, pt) == NEGATIVE){ + on_bounded_side = false; + dmin = squared_distance_to_triangle(pt, t0, t1, t2, inside, k); + dmin_initialized = true; + if(inside){ + return dmin; + } + } + + if(orientation(t0,t3,t1, pt) == NEGATIVE){ + on_bounded_side = false; + const typename K::FT d = squared_distance_to_triangle(pt, t0, t3, t1, inside, k); + if(inside){ + return d; + } + if(! dmin_initialized){ + dmin = d; + dmin_initialized = true; + }else{ + dmin = (std::min)(d,dmin); + } + } + + if(orientation(t1,t3,t2, pt) == NEGATIVE){ + on_bounded_side = false; + const typename K::FT d = squared_distance_to_triangle(pt, t1, t3, t2, inside, k); + if(inside){ + return d; + } + if(! dmin_initialized){ + dmin = d; + dmin_initialized = true; + }else{ + dmin = (std::min)(d,dmin); + } + } + + if(orientation(t2,t3,t0, pt) == NEGATIVE){ + on_bounded_side = false; + const typename K::FT d = squared_distance_to_triangle(pt, t2, t3, t0, inside, k); + if(inside){ + return d; + } + if(! dmin_initialized){ + dmin = d; + dmin_initialized = true; + }else{ + dmin = (std::min)(d,dmin); + } + } + + if(on_bounded_side){ + return typename K::FT(0); + } + return dmin; +} + +} // namespace internal + + +template +typename K::FT +squared_distance(const Tetrahedron_3 & t, + const Point_3 & pt) +{ + return internal::squared_distance(t,pt,K()); +} + + +template +typename K::FT +squared_distance(const Point_3 & pt, + const Tetrahedron_3 & t) +{ + return internal::squared_distance(t,pt,K()); +} + +} //namespace CGAL + + +#endif diff --git a/Distance_3/test/Distance_3/test_distance_3.cpp b/Distance_3/test/Distance_3/test_distance_3.cpp index 4290da9919c..3a1f72fe786 100644 --- a/Distance_3/test/Distance_3/test_distance_3.cpp +++ b/Distance_3/test/Distance_3/test_distance_3.cpp @@ -56,6 +56,7 @@ struct Test { typedef CGAL::Triangle_3< K > T; typedef CGAL::Plane_3< K > Pl; typedef CGAL::Iso_cuboid_3< K > Cub; + typedef CGAL::Tetrahedron_3< K > Tet; template < typename Type > @@ -109,10 +110,19 @@ struct Test { void P_T() { - std::cout << "Point - Segment\n"; + std::cout << "Point - Triangle\n"; check_squared_distance (p(0, 1, 2), T(p(0, 0, 0), p( 2, 0, 0), p( 0, 2, 0)), 4); } + void P_Tet() + { + std::cout << "Point - Tetrahedron\n"; + check_squared_distance (p(0, 0, 0), Tet(p(0, 0, 0), p( 1, 0, 0), p( 0, 1, 0), p( 0, 0, 1)), 0); + check_squared_distance (p(0, 0, 2), Tet(p(0, 0, 0), p( 1, 0, 0), p( 0, 1, 0), p( 0, 0, 1)), 1); + check_squared_distance (p(0, 0, -1), Tet(p(0, 0, 0), p( 1, 0, 0), p( 0, 1, 0), p( 0, 0, 1)), 1); + check_squared_distance (p(5, 0, 0), Tet(p(0, 0, 0), p( 1, 0, 0), p( 0, 1, 0), p( 4, 0, 1)), 2); + } + void S_S() { std::cout << "Segment - Segment\n"; @@ -238,6 +248,7 @@ struct Test { P_P(); P_S(); P_T(); + P_Tet(); S_S(); P_R(); R_R(); diff --git a/Documentation/doc/CMakeLists.txt b/Documentation/doc/CMakeLists.txt index 94fc5649ef8..00d20d34bae 100644 --- a/Documentation/doc/CMakeLists.txt +++ b/Documentation/doc/CMakeLists.txt @@ -27,7 +27,7 @@ else() endif() find_package(Doxygen) -find_package(PythonInterp 2.6.7) +find_package(PythonInterp) if(NOT DOXYGEN_FOUND) message(WARNING "Cannot build the documentation without Doxygen!") diff --git a/Documentation/doc/Documentation/Developer_manual/Chapter_checks.txt b/Documentation/doc/Documentation/Developer_manual/Chapter_checks.txt index 2646529280a..52083c63a03 100644 --- a/Documentation/doc/Documentation/Developer_manual/Chapter_checks.txt +++ b/Documentation/doc/Documentation/Developer_manual/Chapter_checks.txt @@ -183,9 +183,9 @@ You should place the generated file in the proper directory (and possibly rename it). Then you can use the checks in the following fashion. \code{.cpp} - #include + #include - void optimisation\_foo( int i) + void optimisation_foo( int i) { CGAL_optimisation_precondition_msg( i == 42, "Only 42 allowed!"); // ... diff --git a/Documentation/doc/Documentation/Developer_manual/Chapter_debugging.txt b/Documentation/doc/Documentation/Developer_manual/Chapter_debugging.txt index e6a586b59af..3415b457cec 100644 --- a/Documentation/doc/Documentation/Developer_manual/Chapter_debugging.txt +++ b/Documentation/doc/Documentation/Developer_manual/Chapter_debugging.txt @@ -101,7 +101,7 @@ named `Traits1` and `Traits2`, and a third parameter named other is (presumably) a traits class that always gives the right answer. The `Adapter` is needed since the `X_curve` types for `Traits1` and `Traits2` might be different. -This cross-checker does nothing other then asserting that the two traits +This cross-checker does nothing other than asserting that the two traits classes return the same values by calling the the counterparts in the member traits classes (`tr1`,`tr2`) and comparing the results. diff --git a/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt b/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt index 60af5578426..64ce1695e41 100644 --- a/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt +++ b/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt @@ -26,7 +26,7 @@ source file. libraries (i.e.\ "Core", "ImageIO", and "Qt5"). An example is `-c Core`.
    `-b boost1:boost2:...`
    Lists components ("boost1", -"boost2") of \sc{Boost} to which the executable(s) should be +"boost2") of \boost to which the executable(s) should be linked. Valid options are, for instance, "filesystem" or "program_options". 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 0fffe791b9b..44baf0d84aa 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 @@ -30,11 +30,16 @@ This section describes a minimal example of a program that uses \cgal and Qt5 fo \subsection subcmake CMakeLists.txt \dontinclude Surface_mesh/CMakeLists.txt -\skip cmake -\until if ( CGAL_FOUND ) +\skip cmake_minimum_required +\until project + +\skip #CGAL_Qt5 is needed for the drawing. +\until endif() + \skip #create the executable of the application \until "draw_surface_mesh.cpp" -\skip if(CGAL_Qt5_FOUND ) + +\skip if(CGAL_Qt5_FOUND) \until target_link_libraries(draw_surface_mesh PUBLIC CGAL::CGAL_Qt5) \skip endif \until #end of the file diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index 6019c3057ae..a7232b3b1af 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -11,11 +11,11 @@ supporting C++14 or later. | Operating System | Compiler | | :------- | :--------------- | -| Linux | \sc{Gnu} `g++` 6.3 or later\cgalFootnote{`http://gcc.gnu.org/`} | +| Linux | \gnu `g++` 6.3 or later\cgalFootnote{`http://gcc.gnu.org/`} | | | `Clang` \cgalFootnote{`http://clang.llvm.org/`} compiler version 8.0.0 | -| \sc{MS} Windows | \sc{Gnu} `g++` 6.3 or later\cgalFootnote{`http://gcc.gnu.org/`} | -| | \sc{MS} Visual `C++` 14.0, 15.9, 16.0 (\sc{Visual Studio} 2015, 2017, and 2019)\cgalFootnote{`https://visualstudio.microsoft.com/`} | -| MacOS X | \sc{Gnu} `g++` 6.3 or later\cgalFootnote{`http://gcc.gnu.org/`} | +| \ms Windows | \gnu `g++` 6.3 or later\cgalFootnote{`http://gcc.gnu.org/`} | +| | \ms Visual `C++` 14.0, 15.9, 16.0 (\visualstudio 2015, 2017, and 2019)\cgalFootnote{`https://visualstudio.microsoft.com/`} | +| MacOS X | \gnu `g++` 6.3 or later\cgalFootnote{`http://gcc.gnu.org/`} | | | Apple `Clang` compiler versions 7.0.2 and 10.0.1 | @@ -23,7 +23,7 @@ supporting C++14 or later. Older versions of the above listed compilers might work, but no guarantee is provided. \section seccmake CMake -Version 3.1 or later +Version 3.12 or later In order to configure and build the \cgal examples, demos, or libraries, you need CMake, a cross-platform "makefile generator". @@ -58,38 +58,38 @@ The \stl comes with the compiler, and as such no installation is required. \subsection thirdpartyBoost Boost Version 1.66 or later -The \sc{Boost} libraries are a set of portable C++ source libraries. -Most of \sc{Boost} libraries are header-only, but a few of them need to be compiled or +The \boost libraries are a set of portable C++ source libraries. +Most of \boost libraries are header-only, but a few of them need to be compiled or installed as binaries. -\cgal only requires the headers of the \sc{Boost} libraries, but some demos and examples +\cgal only requires the headers of the \boost libraries, but some demos and examples depend on the binary library `Boost.Program_options`. -In case the \sc{Boost} libraries are not installed on your system already, you +In case the \boost libraries are not installed on your system already, you can obtain them from `https://www.boost.org/`. For Visual C++ you can download precompiled libraries from `https://sourceforge.net/projects/boost/files/boost-binaries/`. -As there is no canonical directory for where to find \sc{Boost} on Windows, +As there is no canonical directory for where to find \boost on Windows, we recommend that you define the environment variable -`BOOST_ROOT` and set it to where you have installed \sc{Boost}, e.g., `C:\boost\boost_1_69_0`. +`BOOST_ROOT` and set it to where you have installed \boost, e.g., `C:\boost\boost_1_69_0`. \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 -\sc{Gmp} and \sc{Mpfr} which are libraries for multi precision integers and rational numbers, +\gmp and \mpfr which are libraries for multi precision integers and rational numbers, and for multi precision floating point numbers. \cgal combines floating point arithmetic with exact arithmetic in order to be efficient and reliable. \cgal has a built-in -number type for that, but \sc{Gmp} and \sc{Mpfr} provide a faster +number type for that, but \gmp and \mpfr provide a faster solution, and we recommend to use them. These libraries can be obtained from `https://gmplib.org/` and `https://www.mpfr.org/`. -Since Visual \cpp is not properly supported by the \sc{Gmp} and \sc{Mpfr} projects, -we provide precompiled versions of \sc{Gmp} and \sc{Mpfr}, which can be downloaded with the installer +Since Visual \cpp is not properly supported by the \gmp and \mpfr projects, +we provide precompiled versions of \gmp and \mpfr, which can be downloaded with the installer `CGAL-\cgalReleaseNumber``-Setup.exe`. \section secoptional3rdpartysoftware Optional Third Party Libraries @@ -108,155 +108,159 @@ 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 \sc{Qt}5 installed on your system. -In case \sc{Qt} is not yet installed on your system, you can download +It requires \qt5 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 \sc{Qt}5 components used in demos is: +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`. \subsection thirdpartyEigen Eigen Version 3.1 or later -\sc{Eigen} is a `C++` template library for linear algebra. \sc{Eigen} supports all +\eigen is a `C++` template library for linear algebra. \eigen supports all matrix sizes, various matrix decomposition methods and sparse linear solvers. -In \cgal, \sc{Eigen} is used in many packages such as \ref +In \cgal, \eigen is used in many packages such as \ref PkgPoissonSurfaceReconstruction3 or \ref PkgJetFitting3, providing sparse linear solvers and singular value decompositions. A package -dependency over \sc{Eigen} is marked on the Package Overview page. In order to use Eigen in \cgal programs, the executables should be linked with the CMake imported target -`CGAL::Eigen_support` provided in `CGAL_Eigen_support.cmake`. +`CGAL::Eigen3_support` provided in `CGAL_Eigen3_support.cmake`. -The \sc{Eigen} web site is `http://eigen.tuxfamily.org`. +The \eigen web site is `http://eigen.tuxfamily.org`. \subsection thirdpartyOpenGR OpenGR -\sc{OpenGR} is a set C++ libraries for 3D Global Registration released under the terms of the APACHE V2 licence. +\opengr is a set C++ libraries for 3D Global Registration released under the terms of the APACHE V2 licence. -\cgal provides wrappers for the Super4PCS algorithm of \sc{OpenGR} in the \ref PkgPointSetProcessing3Ref -packages. In order to use \sc{OpenGR} in \cgal programs, the executables should be linked with the CMake imported target `CGAL::OpenGR_support` provided in `CGAL_OpenGR_support.cmake`. +\cgal provides wrappers for the Super4PCS algorithm of \opengr in the \ref PkgPointSetProcessing3Ref +packages. In order to use \opengr in \cgal programs, the executables should be linked with the CMake imported target `CGAL::OpenGR_support` provided in `CGAL_OpenGR_support.cmake`. -The \sc{OpenGR} web site is `https://github.com/STORM-IRIT/OpenGR`. +The \opengr web site is `https://github.com/STORM-IRIT/OpenGR`. \subsection thirdpartylibpointmatcher PointMatcher -\sc{libpointmatcher} is a modular library implementing the Iterative Closest Point (ICP) algorithm for aligning point clouds, released under a permissive BSD license. +\libpointmatcher is a modular library implementing the Iterative Closest Point (ICP) algorithm for aligning point clouds, released under a permissive BSD license. -\cgal provides wrappers for the ICP algorithm of \sc{libpointmatcher} in the \ref PkgPointSetProcessing3Ref -packages. In order to use \sc{libpointmatcher} in \cgal programs, the +\cgal provides wrappers for the ICP algorithm of \libpointmatcher in the \ref PkgPointSetProcessing3Ref +packages. In order to use \libpointmatcher in \cgal programs, the executables should be linked with the CMake imported target `CGAL::pointmatcher_support` provided in `CGAL_pointmatcher_support.cmake`. -The \sc{libpointmatcher} web site is `https://github.com/ethz-asl/libpointmatcher`. +\attention On Windows, we only support version 1.3.1 of PointMatcher with version 3.3.7 of Eigen, with some changes to the recipe at +`https://github.com/ethz-asl/libpointmatcher/blob/master/doc/CompilationWindows.md`:`NABO_INCLUDE_DIR` becomes `libnabo_INCLUDE_DIRS` +and `NABO_LIBRARY` becomes `libnabo_LIBRARIES` in the "Build libpointmatcher" section. + \subsection thirdpartyLeda LEDA Version 6.2 or later \leda is a library of efficient data structures and -algorithms. Like \sc{Core}, \leda offers a real number data type. +algorithms. Like \core, \leda offers a real number data type. In \cgal this library is optional, and its number types can -be used as an alternative to \sc{Gmp}, \sc{Mpfr}, and \sc{Core}. +be used as an alternative to \gmp, \mpfr, and \core. Free and commercial editions of \leda are available from `https://www.algorithmic-solutions.com`. \subsection thirdpartyMPFI Multiple Precision Floating-point Interval (MPFI) Version 1.4 or later -\sc{Mpfi} provides arbitrary precision interval arithmetic with intervals -represented using \sc{Mpfr} reliable floating-point numbers. -It is based on the libraries \sc{Gmp} and \sc{Mpfr}. +\mpfi provides arbitrary precision interval arithmetic with intervals +represented using \mpfr reliable floating-point numbers. +It is based on the libraries \gmp and \mpfr. In the setting of \cgal, this library is optional: it is used by some models of the \ref PkgAlgebraicKernelD "Algebraic Kernel". -\sc{Mpfi} can be downloaded from `https://mpfi.gforge.inria.fr/`. +\mpfi can be downloaded from `https://mpfi.gforge.inria.fr/`. \subsection thirdpartyRS3 RS and RS3 -\sc{Rs} (Real Solutions) is devoted to the study of the real roots of +\rs (Real Solutions) is devoted to the study of the real roots of polynomial systems with a finite number of complex roots (including -univariate polynomials). In \cgal, \sc{Rs} is used by one model of the +univariate polynomials). In \cgal, \rs is used by one model of the \ref PkgAlgebraicKernelD "Algebraic Kernel". -\sc{Rs} is freely distributable for non-commercial use. You can download it -from `http://vegas.loria.fr/rs/`. Actually, the \sc{Rs} package also includes \sc{Rs3}, the -successor of \sc{Rs}, which is used in conjunction with it. +\rs is freely distributable for non-commercial use. You can download it +from `http://vegas.loria.fr/rs/`. Actually, the \rs package also includes \rs3, the +successor of \rs, which is used in conjunction with it. -The libraries \sc{Rs} and \sc{Rs3} need \sc{Mpfi}, which can be downloaded from +The libraries \rs and \rs3 need \mpfi, which can be downloaded from `https://mpfi.gforge.inria.fr/`. \subsection thirdpartyNTL NTL Version 5.1 or later -\sc{Ntl} provides data structures and algorithms for signed, arbitrary +\ntl provides data structures and algorithms for signed, arbitrary length integers, and for vectors, matrices, and polynomials over the -integers and over finite fields. The optional library \sc{Ntl} is used by \cgal -to speed up operations of the Polynomial package, such as GCDs. It is recommended to install \sc{Ntl} with support from \sc{Gmp}. +integers and over finite fields. The optional library \ntl is used by \cgal +to speed up operations of the Polynomial package, such as GCDs. It is recommended to install \ntl with support from \gmp. -\sc{Ntl} can be downloaded from `https://www.shoup.net/ntl/`. +\ntl can be downloaded from `https://www.shoup.net/ntl/`. \subsection thirdpartyESBTL ESBTL -The \sc{Esbtl} (Easy Structural Biology Template Library) is a library that allows -the handling of \sc{Pdb} data. +The \esbtl (Easy Structural Biology Template Library) is a library that allows +the handling of \pdb data. -In \cgal, the \sc{Esbtl} is used in an example of the \ref PkgSkinSurface3 package. +In \cgal, the \esbtl is used in an example of the \ref PkgSkinSurface3 package. It can be downloaded from `http://esbtl.sourceforge.net/`. \subsection thirdpartyTBB Intel TBB -\sc{Tbb} (Threading Building Blocks) is a library developed by Intel Corporation for writing software +\tbb (Threading Building Blocks) is a library developed by Intel Corporation for writing software programs that take advantage of multi-core processors. -In \cgal, \sc{Tbb} is used by the packages that offer parallel -code. In order to use \sc{Tbb} in \cgal programs, the executables +In \cgal, \tbb is used by the packages that offer parallel +code. In order to use \tbb in \cgal programs, the executables should be linked with the CMake imported target `CGAL::TBB_support` provided in `CGAL_TBB_support.cmake`. -The \sc{Tbb} web site is `https://www.threadingbuildingblocks.org`. +The \tbb web site is `https://www.threadingbuildingblocks.org`. \subsection thirdpartyLASlib LASlib -\sc{LASlib} is a `C++` library for handling LIDAR data sets stored in +\laslib is a `C++` library for handling LIDAR data sets stored in the LAS format (or the compressed LAZ format). -In \cgal, \sc{LASlib} is used to provide input and output functions in -the \ref PkgPointSetProcessing3 package. In order to use \sc{LASlib} +In \cgal, \laslib is used to provide input and output functions in +the \ref PkgPointSetProcessing3 package. In order to use \laslib in \cgal programs, the executables should be linked with the CMake imported target `CGAL::LASLIB_support` provided in `CGAL_LASLIB_support.cmake`. -The \sc{LASlib} web site is `https://rapidlasso.com/lastools/`. \sc{LASlib} +The \laslib web site is `https://rapidlasso.com/lastools/`. \laslib is usually distributed along with LAStools: for simplicity, \cgal provides a fork with a CMake based install procedure. \subsection thirdpartyOpenCV OpenCV -\sc{OpenCV} (Open Computer Vision) is a library designed for computer +\opencv (Open Computer Vision) is a library designed for computer vision, computer graphics and machine learning. -In \cgal, \sc{OpenCV} is used by the \ref PkgClassification -package. In order to use \sc{OpenCV} in \cgal programs, the +In \cgal, \opencv is used by the \ref PkgClassification +package. In order to use \opencv in \cgal programs, the executables should be linked with the CMake imported target `CGAL::OpenCV_support` provided in `CGAL_OpenCV_support.cmake`. -The \sc{OpenCV} web site is `https://opencv.org/`. +The \opencv web site is `https://opencv.org/`. \subsection thirdpartyTensorFlow TensorFlow -\sc{TensorFlow} is a library designed for machine learning and deep learning. +\tensorflow is a library designed for machine learning and deep learning. -In \cgal, the C++ API of \sc{TensorFlow} is used by the \ref +In \cgal, the C++ API of \tensorflow is used by the \ref PkgClassification package for neural network. The C++ API can be compiled using CMake: it is distributed as part of the official package and is located in `tensorflow/contrib/cmake`. Be sure to @@ -266,20 +270,20 @@ enable and compile the following targets: - `tensorflow_BUILD_PYTHON_BINDINGS` - `tensorflow_BUILD_SHARED_LIB`. -In order to use \sc{TensorFlow} in \cgal programs, the executables +In order to use \tensorflow in \cgal programs, the executables should be linked with the CMake imported target `CGAL::TensorFlow_support` provided in `CGAL_TensorFlow_support.cmake`. -The \sc{TensorFlow} web site is `https://www.tensorflow.org/`. +The \tensorflow web site is `https://www.tensorflow.org/`. \subsection thirdpartyMETIS METIS Version 5.1 or later -\sc{METIS} is a library developed by the Karypis Lab +\metis is a library developed by the Karypis Lab and designed to partition graphs and produce fill-reducing matrix orderings. -\cgal offers wrappers around some of the methods of the \sc{METIS} library +\cgal offers wrappers around some of the methods of the \metis library to allow the partitioning of graphs that are models of the concepts of the Boost Graph Library, and, by extension, of surface meshes (see Section \ref BGLPartitioning of the package \ref PkgBGL). @@ -289,7 +293,7 @@ at `http://glaro \subsection thirdpartyzlib zlib -\sc{zlib} is a data compression library, and is essential for the component libCGAL_ImageIO. +\zlib is a data compression library, and is essential for the component libCGAL_ImageIO. In \cgal, this library is used in the examples of the \ref PkgSurfaceMesher3 package. @@ -298,9 +302,9 @@ for instance, on Windows, you can download it from `ceres-solver.org` @@ -308,26 +312,26 @@ for more information. \subsection thirdpartyGLPK GLPK -\sc{GLPK} (GNU Linear Programming Kit) is a library for solving linear programming (LP), mixed integer programming (MIP), and other related problems. +\glpk (GNU Linear Programming Kit) is a library for solving linear programming (LP), mixed integer programming (MIP), and other related problems. -In \cgal, \sc{GLPK} provides an optional linear integer program solver +In \cgal, \glpk provides an optional linear integer program solver in the \ref PkgPolygonalSurfaceReconstruction package. In order to use -\sc{GLPK} in \cgal programs, the executables should be linked with the +\glpk in \cgal programs, the executables should be linked with the CMake imported target `CGAL::GLPK_support` provided in `CGAL_GLPK_support.cmake`. -The \sc{GLPK} web site is `https://www.gnu.org/software/glpk/`. +The \glpk web site is `https://www.gnu.org/software/glpk/`. \subsection thirdpartySCIP SCIP -\sc{SCIP} (Solving Constraint Integer Programs) is currently one of the fastest open source solvers for mixed integer programming (MIP) and mixed integer nonlinear programming (MINLP). +\scip (Solving Constraint Integer Programs) is currently one of the fastest open source solvers for mixed integer programming (MIP) and mixed integer nonlinear programming (MINLP). -In \cgal, \sc{SCIP} provides an optional linear integer program solver +In \cgal, \scip provides an optional linear integer program solver in the \ref PkgPolygonalSurfaceReconstruction package. In order to use -\sc{SCIP} in \cgal programs, the executables should be linked with the +\scip in \cgal programs, the executables should be linked with the CMake imported target `CGAL::SCIP_support` provided in `CGAL_SCIP_support.cmake`. -The \sc{SCIP} web site is `http://scip.zib.de/`. +The \scip web site is `http://scip.zib.de/`. */ diff --git a/Documentation/doc/Documentation/Tutorials/Tutorial_GIS.txt b/Documentation/doc/Documentation/Tutorials/Tutorial_GIS.txt index 255f39a5f5c..9ac43d3eb53 100644 --- a/Documentation/doc/Documentation/Tutorials/Tutorial_GIS.txt +++ b/Documentation/doc/Documentation/Tutorials/Tutorial_GIS.txt @@ -276,7 +276,7 @@ classifier currently available in \cgal is the %random forest from ETHZ. As it is a supervised classifier, a training set is needed. The following snippet shows how to use some manually selected training -set to train a %fandom rorest classifier and compute a classification +set to train a %random forest classifier and compute a classification regularized by a graph cut algorithm: \snippet Classification/gis_tutorial_example.cpp Classification diff --git a/Documentation/doc/Documentation/Usage.txt b/Documentation/doc/Documentation/Usage.txt index eba087fdaa6..ae504aecf7c 100644 --- a/Documentation/doc/Documentation/Usage.txt +++ b/Documentation/doc/Documentation/Usage.txt @@ -83,9 +83,9 @@ contains the following subdirectories: | Directory | Contents | | :------------------------- | :----------| -| `auxiliary` (Windows only) | precompiled \sc{Gmp} and \sc{Mpfr} for Windows | +| `auxiliary` (Windows only) | precompiled \gmp and \mpfr for Windows | | `cmake/modules` | modules for finding and using libraries | -| `demo` | demo programs (most of them need \sc{Qt}, geomview or other third-party products) | +| `demo` | demo programs (most of them need \qt, geomview or other third-party products) | | `doc_html` | documentation (HTML) | | `examples` | example programs | | `include` | header files | @@ -94,13 +94,13 @@ contains the following subdirectories: The directories `include/CGAL/CORE` and `src/CGALCore` contain a distribution of the Core library version 1.7 for -dealing with algebraic numbers. Note that \sc{Core} is not part of \cgal and has its +dealing with algebraic numbers. Note that \core is not part of \cgal and has its own license. The directory `include/CGAL/OpenNL` contains a distribution of the Open Numerical Library, which provides solvers for sparse linear systems, especially designed for the Computer Graphics community. -\sc{OpenNL} is not part of \cgal and has its own license. +\opennl is not part of \cgal and has its own license. The only documentation shipped within \cgal sources is the present manual. The \cgal manual can also be accessed online at @@ -123,7 +123,7 @@ a standard location (such as `/usr/local/include`): For more advanced installations, we refer to Section \ref installation_configwithcmake. Note that even though \cgal is a header-only library, not all its dependencies -are header-only. The libraries \sc{Gmp} and \sc{Mpfr}, for example, are not +are header-only. The libraries \gmp and \mpfr, for example, are not header-only. As such, these dependencies must be built or installed independently. \section usage_configuring Configuring your Program @@ -235,7 +235,7 @@ The results of a successful configuration are build files that control the build The nature of the build files depends on the generator used during configuration, but in most cases they contain several targets, such as all the examples of the Triangulation_2 package. -In a \sc{Unix}-like environment the default generator produces makefiles. +In a \unix-like environment the default generator produces makefiles. You can use the `make` command-line tool for the succeeding build step as follows: cd CGAL-\cgalReleaseNumber/examples/Triangulation_2 diff --git a/Documentation/doc/Documentation/advanced/Configuration_variables.txt b/Documentation/doc/Documentation/advanced/Configuration_variables.txt index 2a880f1e488..191bb353d59 100644 --- a/Documentation/doc/Documentation/advanced/Configuration_variables.txt +++ b/Documentation/doc/Documentation/advanced/Configuration_variables.txt @@ -103,30 +103,30 @@ other but never both. \subsection installation_boost Boost Libraries -In most cases, if \sc{Boost} is not automatically found, setting the `BOOST_ROOT` +In most cases, if \boost is not automatically found, setting the `BOOST_ROOT` variable is enough. If it is not, you can specify the header and library directories individually. You can also provide the full pathname to a specific compiled library if it cannot be found in the library directory or its name is non-standard. -By default, when \sc{Boost} binary libraries are needed, the shared versions +By default, when \boost binary libraries are needed, the shared versions are used if present. You can set the variable `CGAL_Boost_USE_STATIC_LIBS` to `ON` if you want to link with static versions explicitly. -On Windows, if you link with \sc{Boost} shared libraries, you must ensure that +On Windows, if you link with \boost shared libraries, you must ensure that the `.dll` files are found by the dynamic linker, at run time. -For example, you can add the path to the \sc{Boost} `.dll` to the +For example, you can add the path to the \boost `.dll` to the `PATH` environment variable. | Variable | Description | Type | | :- | :- | :- | -| `BOOST_ROOT`\cgalFootnote{The environment variable can be spelled either `BOOST_ROOT` or `BOOSTROOT`} | Root directory of your \sc{Boost} installation | Either CMake or Environment | +| `BOOST_ROOT`\cgalFootnote{The environment variable can be spelled either `BOOST_ROOT` or `BOOSTROOT`} | Root directory of your \boost installation | Either CMake or Environment | | `Boost_INCLUDE_DIR` | Directory containing the `boost/version.hpp` file | CMake | | `BOOST_INCLUDEDIR` | Idem | Environment | -| `Boost_LIBRARY_DIRS` | Directory containing the compiled \sc{Boost} libraries | CMake | +| `Boost_LIBRARY_DIRS` | Directory containing the compiled \boost libraries | CMake | | `BOOST_LIBRARYDIR` | Idem | Environment | -| `Boost_(xyz)_LIBRARY_RELEASE` | Full pathname to a release build of the compiled 'xyz' \sc{Boost} library | CMake | -| `Boost_(xyz)_LIBRARY_DEBUG` | Full pathname to a debug build of the compiled 'xyz' \sc{Boost} library | CMake | +| `Boost_(xyz)_LIBRARY_RELEASE` | Full pathname to a release build of the compiled 'xyz' \boost library | CMake | +| `Boost_(xyz)_LIBRARY_DEBUG` | Full pathname to a debug build of the compiled 'xyz' \boost library | CMake | \subsection installation_gmp GMP and MPFR Libraries @@ -136,42 +136,42 @@ containing the libraries is needed and you would specify `GMP|MPFR_LIBRARY_DIR` `GMP|MPFR_LIBRARIES`. On the other hand, under Linux the actual library filename is needed. Thus you would specify `GMP|MPFR_LIBRARIES`. In no case you need to specify both. -\cgal uses both \sc{Gmp} and \sc{Mpfr} so both need to be supported. If either of them is unavailable the -usage of \sc{Gmp} and of \sc{Mpfr} will be disabled. +\cgal uses both \gmp and \mpfr so both need to be supported. If either of them is unavailable the +usage of \gmp and of \mpfr will be disabled. | Variable | Description | Type | | :- | :- | :- | -| `CGAL_DISABLE_GMP` | Indicates whether to search and use \sc{Gmp}/\sc{Mpfr} or not | CMake | -| `GMP_DIR` | Directory of \sc{Gmp} default installation | Environment | +| `CGAL_DISABLE_GMP` | Indicates whether to search and use \gmp/\mpfr or not | CMake | +| `GMP_DIR` | Directory of \gmp default installation | Environment | | `GMP_INCLUDE_DIR` | Directory containing the `gmp.h` file | CMake | | `GMP_INC_DIR` | Idem | Environment | -| `GMP_LIBRARIES_DIR` | Directory containing the compiled \sc{Gmp} library | CMake | +| `GMP_LIBRARIES_DIR` | Directory containing the compiled \gmp library | CMake | | `GMP_LIB_DIR` | Idem | Environment | -| `GMP_LIBRARIES` | Full pathname of the compiled \sc{Gmp} library | CMake | +| `GMP_LIBRARIES` | Full pathname of the compiled \gmp library | CMake | | `MPFR_INCLUDE_DIR` | Directory containing the `mpfr.h` file | CMake | | `MPFR_INC_DIR` | Idem | Environment | -| `MPFR_LIBRARIES_DIR` | Directory containing the compiled \sc{Mpfr} library | CMake | +| `MPFR_LIBRARIES_DIR` | Directory containing the compiled \mpfr library | CMake | | `MPFR_LIB_DIR` | Idem | Environment | -| `MPFR_LIBRARIES` | Full pathname of the compiled \sc{Mpfr} library | CMake | +| `MPFR_LIBRARIES` | Full pathname of the compiled \mpfr library | CMake | -Under Linux, the \sc{Gmpxx} is also searched for, and you may specify the following variables: +Under Linux, the \gmpxx is also searched for, and you may specify the following variables: | Variable | Description | Type | | :- | :- | :- | -| `GMPXX_DIR` | Directory of \sc{gmpxx} default installation | Environment | +| `GMPXX_DIR` | Directory of \gmpxx default installation | Environment | | `GMPXX_INCLUDE_DIR` | Directory containing the `gmpxx.h` file | CMake | -| `GMPXX_LIBRARIES` | Full pathname of the compiled \sc{Gmpxx} library | CMake | +| `GMPXX_LIBRARIES` | Full pathname of the compiled \gmpxx library | CMake | \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 \sc{Qt}5 installation. If you are +to the directory containing the file `Qt5Config.cmake` created by your \qt5 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 @@ -188,7 +188,7 @@ The variables specifying definitions and flags can be left undefined if they are | Variable | Description | Type | | :- | :- | :- | | `WITH_LEDA` | Indicates whether to search and use \leda or not | CMake | -| `LEDA_DIR` | Directory of \sc{LEDA} default installation | Environment | +| `LEDA_DIR` | Directory of \leda default installation | Environment | | `LEDA_INCLUDE_DIR` | Directory containing the file `LEDA/system/basic.h` | CMake | | `LEDA_LIBRARIES` | Directory containing the compiled \leda libraries | CMake | | `LEDA_INC_DIR` | Directory containing the file `LEDA/system/basic.h` | Environment | @@ -203,21 +203,21 @@ The variables specifying definitions and flags can be left undefined if they are \subsection installation_mpfi MPFI Library \cgal provides a number type based on this library, but the \cgal library -itself does not depend on \sc{Mpfi}. This means that this library must be +itself does not depend on \mpfi. This means that this library must be configured when compiling an application that uses the above number type. -When \sc{Mpfi} files are not on the standard path, the locations of the headers +When \mpfi files are not on the standard path, the locations of the headers and library files must be specified by using environment variables. | Variable | Description | Type | | :- | :- | :- | -| `MPFI_DIR` |Directory of \sc{MPFI} default installation | Environment | +| `MPFI_DIR` |Directory of \mpfi default installation | Environment | | `MPFI_INCLUDE_DIR` | Directory containing the `mpfi.h` file | CMake | | `MPFI_INC_DIR` | Idem | Environment | -| `MPFI_LIBRARIES_DIR` | Directory containing the compiled \sc{Mpfi} library | CMake | +| `MPFI_LIBRARIES_DIR` | Directory containing the compiled \mpfi library | CMake | | `MPFI_LIB_DIR` | Idem | Environment | -| `MPFI_LIBRARIES` | Full pathname of the compiled \sc{Mpfi} library | CMake | +| `MPFI_LIBRARIES` | Full pathname of the compiled \mpfi library | CMake | @@ -231,55 +231,55 @@ CMake will try to find Rs in the standard header and library directories. When it is not automatically detected, the locations of the headers and library files must be specified using environment variables. -Rs needs \sc{Gmp} 4.2 or later and \sc{Mpfi} 1.3.4 or later. The variables +Rs needs \gmp 4.2 or later and \mpfi 1.3.4 or later. The variables related to the latter library may also need to be defined. | Variable | Description | Type | | :- | :- | :- | -| `RS_DIR` | Directory of \sc{Rs} default installation | Environment | +| `RS_DIR` | Directory of \rs default installation | Environment | | `RS_INCLUDE_DIR` | Directory containing the `rs_exports.h` file | CMake | | `RS_INC_DIR` | Idem | Environment | -| `RS_LIBRARIES_DIR` | Directory containing the compiled \sc{Rs} library | CMake | +| `RS_LIBRARIES_DIR` | Directory containing the compiled \rs library | CMake | | `RS_LIB_DIR` | Idem | Environment | -| `RS_LIBRARIES` | Full pathname of the compiled \sc{Rs} library | CMake | +| `RS_LIBRARIES` | Full pathname of the compiled \rs library | CMake | -Similar variables exist for \sc{Rs3}. +Similar variables exist for \rs3. | Variable | Description | Type | | :- | :- | :- -| `RS3_DIR` | Directory of \sc{Rs3} default installation | Environment | +| `RS3_DIR` | Directory of \rs3 default installation | Environment | | `RS3_INCLUDE_DIR` | Directory containing the file `rs3_fncts.h` file | CMake | | `RS3_INC_DIR` | Idem | Environment | -| `RS3_LIBRARIES_DIR` | Directory containing the compiled \sc{Rs3} library | CMake | +| `RS3_LIBRARIES_DIR` | Directory containing the compiled \rs3 library | CMake | | `RS3_LIB_DIR` | Idem | Environment | -| `RS3_LIBRARIES` | Full pathname of the compiled \sc{Rs3} library | CMake | +| `RS3_LIBRARIES` | Full pathname of the compiled \rs3 library | CMake | \subsection installation_ntl NTL Library Some polynomial computations in \cgal's algebraic kernel -are speed up when \sc{Ntl} is available. +are speed up when \ntl is available. As the algebraic kernel is not compiled as a part of the \cgal library, this library is not detected nor configured at installation time. -CMake will try to find \sc{Ntl} in the standard header and library +CMake will try to find \ntl in the standard header and library directories. When it is not automatically detected, the locations of the headers and library files must be specified using environment variables. | Variable | Description | Type | | :- | :- | :- | -| `NTL_DIR` | Directory of \sc{NTL} default installation | Environment | +| `NTL_DIR` | Directory of \ntl default installation | Environment | | `NTL_INCLUDE_DIR` | Directory containing the `NTL/ZZX.h` file | CMake | | `NTL_INC_DIR` | Idem | Environment | -| `NTL_LIBRARIES_DIR` | Directory containing the compiled \sc{Ntl} library | CMake | +| `NTL_LIBRARIES_DIR` | Directory containing the compiled \ntl library | CMake | | `NTL_LIB_DIR` | Idem | Environment | -| `NTL_LIBRARIES` | Full pathname of the compiled \sc{Ntl} library | CMake | +| `NTL_LIBRARIES` | Full pathname of the compiled \ntl library | CMake | \subsection installation_eigen Eigen Library -\sc{Eigen} is a header-only template library. -Only the directory containing the header files of \sc{Eigen} 3.1 (or greater) is needed. +\eigen is a header-only template library. +Only the directory containing the header files of \eigen 3.1 (or greater) is needed. | Variable | Description | Type | @@ -289,35 +289,35 @@ Only the directory containing the header files of \sc{Eigen} 3.1 (or grea \subsection installation_esbtl ESBTL Library -One skin surface example requires the \sc{Esbtl} library in order to read \sc{Pdb} files. +One skin surface example requires the \esbtl library in order to read \pdb files. -If \sc{Esbtl} is not automatically found, setting the `ESBTL_INC_DIR` +If \esbtl is not automatically found, setting the `ESBTL_INC_DIR` environment variable is sufficient. | Variable | Description | Type | | :- | :- | :- | -| `ESBTL_DIR` | Directory of \sc{ESBTL} default installation | Environment | +| `ESBTL_DIR` | Directory of \esbtl default installation | Environment | | `ESBTL_INC_DIR` | Directory containing the `ESBTL/default.h` file | Environment | | `ESBTL_INCLUDE_DIR` | Directory containing the `ESBTL/default.h` file | CMake | \subsection installation_metis METIS Library -Some BGL examples require the \sc{Metis} library in order to partition \sc{Metis} meshes. +Some BGL examples require the \metis library in order to partition \metis meshes. -If \sc{Metis} is not automatically found, setting the `METIS_INCLUDE_DIR` and `METIS_LIBRARY` +If \metis is not automatically found, setting the `METIS_INCLUDE_DIR` and `METIS_LIBRARY` cmake variables is necessary. | Variable | Description | Type | | :- | :- | :- | -| `METIS_INCLUDE_DIR` | Directory of \sc{Metis} default installation | CMAKE | +| `METIS_INCLUDE_DIR` | Directory of \metis default installation | CMAKE | | `METIS_LIBRARY` | Directory containing the `libmetis.so or .lib` file | CMAKE | \subsection installation_tbb TBB Library -If \sc{Tbb} is not automatically found, the user must set the `TBB_ROOT` +If \tbb is not automatically found, the user must set the `TBB_ROOT` environment variable. The environment variable `TBB_ARCH_PLATFORM=/` must be set. `` is `ia32` or `intel64`. `` describes the Linux kernel, gcc version or Visual Studio version used. It should be set to what is used in `$TBB_ROOT/lib/`. @@ -328,7 +328,7 @@ Note that the variables in the table below are being used. | Variable | Description | Type | | :- | :- | :- | -| `TBB_ROOT` | Directory of \sc{Tbb} default installation | Environment | +| `TBB_ROOT` | Directory of \tbb default installation | Environment | | `TBB_INCLUDE_DIRS` | Directory containing the `tbb/tbb.h` file | CMake | | `TBB_LIBRARY_DIRS` | Directory(ies) containing the compiled TBB libraries | CMake | | `TBB_LIBRARIES` | Full pathnames of the compiled TBB libraries (both release and debug versions, using "optimized" and "debug" CMake keywords). Note that if the debug versions are not found, the release versions will be used instead for the debug mode. | CMake | diff --git a/Documentation/doc/Documentation/advanced/Installation.txt b/Documentation/doc/Documentation/advanced/Installation.txt index 314ead765e1..e5dd13a0e80 100644 --- a/Documentation/doc/Documentation/advanced/Installation.txt +++ b/Documentation/doc/Documentation/advanced/Installation.txt @@ -60,10 +60,10 @@ Note that some libraries have specific dependencies in addition to the essential | Library | CMake Variable | Functionality | Dependencies | | :-------- | :------------- | :------------ | :----------- | -| `%CGAL` | none | Main library | \sc{Gmp}, \sc{Mpfr}, \sc{Boost} (headers) | -| `CGAL_Core` | `WITH_CGAL_Core` | The %CORE library for algebraic numbers.\cgalFootnote{CGAL_Core is not part of \cgal, but a custom version of the \sc{Core} library distributed by \cgal for the user convenience and it has it's own license.} | \sc{Gmp} and \sc{Mpfr} | -| `CGAL_ImageIO` | `WITH_CGAL_ImageIO` | Utilities to read and write image files | \sc{zlib}, \sc{Vtk} (optional) | -| `CGAL_Qt5` | `WITH_CGAL_Qt5` | `QGraphicsView` support for \sc{Qt}5-based demos | \sc{Qt}5 | +| `%CGAL` | none | Main library | \gmp, \mpfr, \boost (headers) | +| `CGAL_Core` | `WITH_CGAL_Core` | The %CORE library for algebraic numbers.\cgalFootnote{CGAL_Core is not part of \cgal, but a custom version of the \core library distributed by \cgal for the user convenience and it has it's own license.} | \gmp and \mpfr | +| `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 | Shared libraries, also called dynamic-link libraries, are built by default (`.so` on Linux, `.dylib` on macOS). You @@ -77,7 +77,7 @@ the \cgal libraries, unless you set the variables `WITH_examples=ON` and/or `WIT Additionally, even when configured with \cgal, they are not automatically built along with the libraries. You must build the `examples` or `demos` targets (or IDE projects) explicitly. -If you do not plan to compile any demos, you may skip some of the dependencies (such as \sc{Qt}), +If you do not plan to compile any demos, you may skip some of the dependencies (such as \qt), as the corresponding \cgal-libraries will not be used. Note, however, that your own demos might need these \cgal-libraries and thus their dependencies. See the page \ref secessential3rdpartysoftware for more information. @@ -215,7 +215,7 @@ The nature of the build files depends on the generator used during configuration contain several targets, one per library, and a default global target corresponding to all the libraries. -For example, in a \sc{Unix}-like environment the default generator produces makefiles. +For example, in a \unix-like environment the default generator produces makefiles. You can use the `make` command-line tool for the succeeding build step as follows: # build all the selected libraries at once @@ -277,7 +277,7 @@ the installation simply amounts to: \cgalAdvancedBegin The files are copied into a directory tree relative to the installation directory determined by the -CMake variable `CMAKE_INSTALL_PREFIX`. This variable defaults to `/usr/local` under \sc{Unix}-like operating systems. +CMake variable `CMAKE_INSTALL_PREFIX`. This variable defaults to `/usr/local` under \unix-like operating systems. If you want to install to a different location, you must override that CMake variable explicitly at the configuration time and not when executing the install step. \cgalAdvancedEnd diff --git a/Documentation/doc/Documentation/manual.txt b/Documentation/doc/Documentation/manual.txt index 38bc7bb37ee..060c0686bd4 100644 --- a/Documentation/doc/Documentation/manual.txt +++ b/Documentation/doc/Documentation/manual.txt @@ -11,7 +11,7 @@ of computational geometry. Each part consists of several chapters, and each chapter is split into a *User Manual* and a *Reference Manual*. The User Manual gives the general idea and comes with examples. -The Reference Manual presents the \sc{Api} of the various classes +The Reference Manual presents the \api of the various classes and functions. The manual has a \ref packages with a short paragraph explaining diff --git a/Documentation/doc/Documentation/windows.txt b/Documentation/doc/Documentation/windows.txt index 77021a27a28..3765cf34e58 100644 --- a/Documentation/doc/Documentation/windows.txt +++ b/Documentation/doc/Documentation/windows.txt @@ -2,8 +2,8 @@ \page windows Using %CGAL on Windows (with Visual C++) \cgalAutoToc -\cgal \cgalReleaseNumber is supported for the following \sc{MS} Visual `C++` compilers: -14.0, 15.9, 16.0 (\sc{Visual Studio} 2015, 2017, and 2019). +\cgal \cgalReleaseNumber is supported for the following \ms Visual `C++` compilers: +14.0, 15.9, 16.0 (\visualstudio 2015, 2017, and 2019). \cgal is a library that has mandatory dependencies that must be first installed: \ref thirdpartyBoost and \ref thirdpartyMPFR. @@ -16,9 +16,9 @@ installation instructions. If you choose to use `vcpkg`, you might have to bootstrap and download and compile it, but from then on `vcpkg` will make your life easier. -On the other hand, if you need to specify a specific version, or have already installed +On the other hand, if you need to use a specific version, or have already installed a certain version of a dependency and do not wish to potentially have multiple versions installed, -you will want to use the \cgal Installer. +you will want to use the \cgal source archive. We explain the two approaches in the next two sections. @@ -43,12 +43,16 @@ We refer to the official documentation of `vcpkg` if you want to compile for an older version of a compiler. +Because of a bug with gmp in vcpkg for windows, you need to install `yasm-tool` in 32 bits to be able to correctly build gmp 64bits, needed for cgal: + + C:\dev\vcpkg> ./vcpkg.exe install yasm-tool:x86-windows + You are now ready to install \cgal: C:\dev\vcpkg> ./vcpkg.exe install cgal -This will take several minutes as it downloads \mpir (a fork of \gmp), -\mpfr, all boost header files, and it will compile \mpir and \mpfr, as well +This will take several minutes as it downloads \gmp, +\mpfr, all boost header files, and it will compile \gmp and \mpfr, as well as several boost libraries. Afterwards, you will find the include files, libraries, and dlls in the subdirectory `C:\dev\vcpkg\installed\x64-windows`. @@ -146,11 +150,19 @@ you are advised to look at the `CMakeLists.txt` files in the example folder of the package(s) that you are using to learn how to specify \cgal and additional third party dependencies. -\section install-with-installer Installing with the CGAL Installer +\section install-from-source Installing from the Source Archive + +You can download and extract `CGAL-\cgalReleaseNumber``.zip` from https://www.cgal.org/download/windows.html. + +\subsection ssect-installer-gmp-mpfr Installing GMP and MPFR + +Precompiled version of \gmp and \mpfr are provided in the asset GMP and MPFR libraries, for Windows 64bits +from https://github.com/CGAL/cgal/releases. +If you only install those libraries to use \cgal, then you should extract this archive inside the directory +`CGAL-\cgalReleaseNumber` created when extracting the \cgal zip source archive. +That way those dependencies will be automatically detected by cmake +(you should then get the directory `CGAL-\cgalReleaseNumber``\``auxiliary``\``gmp`). -You can download and run `CGAL-\cgalReleaseNumber``-Setup.exe` from https://www.cgal.org/download/windows.html. -It is a self-extracting executable that downloads the \cgal header files, and optionally the source code of the -examples and demos. Additionally, it can download precompiled versions of \gmp and \mpfr. \subsection ssect-installer-boost Installing Boost @@ -267,9 +279,4 @@ you are advised to look at the `CMakeLists.txt` files in the example folder of the package(s) that you are using to learn how to specify \cgal and additional third party dependencies. -\section install-with-tarball Installing from the Source Archive - -Instead of the installer you can also download release tarballs. The sole difference -is that the installer also downloads precompiled \gmp and \mpfr libraries. - */ diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 7823701417f..9b895b4740e 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -628,6 +628,25 @@ Mourrain and Monique Teillaud" keywords = "Convex hull problem, Frame, Linear programming, Data envelopment analysis, Redundancy" } +@article{cgal:dl-cginc-19, + author = {Despr\'{e}, Vincent and Lazarus, Francis}, + title = {Computing the Geometric Intersection Number of Curves}, + year = {2019}, + issue_date = {December 2019}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {66}, + number = {6}, + issn = {0004-5411}, + url = {https://doi.org/10.1145/3363367}, + doi = {10.1145/3363367}, + journal = {J. ACM}, + month = nov, + articleno = {45}, + numpages = {49}, + keywords = {combinatorial geodesic, Computational topology, intersection number, curves on surfaces} +} + @unpublished{cgal:dl-cosfa-08, author = "J.H. Dul\'a and F.J. L\'opez", title = "Competing Output-Sensitive Frame Algorithms", diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index 85d7742a660..93ef2198d79 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -228,19 +228,53 @@ TAB_SIZE = 4 # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. -ALIASES = "sc{1}=\1" \ - "cgal=\sc{%CGAL}" \ - "protocgal=\sc{C++gal}" \ - "plageo=\sc{Plageo}" \ - "stl=\sc{STL}" \ - "gmp=\sc{GMP}" \ - "mpir=\sc{MPIR}" \ - "mpfr=\sc{MPFR}" \ - "leda=\sc{LEDA}" \ - "gcc=\sc{GCC}" \ - "cpp=\sc{C++}" \ - "cpp11=\sc{C++11}" \ - "CC=\sc{C++}" \ +ALIASES = "cgal=CGAL" \ + "protocgal=C++gal" \ + "plageo=Plageo" \ + "stl=STL" \ + "gmp=GMP" \ + "gmpxx=GMPXX" \ + "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" \ + "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" \ @@ -950,7 +984,7 @@ EXCLUDE_SYMBOLS = Tr \ Fb \ K \ Traits \ - internal + internal # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include diff --git a/Documentation/doc/resources/1.8.14/BaseDoxyfile.in b/Documentation/doc/resources/1.8.14/BaseDoxyfile.in index aad98822d2f..faca6fc348e 100644 --- a/Documentation/doc/resources/1.8.14/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.14/BaseDoxyfile.in @@ -229,19 +229,53 @@ TAB_SIZE = 4 # 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. -ALIASES = "sc{1}=\1" \ - "cgal=\sc{%CGAL}" \ - "protocgal=\sc{C++gal}" \ - "plageo=\sc{Plageo}" \ - "stl=\sc{STL}" \ - "gmp=\sc{GMP}" \ - "mpir=\sc{MPIR}" \ - "mpfr=\sc{MPFR}" \ - "leda=\sc{LEDA}" \ - "gcc=\sc{GCC}" \ - "cpp=\sc{C++}" \ - "cpp11=\sc{C++11}" \ - "CC=\sc{C++}" \ +ALIASES = "cgal=CGAL" \ + "protocgal=C++gal" \ + "plageo=Plageo" \ + "stl=STL" \ + "gmp=GMP" \ + "gmpxx=GMPXX" \ + "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" \ + "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" \ @@ -941,7 +975,7 @@ EXCLUDE_SYMBOLS = Tr \ Fb \ K \ Traits \ - internal + internal # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include diff --git a/Documentation/doc/resources/1.8.20/BaseDoxyfile.in b/Documentation/doc/resources/1.8.20/BaseDoxyfile.in index e7cce2eb165..767fa9f07b2 100644 --- a/Documentation/doc/resources/1.8.20/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.20/BaseDoxyfile.in @@ -93,14 +93,6 @@ ALLOW_UNICODE_NAMES = NO OUTPUT_LANGUAGE = English -# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all generated output in the proper direction. -# Possible values are: None, LTR, RTL and Context. -# The default value is: None. - -OUTPUT_TEXT_DIRECTION = None - # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. @@ -259,19 +251,53 @@ TAB_SIZE = 4 # commands \{ and \} for these it is advised to use the version @{ and @} or use # a double escape (\\{ and \\}) -ALIASES = "sc{1}=\1" \ - "cgal=\sc{%CGAL}" \ - "protocgal=\sc{C++gal}" \ - "plageo=\sc{Plageo}" \ - "stl=\sc{STL}" \ - "gmp=\sc{GMP}" \ - "mpir=\sc{MPIR}" \ - "mpfr=\sc{MPFR}" \ - "leda=\sc{LEDA}" \ - "gcc=\sc{GCC}" \ - "cpp=\sc{C++}" \ - "cpp11=\sc{C++11}" \ - "CC=\sc{C++}" \ +ALIASES = "cgal=CGAL" \ + "protocgal=C++gal" \ + "plageo=Plageo" \ + "stl=STL" \ + "gmp=GMP" \ + "gmpxx=GMPXX" \ + "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" \ + "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" \ @@ -1006,7 +1032,7 @@ EXCLUDE_SYMBOLS = Tr \ Fb \ K \ Traits \ - internal + internal # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include diff --git a/Documentation/doc/resources/1.8.4/BaseDoxyfile.in b/Documentation/doc/resources/1.8.4/BaseDoxyfile.in index d5b6d350ea7..eaca76a8e42 100644 --- a/Documentation/doc/resources/1.8.4/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.4/BaseDoxyfile.in @@ -197,19 +197,54 @@ TAB_SIZE = 4 # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. -ALIASES = "sc{1}=\1" -ALIASES += "cgal=\sc{%CGAL}" -ALIASES += "protocgal=\sc{C++gal}" -ALIASES += "plageo=\sc{Plageo}" -ALIASES += "gmp=\sc{GMP}" -ALIASES += "mpir=\sc{MPIR}" -ALIASES += "mpfr=\sc{MPFR}" -ALIASES += "stl=\sc{STL}" -ALIASES += "leda=\sc{LEDA}" -ALIASES += "gcc=\sc{GCC}" -ALIASES += "cpp=\sc{C++}" -ALIASES += "cpp11=\sc{C++11}" -ALIASES += "CC=\sc{C++}" +ALIASES = "cgal=CGAL" +ALIASES += "protocgal=C++gal" +ALIASES += "plageo=Plageo" +ALIASES += "stl=STL" +ALIASES += "gmp=GMP" +ALIASES += "gmpxx=GMPXX" +ALIASES += "mpir=MPIR" +ALIASES += "mpfr=MPFR" +ALIASES += "leda=LEDA" +ALIASES += "gcc=GCC" +ALIASES += "dcel=DCEL" +ALIASES += "bgl=BGL" +ALIASES += "boost=Boost" +ALIASES += "gnu=GNU" +ALIASES += "ms=MS" +ALIASES += "qt=Qt" +ALIASES += "qt5=Qt5" +ALIASES += "eigen=Eigen" +ALIASES += "opengr=OpenGR" +ALIASES += "libpointmatcher=libpointmatcher" +ALIASES += "core=Core" +ALIASES += "mpfi=MPFI" +ALIASES += "ntl=NTL" +ALIASES += "pdb=PDB" +ALIASES += "esbtl=ESBTL" +ALIASES += "tbb=TBB" +ALIASES += "laslib=LASlib" +ALIASES += "opencv=OpenCV" +ALIASES += "tensorflow=TensorFlow" +ALIASES += "metis=METIS" +ALIASES += "zlib=zlib" +ALIASES += "ceres=Ceres" +ALIASES += "glpk=GLPK" +ALIASES += "scip=SCIP" +ALIASES += "rs=RS" +ALIASES += "rs3=RS3" +ALIASES += "unix=Unix" +ALIASES += "api=API" +ALIASES += "vtk=VTK" +ALIASES += "visualstudio=Visual Studio" +ALIASES += "taucs=TAUCS" +ALIASES += "lapack=LAPACK" +ALIASES += "blas=BLAS" +ALIASES += "opennl=OpenNL" +ALIASES += "cpp=C++" +ALIASES += "cpp11=C++11" +ALIASES += "CC=C++" + ALIASES += "cgalExample{1}=
    File \ref \1 \include \1" ALIASES += "cgalFigureAnchor{1}=\anchor fig__\1" ALIASES += "cgalFigureRef{1}=\ref fig__\1" diff --git a/Documentation/doc/scripts/generate_how_to_cite.py b/Documentation/doc/scripts/generate_how_to_cite.py index caad53d6392..2120824773e 100644 --- a/Documentation/doc/scripts/generate_how_to_cite.py +++ b/Documentation/doc/scripts/generate_how_to_cite.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # coding: utf8 import re diff --git a/Documentation/doc/scripts/html_output_post_processing.py b/Documentation/doc/scripts/html_output_post_processing.py index f07bd3d2ced..4771a010ae5 100755 --- a/Documentation/doc/scripts/html_output_post_processing.py +++ b/Documentation/doc/scripts/html_output_post_processing.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # Copyright (c) 2012 GeometryFactory (France). All rights reserved. # All rights reserved. # diff --git a/Documentation/doc/scripts/pkglist_filter.py b/Documentation/doc/scripts/pkglist_filter.py index af99777d529..92208a6f4d9 100755 --- a/Documentation/doc/scripts/pkglist_filter.py +++ b/Documentation/doc/scripts/pkglist_filter.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python import codecs import re diff --git a/Documentation/doc/scripts/testsuite.py b/Documentation/doc/scripts/testsuite.py index 1fda305b1e0..255191e61c4 100755 --- a/Documentation/doc/scripts/testsuite.py +++ b/Documentation/doc/scripts/testsuite.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # Copyright (c) 2012 GeometryFactory (France). All rights reserved. # All rights reserved. # diff --git a/Envelope_3/doc/Envelope_3/Envelope_3.txt b/Envelope_3/doc/Envelope_3/Envelope_3.txt index 3d994446e0e..d6a614d5e80 100644 --- a/Envelope_3/doc/Envelope_3/Envelope_3.txt +++ b/Envelope_3/doc/Envelope_3/Envelope_3.txt @@ -58,7 +58,7 @@ both these diagrams as envelope diagrams. It is easy to see that an envelope diagram is no more than a planar arrangement (see Chapter \ref chapterArrangement_on_surface_2 "2D Arrangements"), represented -using an extended \sc{Dcel} structure, such that every \sc{Dcel} +using an extended \dcel structure, such that every \dcel record (namely each face, halfedge and vertex) stores an additional container of it originators: the \f$ xy\f$-monotone surfaces that induce this feature. diff --git a/Filtered_kernel/include/CGAL/Filtered_predicate.h b/Filtered_kernel/include/CGAL/Filtered_predicate.h index 63199a63a32..da9e4b1c4fb 100644 --- a/Filtered_kernel/include/CGAL/Filtered_predicate.h +++ b/Filtered_kernel/include/CGAL/Filtered_predicate.h @@ -37,6 +37,10 @@ namespace CGAL { // not, or we let all this up to the compiler optimizer to figure out ? // - Some caching could be done at the Point_2 level. +// Protection is undocumented and currently always true, meaning that it +// assumes a default rounding mode of round-to-nearest. false would correspond +// to a default of round-towards-infinity, so interval arithmetic does not +// require protection but regular code may. template class Filtered_predicate diff --git a/Filtered_kernel/include/CGAL/Lazy.h b/Filtered_kernel/include/CGAL/Lazy.h index 539ebbff948..82d6ff20f58 100644 --- a/Filtered_kernel/include/CGAL/Lazy.h +++ b/Filtered_kernel/include/CGAL/Lazy.h @@ -874,7 +874,7 @@ struct Lazy_construction_bbox template -struct Lazy_construction_optional +struct Lazy_construction_optional_for_polygonal_envelope { static const bool Protection = true; typedef typename LK::Approximate_kernel AK; diff --git a/Filtered_kernel/include/CGAL/Lazy_kernel.h b/Filtered_kernel/include/CGAL/Lazy_kernel.h index 71edc17eff7..89a84b5f150 100644 --- a/Filtered_kernel/include/CGAL/Lazy_kernel.h +++ b/Filtered_kernel/include/CGAL/Lazy_kernel.h @@ -178,7 +178,7 @@ private: // The case distinction goes as follows: // result_type == FT => NT // result_type == Object => Object - // result_type == boost::optional => OPTIONAL_ + // result_type == boost::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 @@ -214,7 +214,7 @@ private: CGAL_WRAPPER_TRAIT(Intersect_2, VARIANT) CGAL_WRAPPER_TRAIT(Intersect_3, VARIANT) - CGAL_WRAPPER_TRAIT(Intersect_point_3, OPTIONAL_) + CGAL_WRAPPER_TRAIT(Intersect_point_3_for_polyhedral_envelope, OPTIONAL_) CGAL_WRAPPER_TRAIT(Compute_squared_radius_2, NT) CGAL_WRAPPER_TRAIT(Compute_x_3, NT) CGAL_WRAPPER_TRAIT(Compute_y_3, NT) @@ -258,7 +258,7 @@ private: template struct Select_wrapper_impl { template - struct apply { typedef Lazy_construction_optional type; }; + struct apply { typedef Lazy_construction_optional_for_polygonal_envelope type; }; }; template diff --git a/Filtered_kernel/include/CGAL/internal/Static_filters/Collinear_3.h b/Filtered_kernel/include/CGAL/internal/Static_filters/Collinear_3.h index 723ae59fa0c..96ea877fc47 100644 --- a/Filtered_kernel/include/CGAL/internal/Static_filters/Collinear_3.h +++ b/Filtered_kernel/include/CGAL/internal/Static_filters/Collinear_3.h @@ -76,33 +76,14 @@ public: else if (max1 > upper_bound_1) upper_bound_1 = max1; - int int_tmp_result; - if (lower_bound_1 < 5.00368081960964635413e-147) - return Base::operator()(p, q, r); - else - { - if (upper_bound_1 > 1.67597599124282407923e+153) - return Base::operator()(p, q, r); - + if ((lower_bound_1 >= 5.00368081960964635413e-147) && (upper_bound_1 <= 1.67597599124282407923e+153)) { double eps = (8.88720573725927976811e-16 * (max1 * max2)); - if (double_tmp_result > eps) - int_tmp_result = 1; - else - { - if (double_tmp_result < -eps) - int_tmp_result = -1; - else - return Base::operator()(p, q, r); - } + if (CGAL::abs(double_tmp_result) > eps ) + return false; } - - int sign_of_determinant_return_value = int_tmp_result; - if (sign_of_determinant_return_value != 0) - return false; - double dpz = (pz - rz); double dqz = (qz - rz); - int int_tmp_result_3SPBwDj; + double double_tmp_result_k3Lzf6g = ((dpx * dqz) - (dpz * dqx)); double max3 = CGAL::abs(dpz); @@ -117,28 +98,12 @@ public: else if (max3 > upper_bound_1) upper_bound_1 = max3; - if (lower_bound_1 < 5.00368081960964635413e-147) - return Base::operator()(p, q, r); - else - { - if (upper_bound_1 > 1.67597599124282407923e+153) - return Base::operator()(p, q, r); - + if ((lower_bound_1 >= 5.00368081960964635413e-147) && (upper_bound_1 <= 1.67597599124282407923e+153)) { double eps = (8.88720573725927976811e-16 * (max1 * max3)); - if (double_tmp_result_k3Lzf6g > eps) - int_tmp_result_3SPBwDj = 1; - else - { - if (double_tmp_result_k3Lzf6g < -eps) - int_tmp_result_3SPBwDj = -1; - else - return Base::operator()(p, q, r); - } + if (CGAL::abs(double_tmp_result_k3Lzf6g) > eps) + return false; } - int sign_of_determinant_return_value_FFWKCAA = int_tmp_result_3SPBwDj; - - int int_tmp_result_Gx4H; double double_tmp_result_AvrrXBP = ((dpy * dqz) - (dpz * dqy)); lower_bound_1 = max2; @@ -149,26 +114,11 @@ public: else if (max3 > upper_bound_1) upper_bound_1 = max3; - if (lower_bound_1 < 5.00368081960964635413e-147) - return Base::operator()(p, q, r); - else - { - if (upper_bound_1 > 1.67597599124282407923e+153) - return Base::operator()(p, q, r); - + if ((lower_bound_1 >= 5.00368081960964635413e-147) && (upper_bound_1 <= 1.67597599124282407923e+153)) { double eps = (8.88720573725927976811e-16 * (max2 * max3)); - if (double_tmp_result_AvrrXBP > eps) - int_tmp_result_Gx4H = 1; - else - { - if (double_tmp_result_AvrrXBP < -eps) - int_tmp_result_Gx4H = -1; - else - return Base::operator()(p, q, r); - } + if (CGAL::abs(double_tmp_result_AvrrXBP) > eps) + return false; } - int sign_of_determinant_return_value_k60Ocge = int_tmp_result_Gx4H; - return ((sign_of_determinant_return_value_FFWKCAA == 0) && (sign_of_determinant_return_value_k60Ocge == 0)); } return Base::operator()(p, q, r); } diff --git a/Filtered_kernel/include/CGAL/internal/Static_filters/Compare_distance_3.h b/Filtered_kernel/include/CGAL/internal/Static_filters/Compare_distance_3.h new file mode 100644 index 00000000000..11a95b86b76 --- /dev/null +++ b/Filtered_kernel/include/CGAL/internal/Static_filters/Compare_distance_3.h @@ -0,0 +1,146 @@ +// Copyright (c) 2011 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 + + +#ifndef CGAL_INTERNAL_STATIC_FILTERS_COMPARE_DISTANCE_3_H +#define CGAL_INTERNAL_STATIC_FILTERS_COMPARE_DISTANCE_3_H + +#include +#include +#include +#include + +namespace CGAL { + +namespace internal { + +namespace Static_filters_predicates { + + +template < typename K_base > +class Compare_distance_3 + : public K_base::Compare_distance_3 +{ + typedef typename K_base::Point_3 Point_3; + typedef typename K_base::Vector_3 Vector_3; + typedef typename K_base::Compare_distance_3 Base; + +public: + + typedef typename Base::result_type result_type; + + using Base::operator(); + + result_type operator()(const Point_3 &p, const Point_3& q, const Point_3& r) const + { + CGAL_BRANCH_PROFILER(std::string("semi-static attempts/calls to : ") + + std::string(CGAL_PRETTY_FUNCTION), tmp); + + Get_approx get_approx; // Identity functor for all points + // but lazy points + + if(q == r){ + return EQUAL; + } + double px, py, pz, qx, qy, qz, rx, ry, rz; + + if (fit_in_double(get_approx(p).x(), px) && fit_in_double(get_approx(p).y(), py) && + fit_in_double(get_approx(p).z(), pz) && + fit_in_double(get_approx(q).x(), qx) && fit_in_double(get_approx(q).y(), qy) && + fit_in_double(get_approx(q).z(), qz) && + fit_in_double(get_approx(r).x(), rx) && fit_in_double(get_approx(r).y(), ry) && + fit_in_double(get_approx(r).z(), rz)) + { + CGAL_BRANCH_PROFILER_BRANCH(tmp); + double qpx; + qpx = (qx - px); + double qpy; + qpy = (qy - py); + double qpz; + qpz = (qz - pz); + double qp2; + qp2 = ((square( qpx ) + square( qpy )) + square( qpz )); + double rpx; + rpx = (rx - px); + double rpy; + rpy = (ry - py); + double rpz; + rpz = (rz - pz); + double rp2; + rp2 = ((square( rpx ) + square( rpy )) + square( rpz )); + Sign int_tmp_result = EQUAL; + double double_tmp_result; + double eps; + double_tmp_result = (qp2 - rp2); + double max1 = CGAL::abs(qpx); + if( (max1 < CGAL::abs(qpy)) ) + { + max1 = CGAL::abs(qpy); + } + if( (max1 < CGAL::abs(qpz)) ) + { + max1 = CGAL::abs(qpz); + } + if( (max1 < CGAL::abs(rpx)) ) + { + max1 = CGAL::abs(rpx); + } + if( (max1 < CGAL::abs(rpy)) ) + { + max1 = CGAL::abs(rpy); + } + if( (max1 < CGAL::abs(rpz)) ) + { + max1 = CGAL::abs(rpz); + } + if( (max1 < 2.42701102401884262260e-147) ) + { + return Base::operator()(p, q, r); + } + else + { + if( (max1 > 8.37987995621411946582e+152) ) + { + return Base::operator()(p, q, r); + } + eps = (3.77746921267322435884e-15 * (max1 * max1)); + if( (double_tmp_result > eps) ) + { + int_tmp_result = LARGER; + } + else + { + if( (double_tmp_result < -eps) ) + { + int_tmp_result = SMALLER; + } + else + { + return Base::operator()(p, q, r); + } + } + } + return int_tmp_result; + } + return Base::operator()(p, q, r); + } + + +}; // end class Compare_distance_3 + +} // end namespace Static_filters_predicates + +} // end namespace internal + +} // end namespace CGAL + +#endif // CGAL_INTERNAL_STATIC_FILTERS_COMPARE_DISTANCE_3_H diff --git a/Filtered_kernel/include/CGAL/internal/Static_filters/Static_filters.h b/Filtered_kernel/include/CGAL/internal/Static_filters/Static_filters.h index 7d03fa1217c..1aa86abb78a 100644 --- a/Filtered_kernel/include/CGAL/internal/Static_filters/Static_filters.h +++ b/Filtered_kernel/include/CGAL/internal/Static_filters/Static_filters.h @@ -71,7 +71,7 @@ #include #include #include - +#include // #include // #include @@ -126,6 +126,8 @@ public: typedef Static_filters_predicates::Compare_weighted_squared_radius_3 Compare_weighted_squared_radius_3; typedef Static_filters_predicates::Power_side_of_oriented_power_sphere_3 Power_side_of_oriented_power_sphere_3; + typedef Static_filters_predicates::Compare_distance_3 Compare_distance_3; + Orientation_2 orientation_2_object() const { return Orientation_2(); } @@ -195,6 +197,9 @@ public: compare_weighted_squared_radius_3_object() const { return Compare_weighted_squared_radius_3(); } + Compare_distance_3 + compare_distance_3_object() const + { return Compare_distance_3();} enum { Has_static_filters = true }; diff --git a/Generator/examples/Generator/CMakeLists.txt b/Generator/examples/Generator/CMakeLists.txt index 72149414f76..28eb3bff5e9 100644 --- a/Generator/examples/Generator/CMakeLists.txt +++ b/Generator/examples/Generator/CMakeLists.txt @@ -8,7 +8,7 @@ find_package(CGAL REQUIRED) # Use Eigen find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) # create a target per cppfile file( @@ -18,11 +18,11 @@ file( foreach(cppfile ${cppfiles}) if(NOT (${cppfile} STREQUAL "random_points_in_tetrahedral_mesh_3.cpp") OR NOT (${cppfile} STREQUAL "random_points_on_tetrahedral_mesh_3.cpp") - OR TARGET CGAL::Eigen_support) + OR TARGET CGAL::Eigen3_support) create_single_source_cgal_program("${cppfile}") - if(TARGET CGAL::Eigen_support) + if(TARGET CGAL::Eigen3_support) get_filename_component(target ${cppfile} NAME_WE) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endif() endif() endforeach() diff --git a/Generator/include/CGAL/random_convex_set_2.h b/Generator/include/CGAL/random_convex_set_2.h index a118503b4c3..f8189fcea1c 100644 --- a/Generator/include/CGAL/random_convex_set_2.h +++ b/Generator/include/CGAL/random_convex_set_2.h @@ -23,7 +23,6 @@ #include #include #include -#include namespace CGAL { @@ -80,7 +79,7 @@ random_convex_set_2( std::size_t n, points.begin(), points.end(), points.begin(), - boost::bind2nd( Sum(), scale( centroid, FT( -1)))); + [¢roid, &sum, &scale](const Point_2& p) { return sum(p, scale(centroid, FT( -1))); }); // sort them according to their direction's angle // w.r.t. the positive x-axis: @@ -102,8 +101,9 @@ random_convex_set_2( std::size_t n, points.begin(), points.end(), points.begin(), - boost::bind2nd( Sum(), sum( centroid, - scale( new_centroid, FT( -1))))); + [¢roid, &new_centroid, &sum, &scale](const Point_2& p) + {return sum(p, sum( centroid, scale(new_centroid, FT( -1)))); } + ); // compute maximal coordinate: FT maxcoord( max_coordinate( @@ -118,7 +118,7 @@ random_convex_set_2( std::size_t n, points.begin(), points.end(), o, - boost::bind2nd( Scale(), FT( pg.range()) / maxcoord)); + [&pg, &maxcoord, &scale](const Point_2& p){ return scale(p, FT( pg.range()) / maxcoord); }); } // random_convex_set_2( n, o, pg, t) diff --git a/Generator/test/Generator/CMakeLists.txt b/Generator/test/Generator/CMakeLists.txt index ff0701e7ad7..2f81e017a5e 100644 --- a/Generator/test/Generator/CMakeLists.txt +++ b/Generator/test/Generator/CMakeLists.txt @@ -8,7 +8,7 @@ find_package(CGAL REQUIRED) # Use Eigen find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) # create a target per cppfile file( @@ -17,11 +17,11 @@ file( ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) foreach(cppfile ${cppfiles}) if(NOT (${cppfile} STREQUAL "generic_random_test.cpp") OR TARGET - CGAL::Eigen_support) + CGAL::Eigen3_support) create_single_source_cgal_program("${cppfile}") - if(TARGET CGAL::Eigen_support) + if(TARGET CGAL::Eigen3_support) get_filename_component(target ${cppfile} NAME_WE) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endif() endif() endforeach() diff --git a/Geomview/src/CGAL/Geomview_stream.cpp b/Geomview/src/CGAL/Geomview_stream.cpp deleted file mode 100644 index 8f316b4e6a5..00000000000 --- a/Geomview/src/CGAL/Geomview_stream.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 1999-2004 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Andreas Fabri, Herve Bronnimann, Sylvain Pion - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif diff --git a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt index d4cf857a00e..c1f805372c6 100644 --- a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt +++ b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt @@ -15,7 +15,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) include_directories(BEFORE ./include) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt index 908428488e8..9898f7c0a7a 100644 --- a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt @@ -15,7 +15,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) add_definitions(-DQT_NO_KEYWORDS) diff --git a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt index c0a12b255fc..af8b531f4b8 100644 --- a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt +++ b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt @@ -15,7 +15,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) include_directories(BEFORE ./include) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt index 99ddd23a398..279535431fa 100644 --- a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt +++ b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt @@ -15,7 +15,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) add_definitions(-DQT_NO_KEYWORDS) diff --git a/GraphicsView/demo/Generator/CMakeLists.txt b/GraphicsView/demo/Generator/CMakeLists.txt index e7e4e3afc16..8b1cce296ed 100644 --- a/GraphicsView/demo/Generator/CMakeLists.txt +++ b/GraphicsView/demo/Generator/CMakeLists.txt @@ -14,7 +14,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/GraphicsView/demo/GraphicsView/CMakeLists.txt b/GraphicsView/demo/GraphicsView/CMakeLists.txt index 6fec9bd067b..8b4f82c65df 100644 --- a/GraphicsView/demo/GraphicsView/CMakeLists.txt +++ b/GraphicsView/demo/GraphicsView/CMakeLists.txt @@ -14,7 +14,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt index dd3ecf5491a..4fc20a4c8da 100644 --- a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt +++ b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt @@ -15,7 +15,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) include_directories(BEFORE ./include) if(CGAL_Qt5_FOUND AND Qt5_FOUND) 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 91adae16d13..7b23ba84ef7 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 @@ -88,7 +88,7 @@ public: // Walk on the horizontal edge of the rectangle and then on the vertical. - // There is a chance that the width of the rectangle is smaller then the mid-dist. + // There is a chance that the width of the rectangle is smaller than the mid-dist. FT walk_x = (CGAL::min)(abs_x, dist); mid_x += sign_x * walk_x; dist -= walk_x; diff --git a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt index c7cda2cb1b6..cb8f1dea52c 100644 --- a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt +++ b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt @@ -15,7 +15,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt index 4d75fc2dcbc..d52af8a768d 100644 --- a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt +++ b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt @@ -12,7 +12,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) include_directories(BEFORE ./include) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/GraphicsView/demo/Polygon/CMakeLists.txt b/GraphicsView/demo/Polygon/CMakeLists.txt index 5d46ce8c130..67d2b2ed983 100644 --- a/GraphicsView/demo/Polygon/CMakeLists.txt +++ b/GraphicsView/demo/Polygon/CMakeLists.txt @@ -16,8 +16,8 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5 Core) find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "NOTICE: This project requires the Eigen library, and will not be compiled." @@ -25,7 +25,7 @@ if(NOT TARGET CGAL::Eigen_support) return() endif() -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) include(${CGAL_USE_FILE}) @@ -55,7 +55,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Polygon_2) target_link_libraries(Polygon_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - CGAL::Eigen_support Qt5::Gui) + CGAL::Eigen3_support Qt5::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Polygon_2) diff --git a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt index 5a22d88a978..033b647dc34 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt @@ -20,7 +20,7 @@ set(QT_USE_QTMAIN TRUE) set(QT_USE_QTSCRIPT TRUE) set(QT_USE_QTOPENGL TRUE) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) include_directories(BEFORE ./include) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/GraphicsView/demo/Segment_Delaunay_graph_2/include/CGAL/Constraints_loader.h b/GraphicsView/demo/Segment_Delaunay_graph_2/include/CGAL/Constraints_loader.h index 1a3a2f3621f..66899ca4237 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_2/include/CGAL/Constraints_loader.h +++ b/GraphicsView/demo/Segment_Delaunay_graph_2/include/CGAL/Constraints_loader.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -96,7 +97,7 @@ class Constraints_loader { for(Points_iterator it = points.begin(); it != points.end(); ++it) { indices.push_back(it); } - std::random_shuffle(indices.begin(), indices.end()); + CGAL::cpp98::random_shuffle(indices.begin(), indices.end()); CGAL::spatial_sort(indices.begin(), indices.end(), sort_traits); diff --git a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt index 46723a27011..45bedf14c38 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt @@ -20,7 +20,7 @@ set(QT_USE_QTMAIN TRUE) set(QT_USE_QTSCRIPT TRUE) set(QT_USE_QTOPENGL TRUE) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) include_directories(BEFORE ./include) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/include/CGAL/Constraints_loader.h b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/include/CGAL/Constraints_loader.h index 1a3a2f3621f..66899ca4237 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/include/CGAL/Constraints_loader.h +++ b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/include/CGAL/Constraints_loader.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -96,7 +97,7 @@ class Constraints_loader { for(Points_iterator it = points.begin(); it != points.end(); ++it) { indices.push_back(it); } - std::random_shuffle(indices.begin(), indices.end()); + CGAL::cpp98::random_shuffle(indices.begin(), indices.end()); CGAL::spatial_sort(indices.begin(), indices.end(), sort_traits); diff --git a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt index c4092df8007..34069835976 100644 --- a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt +++ b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt @@ -15,7 +15,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) set(CMAKE_AUTOMOC ON) diff --git a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt index 6ff2a9bacae..dd4ac996e12 100644 --- a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt +++ b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt @@ -15,7 +15,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt index 2c5c3c33005..5ae748db9d1 100644 --- a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt +++ b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt @@ -15,7 +15,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/GraphicsView/doc/GraphicsView/PackageDescription.txt b/GraphicsView/doc/GraphicsView/PackageDescription.txt index a6597c649e5..3c32ad7863c 100644 --- a/GraphicsView/doc/GraphicsView/PackageDescription.txt +++ b/GraphicsView/doc/GraphicsView/PackageDescription.txt @@ -18,7 +18,7 @@ \cgalPkgSummaryEnd \cgalPkgShortInfoBegin \cgalPkgSince{3.4} -\cgalPkgDependsOn{\sc{Qt} 5} +\cgalPkgDependsOn{\qt 5} \cgalPkgBib{cgal:fr-cqgvf} \cgalPkgLicense{\ref licensesGPL "GPL"} \cgalPkgShortInfoEnd diff --git a/GraphicsView/include/CGAL/Basic_shaders.h b/GraphicsView/include/CGAL/Basic_shaders.h new file mode 100644 index 00000000000..1e9f7697c0a --- /dev/null +++ b/GraphicsView/include/CGAL/Basic_shaders.h @@ -0,0 +1,285 @@ +// Copyright (c) 2018 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) : Guillaume Damiand + +#ifndef CGAL_BASIC_SHADERS_H +#define CGAL_BASIC_SHADERS_H + +#include + +namespace CGAL +{ + +//------------------------------------------------------------------------------ +const char vertex_source_color[]=R"DELIM( +#version 150 +in highp vec4 vertex; +in highp vec3 normal; +in highp vec3 color; + +uniform highp mat4 mvp_matrix; +uniform highp mat4 mv_matrix; +uniform highp float point_size; + +out highp vec4 fP; +out highp vec3 fN; +out highp vec4 fColor; +out highp vec4 m_vertex; + +void main(void) +{ + fP = mv_matrix * vertex; + fN = mat3(mv_matrix)* normal; + fColor = vec4(color, 1.0); + gl_PointSize = point_size; + + m_vertex = vertex; + + gl_Position = mvp_matrix * vertex; +} +)DELIM"; + +const char fragment_source_color[]=R"DELIM( +#version 150 +in highp vec4 fP; +in highp vec3 fN; +in highp vec4 fColor; +in highp vec4 m_vertex; + +uniform highp vec4 light_pos; +uniform highp vec4 light_diff; +uniform highp vec4 light_spec; +uniform highp vec4 light_amb; +uniform highp float spec_power; + +uniform highp vec4 clipPlane; +uniform highp vec4 pointPlane; +uniform highp float rendering_mode; +uniform highp float rendering_transparency; + +out highp vec4 out_color; + +void main(void) +{ + highp vec3 L = light_pos.xyz - fP.xyz; + highp vec3 V = -fP.xyz; + + highp vec3 N = normalize(fN); + L = normalize(L); + V = normalize(V); + + highp vec3 R = reflect(-L, N); + highp vec4 diffuse = vec4(max(dot(N,L), 0.0) * light_diff.rgb * fColor.rgb, 1.0); + highp vec4 ambient = vec4(light_amb.rgb * fColor.rgb, 1.0); + highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; + + // onPlane == 1: inside clipping plane, should be solid; + // onPlane == -1: outside clipping plane, should be transparent; + // onPlane == 0: on clipping plane, whatever; + float onPlane = sign(dot((m_vertex.xyz-pointPlane.xyz), clipPlane.xyz)); + + // rendering_mode == -1: draw all solid; + // rendering_mode == 0: draw solid only; + // rendering_mode == 1: draw transparent only; + if (rendering_mode == (onPlane+1)/2) { + // discard other than the corresponding half when rendering + discard; + } + + // draw corresponding part + out_color = rendering_mode < 1 ? (diffuse + ambient) : + vec4(diffuse.rgb + ambient.rgb, rendering_transparency); +} +)DELIM"; + +const char vertex_source_p_l[]=R"DELIM( +#version 150 +in highp vec4 vertex; +in highp vec3 color; + +uniform highp mat4 mvp_matrix; +uniform highp float point_size; + +out highp vec4 fColor; +out highp vec4 m_vertex; + +void main(void) +{ + gl_PointSize = point_size; + fColor = vec4(color, 1.0); + m_vertex = vertex; + gl_Position = mvp_matrix * vertex; +} +)DELIM"; + +const char fragment_source_p_l[]=R"DELIM( +#version 150 +in highp vec4 fColor; +in highp vec4 m_vertex; + +uniform highp vec4 clipPlane; +uniform highp vec4 pointPlane; +uniform highp float rendering_mode; + +out highp vec4 out_color; + +void main(void) +{ + // onPlane == 1: inside clipping plane, should be solid; + // onPlane == -1: outside clipping plane, should be transparent; + // onPlane == 0: on clipping plane, whatever; + float onPlane = sign(dot((m_vertex.xyz-pointPlane.xyz), clipPlane.xyz)); + + // rendering_mode == -1: draw both inside and outside; + // rendering_mode == 0: draw inside only; + // rendering_mode == 1: draw outside only; + if (rendering_mode == (onPlane+1)/2) { + // discard other than the corresponding half when rendering + discard; + } + + out_color = fColor; +} +)DELIM"; + +const char vertex_source_clipping_plane[]=R"DELIM( +#version 150 +in highp vec4 vertex; + +uniform highp mat4 vp_matrix; +uniform highp mat4 m_matrix; + +void main(void) +{ + gl_Position = vp_matrix * m_matrix * vertex; +} +)DELIM"; + +const char fragment_source_clipping_plane[]=R"DELIM( +#version 150 +out highp vec4 out_color; +void main(void) +{ + out_color = vec4(0.0, 0.0, 0.0, 1.0); +} +)DELIM"; + +//------------------------------------------------------------------------------ +// compatibility shaders + +const char vertex_source_color_comp[]=R"DELIM( +in highp vec4 vertex; +in highp vec3 normal; +in highp vec3 color; + +uniform highp mat4 mvp_matrix; +uniform highp mat4 mv_matrix; +uniform highp float point_size; + +out highp vec4 fP; +out highp vec3 fN; +out highp vec4 fColor; + +void main(void) +{ + fP = mv_matrix * vertex; + highp mat3 mv_matrix_3; + mv_matrix_3[0] = mv_matrix[0].xyz; + mv_matrix_3[1] = mv_matrix[1].xyz; + mv_matrix_3[2] = mv_matrix[2].xyz; + fN = mv_matrix_3* normal; + fColor = vec4(color, 1.0); + gl_PointSize = point_size; + + gl_Position = mvp_matrix * vertex; +} +)DELIM"; + +const char fragment_source_color_comp[]=R"DELIM( +in highp vec4 fP; +in highp vec3 fN; +in highp vec4 fColor; + +uniform highp vec4 light_pos; +uniform highp vec4 light_diff; +uniform highp vec4 light_spec; +uniform highp vec4 light_amb; +uniform highp float spec_power ; + +out highp vec4 out_color; + +void main(void) +{ + highp vec3 L = light_pos.xyz - fP.xyz; + highp vec3 V = -fP.xyz; + + highp vec3 N = normalize(fN); + L = normalize(L); + V = normalize(V); + + highp vec3 R = reflect(-L, N); + highp vec4 diffuse = max(dot(N,L), 0.0) * light_diff * fColor; + highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; + + out_color = light_amb*fColor + diffuse; +} +)DELIM"; + +const char vertex_source_p_l_comp[]=R"DELIM( +in highp vec4 vertex; +in highp vec3 color; + +uniform highp mat4 mvp_matrix; +uniform highp float point_size; + +out highp vec4 fColor; + +void main(void) +{ + gl_PointSize = point_size; + fColor = vec4(color, 1.0); + gl_Position = mvp_matrix * vertex; +} +)DELIM"; + +const char fragment_source_p_l_comp[]=R"DELIM( +in highp vec4 fColor; +out highp vec4 out_color; +void main(void) +{ + out_color = fColor; +} +)DELIM"; + +/* const char vertex_source_clipping_plane_comp[]=R"DELIM( +attribute highp vec4 vertex; + +uniform highp mat4 vp_matrix; +uniform highp mat4 m_matrix; + +void main(void) +{ + gl_Position = vp_matrix * m_matrix * vertex; +} +)DELIM"; + +const char fragment_source_clipping_plane_comp[]=R"DELIM( +out highp vec4 out_color; +void main(void) +{ + out_color = vec4(0.0, 0.0, 0.0, 1.0); +} +)DELIM"; +*/ + +} + +#endif // CGAL_BASIC_SHADERS_H diff --git a/GraphicsView/include/CGAL/Buffer_for_vao.h b/GraphicsView/include/CGAL/Buffer_for_vao.h index c27e24e50c9..2be331a35f5 100644 --- a/GraphicsView/include/CGAL/Buffer_for_vao.h +++ b/GraphicsView/include/CGAL/Buffer_for_vao.h @@ -908,7 +908,7 @@ protected: bool m_zero_y; /// True iff all points have y==0 bool m_zero_z; /// True iff all points have z==0 - bool m_inverse_normal;; + bool m_inverse_normal; // Local variables, used when we started a new face.g bool m_face_started; diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 11058fe04e6..f306e419ce7 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -31,8 +31,8 @@ #include #include +#include #include -#include #include #include #include @@ -48,179 +48,13 @@ #include #include +#include #include #include #include namespace CGAL { - -//------------------------------------------------------------------------------ -const char vertex_source_color[] = - { - "#version 120 \n" - "attribute highp vec4 vertex;\n" - "attribute highp vec3 normal;\n" - "attribute highp vec3 color;\n" - - "uniform highp mat4 mvp_matrix;\n" - "uniform highp mat4 mv_matrix; \n" - - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" - "varying highp vec4 fColor; \n" - - "uniform highp float point_size; \n" - "void main(void)\n" - "{\n" - " fP = mv_matrix * vertex; \n" - " fN = mat3(mv_matrix)* normal; \n" - " fColor = vec4(color, 1.0); \n" - " gl_PointSize = point_size;\n" - " gl_Position = mvp_matrix * vertex;\n" - "}" - }; - -const char fragment_source_color[] = - { - "#version 120 \n" - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" - "varying highp vec4 fColor; \n" - "uniform highp vec4 light_pos; \n" - "uniform highp vec4 light_diff; \n" - "uniform highp vec4 light_spec; \n" - "uniform highp vec4 light_amb; \n" - "uniform float spec_power ; \n" - - "void main(void) { \n" - " highp vec3 L = light_pos.xyz - fP.xyz; \n" - " highp vec3 V = -fP.xyz; \n" - - " highp vec3 N = normalize(fN); \n" - " L = normalize(L); \n" - " V = normalize(V); \n" - - " highp vec3 R = reflect(-L, N); \n" - " highp vec4 diffuse = max(dot(N,L), 0.0) * light_diff * fColor; \n" - " highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n" - " gl_FragColor = light_amb*fColor + diffuse ; \n" - "} \n" - "\n" - }; - -const char vertex_source_p_l[] = - { - "#version 120 \n" - "attribute highp vec4 vertex;\n" - "attribute highp vec3 color;\n" - "uniform highp mat4 mvp_matrix;\n" - "varying highp vec4 fColor; \n" - "uniform highp float point_size; \n" - "void main(void)\n" - "{\n" - " gl_PointSize = point_size;\n" - " fColor = vec4(color, 1.0); \n" - " gl_Position = mvp_matrix * vertex;\n" - "}" - }; - -const char fragment_source_p_l[] = - { - "#version 120 \n" - "varying highp vec4 fColor; \n" - "void main(void) { \n" - "gl_FragColor = fColor; \n" - "} \n" - "\n" - }; - -//------------------------------------------------------------------------------ -// compatibility shaders - -const char vertex_source_color_comp[] = - { - "attribute highp vec4 vertex;\n" - "attribute highp vec3 normal;\n" - "attribute highp vec3 color;\n" - - "uniform highp mat4 mvp_matrix;\n" - "uniform highp mat4 mv_matrix; \n" - - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" - "varying highp vec4 fColor; \n" - - "uniform highp float point_size; \n" - "void main(void)\n" - "{\n" - " fP = mv_matrix * vertex; \n" - " highp mat3 mv_matrix_3; \n" - " mv_matrix_3[0] = mv_matrix[0].xyz; \n" - " mv_matrix_3[1] = mv_matrix[1].xyz; \n" - " mv_matrix_3[2] = mv_matrix[2].xyz; \n" - " fN = mv_matrix_3* normal; \n" - " fColor = vec4(color, 1.0); \n" - " gl_PointSize = point_size;\n" - " gl_Position = mvp_matrix * vertex;\n" - "}" - }; - -const char fragment_source_color_comp[] = - { - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" - "varying highp vec4 fColor; \n" - "uniform highp vec4 light_pos; \n" - "uniform highp vec4 light_diff; \n" - "uniform highp vec4 light_spec; \n" - "uniform highp vec4 light_amb; \n" - "uniform highp float spec_power ; \n" - - "void main(void) { \n" - - " highp vec3 L = light_pos.xyz - fP.xyz; \n" - " highp vec3 V = -fP.xyz; \n" - - " highp vec3 N = normalize(fN); \n" - " L = normalize(L); \n" - " V = normalize(V); \n" - - " highp vec3 R = reflect(-L, N); \n" - " highp vec4 diffuse = max(dot(N,L), 0.0) * light_diff * fColor; \n" - " highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n" - - "gl_FragColor = light_amb*fColor + diffuse ; \n" - "} \n" - "\n" - }; - -const char vertex_source_p_l_comp[] = - { - "attribute highp vec4 vertex;\n" - "attribute highp vec3 color;\n" - "uniform highp mat4 mvp_matrix;\n" - "varying highp vec4 fColor; \n" - "uniform highp float point_size; \n" - "void main(void)\n" - "{\n" - " gl_PointSize = point_size;\n" - " fColor = vec4(color, 1.0); \n" - " gl_Position = mvp_matrix * vertex;\n" - "}" - }; - -const char fragment_source_p_l_comp[] = - { - "varying highp vec4 fColor; \n" - "void main(void) { \n" - "gl_FragColor = fColor; \n" - "} \n" - "\n" - }; - - - //------------------------------------------------------------------------------ inline CGAL::Color get_random_color(CGAL::Random& random) { @@ -329,6 +163,8 @@ public: setShortcut(qglviewer::EXIT_VIEWER, ::Qt::CTRL+::Qt::Key_Q); // Add custom key description (see keyPressEvent). + setKeyDescription(::Qt::Key_C, "Switch clipping plane display mode"); + setKeyDescription(::Qt::Key_C+::Qt::AltModifier, "Toggle clipping plane rendering on/off"); setKeyDescription(::Qt::Key_E, "Toggles edges display"); setKeyDescription(::Qt::Key_M, "Toggles mono color"); setKeyDescription(::Qt::Key_N, "Inverse direction of normals"); @@ -345,6 +181,21 @@ public: setKeyDescription(::Qt::Key_PageUp, "Decrease light (all colors, use shift/alt/ctrl for one rgb component)"); setKeyDescription(::Qt::Key_O, "Toggles 2D mode only"); + // Add custom mouse description + setMouseBindingDescription(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::LeftButton, "Rotate the clipping plane when enabled"); + setMouseBindingDescription(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::RightButton, "Translate the clipping plane when enabled"); + setMouseBindingDescription(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::MidButton, "Control the clipping plane transparency when enabled"); + + setMouseBinding(::Qt::ControlModifier, ::Qt::LeftButton, qglviewer::FRAME, qglviewer::NO_MOUSE_ACTION); + setMouseBinding(::Qt::ControlModifier, ::Qt::RightButton, qglviewer::FRAME, qglviewer::NO_MOUSE_ACTION); + setMouseBinding(::Qt::ControlModifier, ::Qt::MidButton, qglviewer::FRAME, qglviewer::NO_MOUSE_ACTION); + setWheelBinding(::Qt::ControlModifier, qglviewer::FRAME, qglviewer::NO_MOUSE_ACTION); + + setMouseBinding(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::LeftButton, qglviewer::FRAME, qglviewer::ROTATE); + setMouseBinding(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::RightButton, qglviewer::FRAME, qglviewer::TRANSLATE); + setMouseBinding(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::MidButton, qglviewer::FRAME, qglviewer::ZOOM); + setWheelBinding(::Qt::Key_C, ::Qt::ControlModifier, qglviewer::FRAME, qglviewer::ZOOM); + if (title[0]==0) setWindowTitle("CGAL Basic Viewer"); else @@ -358,6 +209,7 @@ public: ~Basic_viewer_qt() { + makeCurrent(); for (unsigned int i=0; icompileSourceCode(source_)) - { std::cerr<<"Compiling fragmentsource FAILED"<compileSourceCode(source_)) + { std::cerr << "Compiling vertex source for clipping plane FAILED" << std::endl; } + + source_ = fragment_source_clipping_plane; + + QOpenGLShader *fragment_shader_clipping_plane = new QOpenGLShader(QOpenGLShader::Fragment); + if (!fragment_shader_clipping_plane->compileSourceCode(source_)) + { std::cerr << "Compiling fragment source for clipping plane FAILED" << std::endl; } + + if (!rendering_program_clipping_plane.addShader(vertex_shader_clipping_plane)) + { std::cerr << "Adding vertex shader for clipping plane FAILED" << std::endl;} + if (!rendering_program_clipping_plane.addShader(fragment_shader_clipping_plane)) + { std::cerr << "Adding fragment shader for clipping plane FAILED" << std::endl; } + if (!rendering_program_clipping_plane.link()) + { std::cerr << "Linking Program for clipping plane FAILED" << std::endl; } + + } + + // source_ = isOpenGL_4_3() + // ? vertex_source_clipping_plane + // : vertex_source_clipping_plane_comp; + + // QOpenGLShader *vertex_shader_clipping_plane = new QOpenGLShader(QOpenGLShader::Vertex); + // if (!vertex_shader_clipping_plane->compileSourceCode(source_)) + // { std::cerr << "Compiling vertex source for clipping plane FAILED" << std::endl; } + + // source_ = isOpenGL_4_3() + // ? fragment_source_clipping_plane + // : fragment_source_clipping_plane_comp; + + // QOpenGLShader *fragment_shader_clipping_plane = new QOpenGLShader(QOpenGLShader::Fragment); + // if (!fragment_shader_clipping_plane->compileSourceCode(source_)) + // { std::cerr << "Compiling fragment source for clipping plane FAILED" << std::endl; } + + // if (!rendering_program_clipping_plane.addShader(vertex_shader_clipping_plane)) + // { std::cerr << "Adding vertex shader for clipping plane FAILED" << std::endl;} + // if (!rendering_program_clipping_plane.addShader(fragment_shader_clipping_plane)) + // { std::cerr << "Adding fragment shader for clipping plane FAILED" << std::endl; } + // if (!rendering_program_clipping_plane.link()) + // { std::cerr << "Linking Program for clipping plane FAILED" << std::endl; } } void initialize_buffers() @@ -962,6 +864,26 @@ protected: rendering_program_face.release(); + + // 6) clipping plane shader + if (isOpenGL_4_3()) + { + rendering_program_clipping_plane.bind(); + + vao[VAO_CLIPPING_PLANE].bind(); + ++bufn; + assert(bufn < NB_VBO_BUFFERS); + buffers[bufn].bind(); + buffers[bufn].allocate(arrays[POS_CLIPPING_PLANE].data(), + static_cast(arrays[POS_CLIPPING_PLANE].size() * sizeof(float))); + rendering_program_clipping_plane.enableAttributeArray("vertex"); + rendering_program_clipping_plane.setAttributeBuffer("vertex", GL_FLOAT, 0, 3); + + buffers[bufn].release(); + + rendering_program_clipping_plane.release(); + } + m_are_buffers_initialized = true; } @@ -1028,6 +950,25 @@ protected: int mvpLocation2 = rendering_program_p_l.uniformLocation("mvp_matrix"); rendering_program_p_l.setUniformValue(mvpLocation2, mvpMatrix); rendering_program_p_l.release(); + + + if (isOpenGL_4_3()) + { + QMatrix4x4 clipping_mMatrix; + clipping_mMatrix.setToIdentity(); + if(m_frame_plane) + { + for(int i=0; i< 16 ; i++) + clipping_mMatrix.data()[i] = m_frame_plane->matrix()[i]; + } + + rendering_program_clipping_plane.bind(); + int vpLocation = rendering_program_clipping_plane.uniformLocation("vp_matrix"); + int mLocation = rendering_program_clipping_plane.uniformLocation("m_matrix"); + rendering_program_clipping_plane.setUniformValue(vpLocation, mvpMatrix); + rendering_program_clipping_plane.setUniformValue(mLocation, clipping_mMatrix); + rendering_program_clipping_plane.release(); + } } // Returns true if the data structure lies on a plane @@ -1039,6 +980,16 @@ protected: virtual void draw() { glEnable(GL_DEPTH_TEST); + + QMatrix4x4 clipping_mMatrix; + clipping_mMatrix.setToIdentity(); + if(m_frame_plane) + { + for(int i=0; i< 16 ; i++) + clipping_mMatrix.data()[i] = m_frame_plane->matrix()[i]; + } + QVector4D clipPlane = clipping_mMatrix * QVector4D(0.0, 0.0, 1.0, 0.0); + QVector4D plane_point = clipping_mMatrix * QVector4D(0,0,0,1); if(!m_are_buffers_initialized) { initialize_buffers(); } @@ -1071,31 +1022,57 @@ protected: { rendering_program_p_l.bind(); - vao[VAO_MONO_POINTS].bind(); - color.setRgbF((double)m_vertices_mono_color.red()/(double)255, - (double)m_vertices_mono_color.green()/(double)255, - (double)m_vertices_mono_color.blue()/(double)255); - rendering_program_p_l.setAttributeValue("color",color); - rendering_program_p_l.setUniformValue("point_size", GLfloat(m_size_points)); - glDrawArrays(GL_POINTS, 0, static_cast(arrays[POS_MONO_POINTS].size()/3)); - vao[VAO_MONO_POINTS].release(); - - vao[VAO_COLORED_POINTS].bind(); - if (m_use_mono_color) - { + // rendering_mode == -1: draw all + // rendering_mode == 0: draw inside clipping plane + // rendering_mode == 1: draw outside clipping plane + auto renderer = [this, &color, &clipPlane, &plane_point](float rendering_mode) { + vao[VAO_MONO_POINTS].bind(); color.setRgbF((double)m_vertices_mono_color.red()/(double)255, (double)m_vertices_mono_color.green()/(double)255, - (double)m_vertices_mono_color.blue()/(double)255); - rendering_program_p_l.disableAttributeArray("color"); + (double)m_vertices_mono_color.blue()/(double)255); rendering_program_p_l.setAttributeValue("color",color); + rendering_program_p_l.setUniformValue("point_size", GLfloat(m_size_points)); + rendering_program_p_l.setUniformValue("clipPlane", clipPlane); + rendering_program_p_l.setUniformValue("pointPlane", plane_point); + rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); + glDrawArrays(GL_POINTS, 0, static_cast(arrays[POS_MONO_POINTS].size()/3)); + vao[VAO_MONO_POINTS].release(); + + vao[VAO_COLORED_POINTS].bind(); + if (m_use_mono_color) + { + color.setRgbF((double)m_vertices_mono_color.red()/(double)255, + (double)m_vertices_mono_color.green()/(double)255, + (double)m_vertices_mono_color.blue()/(double)255); + rendering_program_p_l.disableAttributeArray("color"); + rendering_program_p_l.setAttributeValue("color",color); + } + else + { + rendering_program_p_l.enableAttributeArray("color"); + } + rendering_program_p_l.setUniformValue("point_size", GLfloat(m_size_points)); + rendering_program_p_l.setUniformValue("clipPlane", clipPlane); + rendering_program_p_l.setUniformValue("pointPlane", plane_point); + rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); + glDrawArrays(GL_POINTS, 0, static_cast(arrays[POS_COLORED_POINTS].size()/3)); + vao[VAO_COLORED_POINTS].release(); + }; + + enum { + DRAW_ALL = -1, // draw all + DRAW_INSIDE_ONLY, // draw only the part inside the clipping plane + DRAW_OUTSIDE_ONLY // draw only the part outside the clipping plane + }; + + if (m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_ONLY) + { + renderer(DRAW_INSIDE_ONLY); } else { - rendering_program_p_l.enableAttributeArray("color"); + renderer(DRAW_ALL); } - rendering_program_p_l.setUniformValue("point_size", GLfloat(m_size_points)); - glDrawArrays(GL_POINTS, 0, static_cast(arrays[POS_COLORED_POINTS].size()/3)); - vao[VAO_COLORED_POINTS].release(); rendering_program_p_l.release(); } @@ -1104,31 +1081,57 @@ protected: { rendering_program_p_l.bind(); - vao[VAO_MONO_SEGMENTS].bind(); - color.setRgbF((double)m_edges_mono_color.red()/(double)255, - (double)m_edges_mono_color.green()/(double)255, - (double)m_edges_mono_color.blue()/(double)255); - rendering_program_p_l.setAttributeValue("color",color); - glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_MONO_SEGMENTS].size()/3)); - vao[VAO_MONO_SEGMENTS].release(); - - vao[VAO_COLORED_SEGMENTS].bind(); - if (m_use_mono_color) - { + // rendering_mode == -1: draw all + // rendering_mode == 0: draw inside clipping plane + // rendering_mode == 1: draw outside clipping plane + auto renderer = [this, &color, &clipPlane, &plane_point](float rendering_mode) { + vao[VAO_MONO_SEGMENTS].bind(); color.setRgbF((double)m_edges_mono_color.red()/(double)255, (double)m_edges_mono_color.green()/(double)255, (double)m_edges_mono_color.blue()/(double)255); - rendering_program_p_l.disableAttributeArray("color"); rendering_program_p_l.setAttributeValue("color",color); + rendering_program_p_l.setUniformValue("clipPlane", clipPlane); + rendering_program_p_l.setUniformValue("pointPlane", plane_point); + rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); + glLineWidth(m_size_edges); + glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_MONO_SEGMENTS].size()/3)); + vao[VAO_MONO_SEGMENTS].release(); + + vao[VAO_COLORED_SEGMENTS].bind(); + if (m_use_mono_color) + { + color.setRgbF((double)m_edges_mono_color.red()/(double)255, + (double)m_edges_mono_color.green()/(double)255, + (double)m_edges_mono_color.blue()/(double)255); + rendering_program_p_l.disableAttributeArray("color"); + rendering_program_p_l.setAttributeValue("color",color); + } + else + { + rendering_program_p_l.enableAttributeArray("color"); + } + rendering_program_p_l.setUniformValue("clipPlane", clipPlane); + rendering_program_p_l.setUniformValue("pointPlane", plane_point); + rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); + glLineWidth(m_size_edges); + glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_COLORED_SEGMENTS].size()/3)); + vao[VAO_COLORED_SEGMENTS].release(); + }; + + enum { + DRAW_ALL = -1, // draw all + DRAW_INSIDE_ONLY, // draw only the part inside the clipping plane + DRAW_OUTSIDE_ONLY // draw only the part outside the clipping plane + }; + + if (m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_ONLY) + { + renderer(DRAW_INSIDE_ONLY); } else { - rendering_program_p_l.enableAttributeArray("color"); + renderer(DRAW_ALL); } - glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_COLORED_SEGMENTS].size()/3)); - vao[VAO_COLORED_SEGMENTS].release(); rendering_program_p_l.release(); } @@ -1214,29 +1217,104 @@ protected: { rendering_program_face.bind(); + // reference: https://stackoverflow.com/questions/37780345/opengl-how-to-create-order-independent-transparency + // rendering_mode == -1: draw all as solid; + // rendering_mode == 0: draw solid only; + // rendering_mode == 1: draw transparent only; + auto renderer = [this, &color, &clipPlane, &plane_point](float rendering_mode) { + vao[VAO_MONO_FACES].bind(); color.setRgbF((double)m_faces_mono_color.red()/(double)255, (double)m_faces_mono_color.green()/(double)255, (double)m_faces_mono_color.blue()/(double)255); rendering_program_face.setAttributeValue("color",color); + rendering_program_face.setUniformValue("rendering_mode", rendering_mode); + rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); + rendering_program_face.setUniformValue("clipPlane", clipPlane); + rendering_program_face.setUniformValue("pointPlane", plane_point); glDrawArrays(GL_TRIANGLES, 0, static_cast(arrays[POS_MONO_FACES].size()/3)); vao[VAO_MONO_FACES].release(); - vao[VAO_COLORED_FACES].bind(); - if (m_use_mono_color) + vao[VAO_COLORED_FACES].bind(); + if (m_use_mono_color) + { + color.setRgbF((double)m_faces_mono_color.red()/(double)255, + (double)m_faces_mono_color.green()/(double)255, + (double)m_faces_mono_color.blue()/(double)255); + rendering_program_face.disableAttributeArray("color"); + rendering_program_face.setAttributeValue("color",color); + } + else + { + rendering_program_face.enableAttributeArray("color"); + } + rendering_program_face.setUniformValue("rendering_mode", rendering_mode); + rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); + rendering_program_face.setUniformValue("clipPlane", clipPlane); + rendering_program_face.setUniformValue("pointPlane", plane_point); + glDrawArrays(GL_TRIANGLES, 0, static_cast(arrays[POS_COLORED_FACES].size()/3)); + vao[VAO_COLORED_FACES].release(); + }; + + auto renderer_clipping_plane = [this](bool clipping_plane_rendering) { + if (!isOpenGL_4_3()) return; + if (!clipping_plane_rendering) return; + // render clipping plane here + rendering_program_clipping_plane.bind(); + vao[VAO_CLIPPING_PLANE].bind(); + glLineWidth(0.1f); + glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_CLIPPING_PLANE].size() / 3)); + glLineWidth(1.0f); + vao[VAO_CLIPPING_PLANE].release(); + rendering_program_clipping_plane.release(); + }; + + enum { + DRAW_SOLID_ALL = -1, // draw all mesh in solid mode + DRAW_SOLID_HALF, // draw only the mesh inside the clipping plane as solid + DRAW_TRANSPARENT_HALF // draw only the mesh outside the clipping plane as transparent + }; + + if (m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_TRANSPARENT_HALF) { - color.setRgbF((double)m_faces_mono_color.red()/(double)255, - (double)m_faces_mono_color.green()/(double)255, - (double)m_faces_mono_color.blue()/(double)255); - rendering_program_face.disableAttributeArray("color"); - rendering_program_face.setAttributeValue("color",color); + // The z-buffer will prevent transparent objects from being displayed behind other transparent objects. + // Before rendering all transparent objects, disable z-testing first. + + // 1. draw solid first + renderer(DRAW_SOLID_HALF); + + // 2. draw transparent layer second with back face culling to avoid messy triangles + glDepthMask(false); //disable z-testing + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glFrontFace(GL_CW); + renderer(DRAW_TRANSPARENT_HALF); + + // 3. draw solid again without culling and blend to make sure the solid mesh is visible + glDepthMask(true); //enable z-testing + glDisable(GL_CULL_FACE); + glDisable(GL_BLEND); + renderer(DRAW_SOLID_HALF); + + // 4. render clipping plane here + renderer_clipping_plane(clipping_plane_rendering); + } + else if (m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_WIRE_HALF || + m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_ONLY) + { + // 1. draw solid HALF + renderer(DRAW_SOLID_HALF); + + // 2. render clipping plane here + renderer_clipping_plane(clipping_plane_rendering); } else { - rendering_program_face.enableAttributeArray("color"); + // 1. draw solid FOR ALL + renderer(DRAW_SOLID_ALL); } - glDrawArrays(GL_TRIANGLES, 0, static_cast(arrays[POS_COLORED_FACES].size()/3)); - vao[VAO_COLORED_FACES].release(); if (is_two_dimensional()) glPolygonOffset(offset_factor, offset_units); @@ -1258,12 +1336,17 @@ protected: } glEnable(GL_LIGHTING); } + + // Multiply matrix to get in the frame coordinate system. + // glMultMatrixd(manipulatedFrame()->matrix()); // Linker error + // Scale down the drawings + // glScalef(0.3f, 0.3f, 0.3f); // Linker error + // Draw an axis using the QGLViewer static function + // drawAxis(); } virtual void init() { - // Restore previous viewer state. - restoreStateFromFile(); initializeOpenGLFunctions(); // Light default parameters @@ -1294,6 +1377,32 @@ protected: bb.ymax(), bb.zmax())); + // init clipping plane array + auto generate_clipping_plane = [this](qreal size, int nbSubdivisions) + { + for (int i = 0; i <= nbSubdivisions; i++) + { + const float pos = float(size*(2.0*i/nbSubdivisions-1.0)); + arrays[POS_CLIPPING_PLANE].push_back(pos); + arrays[POS_CLIPPING_PLANE].push_back(float(-size)); + arrays[POS_CLIPPING_PLANE].push_back(0.f); + + arrays[POS_CLIPPING_PLANE].push_back(pos); + arrays[POS_CLIPPING_PLANE].push_back(float(+size)); + arrays[POS_CLIPPING_PLANE].push_back(0.f); + + arrays[POS_CLIPPING_PLANE].push_back(float(-size)); + arrays[POS_CLIPPING_PLANE].push_back(pos); + arrays[POS_CLIPPING_PLANE].push_back(0.f); + + arrays[POS_CLIPPING_PLANE].push_back(float(size)); + arrays[POS_CLIPPING_PLANE].push_back(pos); + arrays[POS_CLIPPING_PLANE].push_back(0.f); + } + }; + clipping_plane_rendering_size = ((bb.xmax() - bb.xmin()) + (bb.ymax() - bb.ymin()) + (bb.zmax() - bb.zmin())) / 3; + generate_clipping_plane(3.0 * clipping_plane_rendering_size, 30); + this->showEntireScene(); } @@ -1307,7 +1416,48 @@ protected: { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - if ((e->key()==::Qt::Key_E) && (modifiers==::Qt::NoButton)) + if ((e->key()==::Qt::Key_C) && (modifiers==::Qt::NoButton)) + { + if (!isOpenGL_4_3()) return; + if (!is_two_dimensional()) + { + // toggle clipping plane + m_use_clipping_plane = (m_use_clipping_plane + 1) % CLIPPING_PLANE_END_INDEX; + if (m_use_clipping_plane==CLIPPING_PLANE_OFF && m_frame_plane) + { + setManipulatedFrame(nullptr); + delete m_frame_plane; + m_frame_plane=nullptr; + } + else if (m_frame_plane==nullptr) + { + m_frame_plane=new CGAL::qglviewer::ManipulatedFrame; + setManipulatedFrame(m_frame_plane); + } + + switch(m_use_clipping_plane) + { + case CLIPPING_PLANE_OFF: displayMessage(QString("Draw clipping = flase")); break; + case CLIPPING_PLANE_SOLID_HALF_TRANSPARENT_HALF: clipping_plane_rendering=true; displayMessage(QString("Draw clipping = solid half & transparent half")); break; + case CLIPPING_PLANE_SOLID_HALF_WIRE_HALF: displayMessage(QString("Draw clipping = solid half & wireframe half")); break; + case CLIPPING_PLANE_SOLID_HALF_ONLY: displayMessage(QString("Draw clipping = solid half only")); break; + default: break; + } + update(); + } + } + + else if ((e->key()==::Qt::Key_C) && (modifiers==::Qt::AltModifier)) + { + if (!isOpenGL_4_3()) return; + if (m_use_clipping_plane!=CLIPPING_PLANE_OFF) + { + clipping_plane_rendering = !clipping_plane_rendering; + displayMessage(QString("Draw clipping plane=%1.").arg(clipping_plane_rendering?"true":"false")); + update(); + } + } + else if ((e->key()==::Qt::Key_E) && (modifiers==::Qt::NoButton)) { m_draw_edges=!m_draw_edges; displayMessage(QString("Draw edges=%1.").arg(m_draw_edges?"true":"false")); @@ -1536,6 +1686,17 @@ protected: bool m_draw_text; bool m_no_2D_mode; + enum { + CLIPPING_PLANE_OFF = 0, + CLIPPING_PLANE_SOLID_HALF_TRANSPARENT_HALF, + CLIPPING_PLANE_SOLID_HALF_WIRE_HALF, + CLIPPING_PLANE_SOLID_HALF_ONLY, + CLIPPING_PLANE_END_INDEX + }; + + int m_use_clipping_plane=CLIPPING_PLANE_OFF; + CGAL::qglviewer::ManipulatedFrame* m_frame_plane=nullptr; + double m_size_points; double m_size_edges; double m_size_rays; @@ -1568,6 +1729,7 @@ protected: POS_COLORED_LINES, POS_MONO_FACES, POS_COLORED_FACES, + POS_CLIPPING_PLANE, END_POS, BEGIN_COLOR=END_POS, COLOR_POINTS=BEGIN_COLOR, @@ -1596,6 +1758,7 @@ protected: Buffer_for_vao m_buffer_for_colored_lines; Buffer_for_vao m_buffer_for_mono_faces; Buffer_for_vao m_buffer_for_colored_faces; + Buffer_for_vao m_buffer_for_clipping_plane; static const unsigned int NB_VBO_BUFFERS=(END_POS-BEGIN_POS)+ (END_COLOR-BEGIN_COLOR)+2; // +2 for 2 vectors of normals @@ -1614,12 +1777,19 @@ protected: VAO_COLORED_LINES, VAO_MONO_FACES, VAO_COLORED_FACES, + VAO_CLIPPING_PLANE, NB_VAO_BUFFERS }; QOpenGLVertexArrayObject vao[NB_VAO_BUFFERS]; QOpenGLShaderProgram rendering_program_face; QOpenGLShaderProgram rendering_program_p_l; + QOpenGLShaderProgram rendering_program_clipping_plane; + + // variables for clipping plane + bool clipping_plane_rendering = true; // will be toggled when alt+c is pressed, which is used for indicating whether or not to render the clipping plane ; + float clipping_plane_rendering_transparency = 0.5f; // to what extent the transparent part should be rendered; + float clipping_plane_rendering_size; // to what extent the size of clipping plane should be rendered; std::vector > m_texts; }; diff --git a/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h b/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h index be82c3fecca..009b142b963 100644 --- a/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h +++ b/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h @@ -458,10 +458,6 @@ void DemosMainWindow::readState(QString groupname, Options /*what_to_save*/) move(pos); } - QByteArray mainWindowState = settings.value("state").toByteArray(); - if(!mainWindowState.isNull()) { - this->restoreState(mainWindowState); - } settings.endGroup(); } diff --git a/GraphicsView/include/CGAL/Qt/camera.h b/GraphicsView/include/CGAL/Qt/camera.h index 96a88574e51..bda76bafb05 100644 --- a/GraphicsView/include/CGAL/Qt/camera.h +++ b/GraphicsView/include/CGAL/Qt/camera.h @@ -14,7 +14,6 @@ #ifndef QGLVIEWER_CAMERA_H #define QGLVIEWER_CAMERA_H #include -#include #include #include #include @@ -435,15 +434,6 @@ public Q_SLOTS: void setFlySpeed(qreal speed); //@} - /*! @name XML representation */ - //@{ -public: - virtual QDomElement domElement(const QString &name, - QDomDocument &document) const; -public Q_SLOTS: - virtual void initFromDOMElement(const QDomElement &element); - //@} - private Q_SLOTS: void onFrameModified(); diff --git a/GraphicsView/include/CGAL/Qt/camera_impl.h b/GraphicsView/include/CGAL/Qt/camera_impl.h index d79ce8af56d..672e5d91c23 100644 --- a/GraphicsView/include/CGAL/Qt/camera_impl.h +++ b/GraphicsView/include/CGAL/Qt/camera_impl.h @@ -21,7 +21,6 @@ #include #include -#include #include namespace CGAL{ @@ -45,7 +44,6 @@ Camera::Camera(QObject *parent) // Requires the interpolationKfi_ setFrame(new ManipulatedCameraFrame()); - // #CONNECTION# All these default values identical in initFromDOMElement. // Requires fieldOfView() to define focusDistance() setSceneRadius(1.0); @@ -61,7 +59,6 @@ Camera::Camera(QObject *parent) // projectionMatrix_ below. setType(PERSPECTIVE); - // #CONNECTION# initFromDOMElement default values setZNearCoefficient(0.005); setZClippingCoefficient(sqrt(3.0)); @@ -883,10 +880,13 @@ void Camera::interpolateTo(const Frame &fr, qreal duration) { imprecision along the viewing direction. */ CGAL_INLINE_FUNCTION Vec Camera::pointUnderPixel(const QPoint &pixel, bool &found) const { - float depth; + float depth = 2.0; // Qt uses upper corner for its origin while GL uses the lower corner. - dynamic_cast(parent())->glReadPixels(pixel.x(), screenHeight() - 1 - pixel.y(), 1, 1, - GL_DEPTH_COMPONENT, GL_FLOAT, &depth); + if(auto p = dynamic_cast(parent())) + { + p->glReadPixels(pixel.x(), screenHeight() - 1 - pixel.y(), 1, 1, + GL_DEPTH_COMPONENT, GL_FLOAT, &depth); + } found = depth < 1.0; Vec point(pixel.x(), pixel.y(), depth); point = unprojectedCoordinatesOf(point); @@ -2016,153 +2016,6 @@ void Camera::deletePath(unsigned int i) { //////////////////////////////////////////////////////////////////////////////// -/*! Returns an XML \c QDomElement that represents the Camera. - - \p name is the name of the QDomElement tag. \p doc is the \c QDomDocument - factory used to create QDomElement. - - Concatenates the Camera parameters, the ManipulatedCameraFrame::domElement() - and the paths' KeyFrameInterpolator::domElement(). - - Use initFromDOMElement() to restore the Camera state from the resulting \c - QDomElement. - - If you want to save the Camera state in a file, use: - \code - QDomDocument document("myCamera"); - doc.appendChild( myCamera->domElement("Camera", document) ); - - QFile f("myCamera.xml"); - if (f.open(IO_WriteOnly)) - { - QTextStream out(&f); - document.save(out, 2); - } - \endcode - - Note that the CGAL::QGLViewer::camera() is automatically saved by - CGAL::QGLViewer::saveStateToFile() when a CGAL::QGLViewer is closed. Use - CGAL::QGLViewer::restoreStateFromFile() to restore it back. */ -CGAL_INLINE_FUNCTION -QDomElement Camera::domElement(const QString &name, - QDomDocument &document) const { - QDomElement de = document.createElement(name); - QDomElement paramNode = document.createElement("Parameters"); - paramNode.setAttribute("fieldOfView", QString::number(fieldOfView())); - paramNode.setAttribute("zNearCoefficient", - QString::number(zNearCoefficient())); - paramNode.setAttribute("zClippingCoefficient", - QString::number(zClippingCoefficient())); - paramNode.setAttribute("orthoCoef", QString::number(orthoCoef_)); - paramNode.setAttribute("sceneRadius", QString::number(sceneRadius())); - paramNode.appendChild(sceneCenter().domElement("SceneCenter", document)); - - switch (type()) { - case Camera::PERSPECTIVE: - paramNode.setAttribute("Type", "PERSPECTIVE"); - break; - case Camera::ORTHOGRAPHIC: - paramNode.setAttribute("Type", "ORTHOGRAPHIC"); - break; - } - de.appendChild(paramNode); - - de.appendChild(frame()->domElement("ManipulatedCameraFrame", document)); - - // KeyFrame paths - for (QMap::ConstIterator - it = kfi_.begin(), - end = kfi_.end(); - it != end; ++it) { - QDomElement kfNode = - (it.value())->domElement("KeyFrameInterpolator", document); - kfNode.setAttribute("index", QString::number(it.key())); - de.appendChild(kfNode); - } - - return de; -} - -/*! Restores the Camera state from a \c QDomElement created by domElement(). - - Use the following code to retrieve a Camera state from a file created using - domElement(): \code - // Load DOM from file - QDomDocument document; - QFile f("myCamera.xml"); - if (f.open(IO_ReadOnly)) - { - document.setContent(&f); - f.close(); - } - - // Parse the DOM tree - QDomElement main = document.documentElement(); - myCamera->initFromDOMElement(main); - \endcode - - The frame() pointer is not modified by this method. The frame() state is - however modified. - - \attention The original keyFrameInterpolator() are deleted and should be copied - first if they are shared. */ -CGAL_INLINE_FUNCTION -void Camera::initFromDOMElement(const QDomElement &element) { - QDomElement child = element.firstChild().toElement(); - - QMutableMapIterator it(kfi_); - while (it.hasNext()) { - it.next(); - deletePath(it.key()); - } - - while (!child.isNull()) { - if (child.tagName() == "Parameters") { - // #CONNECTION# Default values set in constructor - //setFieldOfView(DomUtils::qrealFromDom(child, "fieldOfView", CGAL_PI / 4.0)); - setZNearCoefficient( - DomUtils::qrealFromDom(child, "zNearCoefficient", 0.005)); - setZClippingCoefficient( - DomUtils::qrealFromDom(child, "zClippingCoefficient", sqrt(3.0))); - orthoCoef_ = - DomUtils::qrealFromDom(child, "orthoCoef", tan(fieldOfView() / 2.0)); - setSceneRadius( - DomUtils::qrealFromDom(child, "sceneRadius", sceneRadius())); - - setType(PERSPECTIVE); - QString type = child.attribute("Type", "PERSPECTIVE"); - if (type == "PERSPECTIVE") - setType(Camera::PERSPECTIVE); - if (type == "ORTHOGRAPHIC") - setType(Camera::ORTHOGRAPHIC); - - QDomElement child2 = child.firstChild().toElement(); - while (!child2.isNull()) { - /* Although the scene does not change when a camera is loaded, restore - the saved center and radius values. Mainly useful when a the viewer is - restored on startup, with possible additional cameras. */ - if (child2.tagName() == "SceneCenter") - setSceneCenter(Vec(child2)); - - child2 = child2.nextSibling().toElement(); - } - } - - if (child.tagName() == "ManipulatedCameraFrame") - frame()->initFromDOMElement(child); - - - if (child.tagName() == "KeyFrameInterpolator") { - unsigned int index = DomUtils::uintFromDom(child, "index", 0); - setKeyFrameInterpolator(index, new KeyFrameInterpolator(frame())); - if (keyFrameInterpolator(index)) - keyFrameInterpolator(index)->initFromDOMElement(child); - } - - child = child.nextSibling().toElement(); - } -} - /*! Gives the coefficients of a 3D half-line passing through the Camera eye and pixel (x,y). diff --git a/GraphicsView/include/CGAL/Qt/constraint_impl.h b/GraphicsView/include/CGAL/Qt/constraint_impl.h index abb97f9d29d..513900a9fbd 100644 --- a/GraphicsView/include/CGAL/Qt/constraint_impl.h +++ b/GraphicsView/include/CGAL/Qt/constraint_impl.h @@ -59,7 +59,7 @@ void AxisPlaneConstraint::setTranslationConstraintDirection( if ((translationConstraintType() != AxisPlaneConstraint::FREE) && (translationConstraintType() != AxisPlaneConstraint::FORBIDDEN)) { const qreal norm = direction.norm(); - if (norm < 1E-8) { + if (norm == 0) { qWarning("AxisPlaneConstraint::setTranslationConstraintDir: null vector " "for translation constraint"); translationConstraintType_ = AxisPlaneConstraint::FREE; diff --git a/GraphicsView/include/CGAL/Qt/domUtils.h b/GraphicsView/include/CGAL/Qt/domUtils.h deleted file mode 100644 index 36e2e69b803..00000000000 --- a/GraphicsView/include/CGAL/Qt/domUtils.h +++ /dev/null @@ -1,183 +0,0 @@ -/**************************************************************************** - - Copyright (c) 2018 GeometryFactory Sarl (France). - Copyright (C) 2002-2014 Gilles Debunne. All rights reserved. - - This file is part of a fork of the QGLViewer library version 2.7.0. - -*****************************************************************************/ -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-only -#ifndef QGLVIEWER_DOMUTILS_H -#define QGLVIEWER_DOMUTILS_H -#include -#include -#include -#include -#include - -#include - -#ifndef DOXYGEN - -// QDomElement loading with syntax checking. -class DomUtils { -private: - static void warning(const QString &message) { - qWarning("%s", message.toLatin1().constData()); - } - -public: - static qreal qrealFromDom(const QDomElement &e, const QString &attribute, - qreal defValue) { - qreal value = defValue; - if (e.hasAttribute(attribute)) { - const QString s = e.attribute(attribute); - bool ok; - value = s.toDouble(&ok); - if (!ok) { - warning(QString("'%1' is not a valid qreal syntax for attribute \"%2\" " - "in initialization of \"%3\". Setting value to %4.") - .arg(s) - .arg(attribute) - .arg(e.tagName()) - .arg(QString::number(defValue))); - value = defValue; - } - } else { - warning(QString("\"%1\" attribute missing in initialization of \"%2\". " - "Setting value to %3.") - .arg(attribute) - .arg(e.tagName()) - .arg(QString::number(value))); - } - -#if defined(isnan) - // The "isnan" method may not be available on all platforms. - // Find its equivalent or simply remove these two lines - if (isnan(value)) - warning( - QString( - "Warning, attribute \"%1\" initialized to Not a Number in \"%2\"") - .arg(attribute) - .arg(e.tagName())); -#endif - - return value; - } - - static int intFromDom(const QDomElement &e, const QString &attribute, - int defValue) { - int value = defValue; - if (e.hasAttribute(attribute)) { - const QString s = e.attribute(attribute); - bool ok; - value = s.toInt(&ok); - if (!ok) { - warning( - QString("'%1' is not a valid integer syntax for attribute \"%2\" " - "in initialization of \"%3\". Setting value to %4.") - .arg(s) - .arg(attribute) - .arg(e.tagName()) - .arg(QString::number(defValue))); - value = defValue; - } - } else { - warning(QString("\"%1\" attribute missing in initialization of \"%2\". " - "Setting value to %3.") - .arg(attribute) - .arg(e.tagName()) - .arg(QString::number(value))); - } - - return value; - } - - static unsigned int uintFromDom(const QDomElement &e, - const QString &attribute, - unsigned int defValue) { - unsigned int value = defValue; - if (e.hasAttribute(attribute)) { - const QString s = e.attribute(attribute); - bool ok; - value = s.toUInt(&ok); - if (!ok) { - warning( - QString("'%1' is not a valid unsigned integer syntax for attribute " - "\"%2\" in initialization of \"%3\". Setting value to %4.") - .arg(s) - .arg(attribute) - .arg(e.tagName()) - .arg(QString::number(defValue))); - value = defValue; - } - } else { - warning(QString("\"%1\" attribute missing in initialization of \"%2\". " - "Setting value to %3.") - .arg(attribute) - .arg(e.tagName()) - .arg(QString::number(value))); - } - - return value; - } - - static bool boolFromDom(const QDomElement &e, const QString &attribute, - bool defValue) { - bool value = defValue; - if (e.hasAttribute(attribute)) { - const QString s = e.attribute(attribute); - if (s.toLower() == QString("true")) - value = true; - else if (s.toLower() == QString("false")) - value = false; - else { - warning( - QString("'%1' is not a valid boolean syntax for attribute \"%2\" " - "in initialization of \"%3\". Setting value to %4.") - .arg(s) - .arg(attribute) - .arg(e.tagName()) - .arg(defValue ? "true" : "false")); - } - } else { - warning(QString("\"%1\" attribute missing in initialization of \"%2\". " - "Setting value to %3.") - .arg(attribute) - .arg(e.tagName()) - .arg(value ? "true" : "false")); - } - - return value; - } - - static void setBoolAttribute(QDomElement &element, const QString &attribute, - bool value) { - element.setAttribute(attribute, (value ? "true" : "false")); - } - - static QDomElement QColorDomElement(const QColor &color, const QString &name, - QDomDocument &doc) { - QDomElement de = doc.createElement(name); - de.setAttribute("red", QString::number(color.red())); - de.setAttribute("green", QString::number(color.green())); - de.setAttribute("blue", QString::number(color.blue())); - return de; - } - - static QColor QColorFromDom(const QDomElement &e) { - int color[3]; - QStringList attribute; - attribute << "red" - << "green" - << "blue"; - for (int i = 0; i < attribute.count(); ++i) - color[i] = DomUtils::intFromDom(e, attribute[i], 0); - return QColor(color[0], color[1], color[2]); - } -}; - -#endif // DOXYGEN -#endif //QGLVIEWER_DOMUTILS_H diff --git a/GraphicsView/include/CGAL/Qt/frame.h b/GraphicsView/include/CGAL/Qt/frame.h index 7bf7a31eda8..23110350fce 100644 --- a/GraphicsView/include/CGAL/Qt/frame.h +++ b/GraphicsView/include/CGAL/Qt/frame.h @@ -425,14 +425,6 @@ public: } //@} - /*! @name XML representation */ - //@{ -public: - virtual QDomElement domElement(const QString &name, - QDomDocument &document) const; -public Q_SLOTS: - virtual void initFromDOMElement(const QDomElement &element); - //@} private: // P o s i t i o n a n d o r i e n t a t i o n diff --git a/GraphicsView/include/CGAL/Qt/frame_impl.h b/GraphicsView/include/CGAL/Qt/frame_impl.h index 2f5e925fa72..bb8089dc65c 100644 --- a/GraphicsView/include/CGAL/Qt/frame_impl.h +++ b/GraphicsView/include/CGAL/Qt/frame_impl.h @@ -21,7 +21,6 @@ #include #include -#include #include namespace CGAL{ @@ -999,68 +998,6 @@ void Frame::getTransformOfFrom(const qreal src[3], qreal res[3], res[i] = r[i]; } -//////////////////////////// STATE ////////////////////////////// - -/*! Returns an XML \c QDomElement that represents the Frame. - - \p name is the name of the QDomElement tag. \p doc is the \c QDomDocument - factory used to create QDomElement. - - The resulting QDomElement looks like: - \code - - - - - \endcode - - Use initFromDOMElement() to restore the Frame state from the resulting \c - QDomElement. - - - See Vec::domElement() for a complete example. See also - - Quaternion::domElement(), Camera::domElement()... - - \attention The constraint() and referenceFrame() are not saved in the - QDomElement. */ -CGAL_INLINE_FUNCTION -QDomElement Frame::domElement(const QString &name, - QDomDocument &document) const { - // TODO: use translation and rotation instead when referenceFrame is coded... - QDomElement e = document.createElement(name); - e.appendChild(position().domElement("position", document)); - e.appendChild(orientation().domElement("orientation", document)); - return e; -} - -/*! Restores the Frame state from a \c QDomElement created by domElement(). - - See domElement() for the \c QDomElement syntax. See the - Vec::initFromDOMElement() and Quaternion::initFromDOMElement() documentations - for details on default values if an argument is missing. - - \attention The constraint() and referenceFrame() are not restored by this - method and are left unchanged. */ -CGAL_INLINE_FUNCTION -void Frame::initFromDOMElement(const QDomElement &element) { - // TODO: use translation and rotation instead when referenceFrame is coded... - - // Reset default values. Attention: destroys constraint. - // *this = Frame(); - // This instead ? Better : what is not set is not changed. - // setPositionAndOrientation(Vec(), Quaternion()); - - QDomElement child = element.firstChild().toElement(); - while (!child.isNull()) { - if (child.tagName() == "position") - setPosition(Vec(child)); - if (child.tagName() == "orientation") - setOrientation(Quaternion(child).normalized()); - - child = child.nextSibling().toElement(); - } -} ///////////////////////////////// ALIGN ///////////////////////////////// diff --git a/GraphicsView/include/CGAL/Qt/init_ogl_context.h b/GraphicsView/include/CGAL/Qt/init_ogl_context.h new file mode 100644 index 00000000000..4ec18c6659a --- /dev/null +++ b/GraphicsView/include/CGAL/Qt/init_ogl_context.h @@ -0,0 +1,53 @@ +// Copyright (c) 2021 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) : Maxime Gimeno + +#ifndef CGAL_QT_CONTEXT_INITIALIZATION_H +#define CGAL_QT_CONTEXT_INITIALIZATION_H + +#include + + +#include +#include +namespace CGAL +{ +namespace Qt +{ +inline void init_ogl_context(int major, int minor) { + QSurfaceFormat fmt; +#ifdef Q_OS_MAC + if(major == 4) + { + fmt.setVersion(4, 1); + } + else + { + fmt.setVersion(major, minor); + } +#else + fmt.setVersion(major, minor); +#endif + fmt.setRenderableType(QSurfaceFormat::OpenGL); + fmt.setProfile(QSurfaceFormat::CoreProfile); + fmt.setOption(QSurfaceFormat::DebugContext); + QSurfaceFormat::setDefaultFormat(fmt); + + //for windows + QCoreApplication::setAttribute(::Qt::AA_UseDesktopOpenGL); + + //We set the locale to avoid any trouble with VTK + setlocale(LC_ALL, "C"); +} + +} //end Qt +} //end CGAL +#endif // CGAL_QT_CONTEXT_INITIALIZATION_H diff --git a/GraphicsView/include/CGAL/Qt/keyFrameInterpolator.h b/GraphicsView/include/CGAL/Qt/keyFrameInterpolator.h index 381ac37bad6..30b87fe0507 100644 --- a/GraphicsView/include/CGAL/Qt/keyFrameInterpolator.h +++ b/GraphicsView/include/CGAL/Qt/keyFrameInterpolator.h @@ -281,14 +281,6 @@ public Q_SLOTS: virtual void interpolateAtTime(qreal time); //@} - /*! @name XML representation */ - //@{ -public: - virtual QDomElement domElement(const QString &name, - QDomDocument &document) const; - virtual void initFromDOMElement(const QDomElement &element); - //@} - private Q_SLOTS: virtual void update(); virtual void invalidateValues() { diff --git a/GraphicsView/include/CGAL/Qt/keyFrameInterpolator_impl.h b/GraphicsView/include/CGAL/Qt/keyFrameInterpolator_impl.h index 143a1b2175f..eed29d31c14 100644 --- a/GraphicsView/include/CGAL/Qt/keyFrameInterpolator_impl.h +++ b/GraphicsView/include/CGAL/Qt/keyFrameInterpolator_impl.h @@ -19,7 +19,6 @@ #endif #include -#include namespace CGAL{ namespace qglviewer{ @@ -37,7 +36,6 @@ KeyFrameInterpolator::KeyFrameInterpolator(Frame *frame) interpolationSpeed_(1.0), interpolationStarted_(false), closedPath_(false), loopInterpolation_(false), pathIsValid_(false), valuesAreValid_(true), currentFrameValid_(false) -// #CONNECTION# Values cut pasted initFromDOMElement() { setFrame(frame); for (int i = 0; i < 4; ++i) @@ -320,7 +318,7 @@ qreal KeyFrameInterpolator::keyFrameTime(int index) const { /*! Returns the duration of the KeyFrameInterpolator path, expressed in seconds. Simply corresponds to lastTime() - firstTime(). Returns 0.0 if the path has - less than 2 keyFrames. See also keyFrameTime(). */ + fewer than 2 keyFrames. See also keyFrameTime(). */ CGAL_INLINE_FUNCTION qreal KeyFrameInterpolator::duration() const { return lastTime() - firstTime(); @@ -458,85 +456,6 @@ void KeyFrameInterpolator::interpolateAtTime(qreal time) { Q_EMIT interpolated(); } -/*! Returns an XML \c QDomElement that represents the KeyFrameInterpolator. - - The resulting QDomElement holds the KeyFrameInterpolator parameters as well as - the path keyFrames (if the keyFrame is defined by a pointer to a Frame, use its - current value). - - \p name is the name of the QDomElement tag. \p doc is the \c QDomDocument - factory used to create QDomElement. - - Use initFromDOMElement() to restore the ManipulatedFrame state from the - resulting QDomElement. - - - See Vec::domElement() for a complete example. See also - Quaternion::domElement(), Camera::domElement()... - - Note that the Camera::keyFrameInterpolator() are automatically saved by - CGAL::QGLViewer::saveStateToFile() when a CGAL::QGLViewer is closed. */ -CGAL_INLINE_FUNCTION -QDomElement KeyFrameInterpolator::domElement(const QString &name, - QDomDocument &document) const { - QDomElement de = document.createElement(name); - int count = 0; - Q_FOREACH (KeyFrame *kf, keyFrame_) { - Frame fr(kf->position(), kf->orientation()); - QDomElement kfNode = fr.domElement("KeyFrame", document); - kfNode.setAttribute("index", QString::number(count)); - kfNode.setAttribute("time", QString::number(kf->time())); - de.appendChild(kfNode); - ++count; - } - de.setAttribute("nbKF", QString::number(keyFrame_.count())); - de.setAttribute("time", QString::number(interpolationTime())); - de.setAttribute("speed", QString::number(interpolationSpeed())); - de.setAttribute("period", QString::number(interpolationPeriod())); - DomUtils::setBoolAttribute(de, "closedPath", closedPath()); - DomUtils::setBoolAttribute(de, "loop", loopInterpolation()); - return de; -} - -/*! Restores the KeyFrameInterpolator state from a \c QDomElement created by - domElement(). - - Note that the frame() pointer is not included in the domElement(): you need to - setFrame() after this method to attach a Frame to the KeyFrameInterpolator. - - See Vec::initFromDOMElement() for a complete code example. - - See also Camera::initFromDOMElement() and Frame::initFromDOMElement(). */ -CGAL_INLINE_FUNCTION -void KeyFrameInterpolator::initFromDOMElement(const QDomElement &element) { - qDeleteAll(keyFrame_); - keyFrame_.clear(); - QDomElement child = element.firstChild().toElement(); - while (!child.isNull()) { - if (child.tagName() == "KeyFrame") { - Frame fr; - fr.initFromDOMElement(child); - qreal time = DomUtils::qrealFromDom(child, "time", 0.0); - addKeyFrame(fr, time); - } - - child = child.nextSibling().toElement(); - } - - // #CONNECTION# Values cut pasted from constructor - setInterpolationTime(DomUtils::qrealFromDom(element, "time", 0.0)); - setInterpolationSpeed(DomUtils::qrealFromDom(element, "speed", 1.0)); - setInterpolationPeriod(DomUtils::intFromDom(element, "period", 40)); - setClosedPath(DomUtils::boolFromDom(element, "closedPath", false)); - setLoopInterpolation(DomUtils::boolFromDom(element, "loop", false)); - - // setFrame(nullptr); - pathIsValid_ = false; - valuesAreValid_ = false; - currentFrameValid_ = false; - - stopInterpolation(); -} #ifndef DOXYGEN diff --git a/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame.h b/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame.h index a481686f55c..4b9a7b6c563 100644 --- a/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame.h +++ b/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame.h @@ -199,15 +199,6 @@ protected Q_SLOTS: virtual void spin(); //@} - /*! @name XML representation */ - //@{ -public: - virtual QDomElement domElement(const QString &name, - QDomDocument &document) const; -public Q_SLOTS: - virtual void initFromDOMElement(const QDomElement &element); -//@} - #ifndef DOXYGEN protected: virtual void startAction( diff --git a/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame_impl.h b/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame_impl.h index c3cae0c5b71..885ce76c7c2 100644 --- a/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame_impl.h +++ b/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame_impl.h @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -117,69 +116,6 @@ void ManipulatedCameraFrame::updateSceneUpVector() { sceneUpVector_ = inverseTransformOf(Vec(0.0, 1.0, 0.0)); } -//////////////////////////////////////////////////////////////////////////////// -// S t a t e s a v i n g a n d r e s t o r i n g // -//////////////////////////////////////////////////////////////////////////////// - -/*! Returns an XML \c QDomElement that represents the ManipulatedCameraFrame. - - Adds to the ManipulatedFrame::domElement() the ManipulatedCameraFrame specific - informations in a \c ManipulatedCameraParameters child QDomElement. - - \p name is the name of the QDomElement tag. \p doc is the \c QDomDocument - factory used to create QDomElement. - - Use initFromDOMElement() to restore the ManipulatedCameraFrame state from the - resulting \c QDomElement. - - See Vec::domElement() for a complete example. See also - Quaternion::domElement(), Frame::domElement(), Camera::domElement()... */ -CGAL_INLINE_FUNCTION -QDomElement ManipulatedCameraFrame::domElement(const QString &name, - QDomDocument &document) const { - QDomElement e = ManipulatedFrame::domElement(name, document); - QDomElement mcp = document.createElement("ManipulatedCameraParameters"); - mcp.setAttribute("flySpeed", QString::number(flySpeed())); - DomUtils::setBoolAttribute(mcp, "rotatesAroundUpVector", - rotatesAroundUpVector()); - DomUtils::setBoolAttribute(mcp, "zoomsOnPivotPoint", zoomsOnPivotPoint()); - mcp.appendChild(sceneUpVector().domElement("sceneUpVector", document)); - e.appendChild(mcp); - return e; -} - -/*! Restores the ManipulatedCameraFrame state from a \c QDomElement created by -domElement(). - -First calls ManipulatedFrame::initFromDOMElement() and then initializes -ManipulatedCameraFrame specific parameters. */ -CGAL_INLINE_FUNCTION -void ManipulatedCameraFrame::initFromDOMElement(const QDomElement &element) { - // No need to initialize, since default sceneUpVector and flySpeed are not - // meaningful. It's better to keep current ones. And it would destroy - // constraint() and referenceFrame(). *this = ManipulatedCameraFrame(); - ManipulatedFrame::initFromDOMElement(element); - - QDomElement child = element.firstChild().toElement(); - while (!child.isNull()) { - if (child.tagName() == "ManipulatedCameraParameters") { - setFlySpeed(DomUtils::qrealFromDom(child, "flySpeed", flySpeed())); - setRotatesAroundUpVector( - DomUtils::boolFromDom(child, "rotatesAroundUpVector", false)); - setZoomsOnPivotPoint( - DomUtils::boolFromDom(child, "zoomsOnPivotPoint", false)); - - QDomElement schild = child.firstChild().toElement(); - while (!schild.isNull()) { - if (schild.tagName() == "sceneUpVector") - setSceneUpVector(Vec(schild)); - - schild = schild.nextSibling().toElement(); - } - } - child = child.nextSibling().toElement(); - } -} //////////////////////////////////////////////////////////////////////////////// // M o u s e h a n d l i n g // diff --git a/GraphicsView/include/CGAL/Qt/manipulatedFrame.h b/GraphicsView/include/CGAL/Qt/manipulatedFrame.h index bbef82923c0..88566c14097 100644 --- a/GraphicsView/include/CGAL/Qt/manipulatedFrame.h +++ b/GraphicsView/include/CGAL/Qt/manipulatedFrame.h @@ -302,15 +302,6 @@ public: virtual void checkIfGrabsMouse(int x, int y, const Camera *const camera); //@} - /*! @name XML representation */ - //@{ -public: - virtual QDomElement domElement(const QString &name, - QDomDocument &document) const; -public Q_SLOTS: - virtual void initFromDOMElement(const QDomElement &element); -//@} - #ifndef DOXYGEN protected: Quaternion deformedBallQuaternion(int x, int y, qreal cx, qreal cy, diff --git a/GraphicsView/include/CGAL/Qt/manipulatedFrame_impl.h b/GraphicsView/include/CGAL/Qt/manipulatedFrame_impl.h index e99c1acb99e..dbf263c30d4 100644 --- a/GraphicsView/include/CGAL/Qt/manipulatedFrame_impl.h +++ b/GraphicsView/include/CGAL/Qt/manipulatedFrame_impl.h @@ -21,7 +21,6 @@ #include #include -#include #include #include @@ -43,7 +42,6 @@ namespace qglviewer{ CGAL_INLINE_FUNCTION ManipulatedFrame::ManipulatedFrame() : action_(NO_MOUSE_ACTION), keepsGrabbingMouse_(false) { - // #CONNECTION# initFromDOMElement and accessor docs setRotationSensitivity(1.0); setTranslationSensitivity(1.0); setSpinningSensitivity(0.3); @@ -101,71 +99,7 @@ void ManipulatedFrame::checkIfGrabsMouse(int x, int y, (fabs(y - proj.y) < thresold))); } -//////////////////////////////////////////////////////////////////////////////// -// S t a t e s a v i n g a n d r e s t o r i n g // -//////////////////////////////////////////////////////////////////////////////// -/*! Returns an XML \c QDomElement that represents the ManipulatedFrame. - - Adds to the Frame::domElement() the ManipulatedFrame specific informations in a - \c ManipulatedParameters child QDomElement. - - \p name is the name of the QDomElement tag. \p doc is the \c QDomDocument - factory used to create QDomElement. - - Use initFromDOMElement() to restore the ManipulatedFrame state from the - resulting \c QDomElement. - - See Vec::domElement() for a complete example. See also - Quaternion::domElement(), Camera::domElement()... */ -CGAL_INLINE_FUNCTION -QDomElement ManipulatedFrame::domElement(const QString &name, - QDomDocument &document) const { - QDomElement e = Frame::domElement(name, document); - QDomElement mp = document.createElement("ManipulatedParameters"); - mp.setAttribute("rotSens", QString::number(rotationSensitivity())); - mp.setAttribute("transSens", QString::number(translationSensitivity())); - mp.setAttribute("spinSens", QString::number(spinningSensitivity())); - mp.setAttribute("wheelSens", QString::number(wheelSensitivity())); - mp.setAttribute("zoomSens", QString::number(zoomSensitivity())); - e.appendChild(mp); - return e; -} - -/*! Restores the ManipulatedFrame state from a \c QDomElement created by -domElement(). - -Fields that are not described in \p element are set to their default values (see -ManipulatedFrame()). - -First calls Frame::initFromDOMElement() and then initializes ManipulatedFrame -specific parameters. Note that constraint() and referenceFrame() are not -restored and are left unchanged. - - -See Vec::initFromDOMElement() for a complete code example. */ -CGAL_INLINE_FUNCTION -void ManipulatedFrame::initFromDOMElement(const QDomElement &element) { - // Not called since it would set constraint() and referenceFrame() to nullptr. - // *this = ManipulatedFrame(); - Frame::initFromDOMElement(element); - - stopSpinning(); - - QDomElement child = element.firstChild().toElement(); - while (!child.isNull()) { - if (child.tagName() == "ManipulatedParameters") { - // #CONNECTION# constructor default values and accessor docs - setRotationSensitivity(DomUtils::qrealFromDom(child, "rotSens", 1.0)); - setTranslationSensitivity( - DomUtils::qrealFromDom(child, "transSens", 1.0)); - setSpinningSensitivity(DomUtils::qrealFromDom(child, "spinSens", 0.3)); - setWheelSensitivity(DomUtils::qrealFromDom(child, "wheelSens", 1.0)); - setZoomSensitivity(DomUtils::qrealFromDom(child, "zoomSens", 1.0)); - } - child = child.nextSibling().toElement(); - } -} //////////////////////////////////////////////////////////////////////////////// // M o u s e h a n d l i n g // diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index 045ae469063..34c88e27495 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -179,9 +179,7 @@ public: /*! Returns the background color of the viewer. This method is provided for convenience since the background color is an - OpenGL state variable set with \c glClearColor(). However, this internal - representation has the advantage that it is saved (resp. restored) with - saveStateToFile() (resp. restoreStateFromFile()). + OpenGL state variable set with \c glClearColor(). Use setBackgroundColor() to define and activate a background color. @@ -667,9 +665,8 @@ protected: initialize some of the OpenGL flags. The default implementation is empty. See initializeGL(). - Typical usage include camera() initialization (showEntireScene()), previous - viewer state restoration (restoreStateFromFile()), OpenGL state modification - and display list creation. + Typical usage include camera() initialization (showEntireScene()), + OpenGL state modification and display list creation. Note that initializeGL() modifies the standard OpenGL context. These values can be restored back in this method. @@ -719,7 +716,6 @@ protected: virtual void keyPressEvent(QKeyEvent *); virtual void keyReleaseEvent(QKeyEvent *); virtual void timerEvent(QTimerEvent *); - virtual void closeEvent(QCloseEvent *); //@} /*! @name Object selection */ @@ -921,35 +917,11 @@ protected: //@{ public: QString stateFileName() const; - virtual QDomElement domElement(const QString &name, - QDomDocument &document) const; Q_SIGNALS: void needNewContext(); -public Q_SLOTS: - virtual void initFromDOMElement(const QDomElement &element); - virtual void saveStateToFile(); // cannot be const because of QMessageBox - virtual bool restoreStateFromFile(); - - /*! Defines the stateFileName() used by saveStateToFile() and - restoreStateFromFile(). - - The file name can have an optional prefix directory (no prefix meaning - current directory). If the directory does not exist, it will be created by - saveStateToFile(). - - \code - // Name depends on the displayed 3D model. Saved in current directory. - setStateFileName(3DModelName() + ".xml"); - - // Files are stored in a dedicated directory under user's home directory. - setStateFileName(QDir::homeDirPath + "/.config/myApp.xml"); - \endcode */ - void setStateFileName(const QString &name) { stateFileName_ = name; } - protected: - static void saveStateToFileForAllViewers(); //@} /*! @name QGLViewer pool */ @@ -1167,8 +1139,6 @@ protected: QMap wheelBinding_; QMap clickBinding_; ::Qt::Key currentlyPressedKey_; - // S t a t e F i l e - QString stateFileName_; // H e l p w i n d o w QTabWidget *helpWidget_; diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index 865f7b63a1f..7aa487408c3 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -24,7 +24,6 @@ #include #include #include -#include #include #include @@ -103,7 +102,6 @@ void CGAL::QGLViewer::defaultConstructor() { // It will be set when setFullScreen(false) is called after // setFullScreen(true) - // #CONNECTION# default values in initFromDOMElement() manipulatedFrame_ = nullptr; manipulatedFrameIsACamera_ = false; mouseGrabberIsAManipulatedFrame_ = false; @@ -116,9 +114,7 @@ void CGAL::QGLViewer::defaultConstructor() { setSceneRadius(1.0); showEntireScene(); - setStateFileName(".qglviewer.xml"); - // #CONNECTION# default values in initFromDOMElement() setAxisIsDrawn(false); setGridIsDrawn(false); setFPSIsDisplayed(false); @@ -180,11 +176,6 @@ other viewer's indexes) and allocated memory is released. The camera() is deleted and should be copied before if it is shared by an other viewer. */ CGAL_INLINE_FUNCTION CGAL::QGLViewer::~QGLViewer() { - // See closeEvent comment. Destructor is called (and not closeEvent) only when - // the widget is embedded. Hence we saveToFile here. It is however a bad idea - // if virtual domElement() has been overloaded ! if (parent()) - // saveStateToFileForAllViewers(); - CGAL::QGLViewer::QGLViewerPool().removeAll(this); camera()->deleteLater(); @@ -217,16 +208,6 @@ void CGAL::QGLViewer::initializeGL() { || QCoreApplication::arguments().contains(QStringLiteral("--old"))) { - format.setDepthBufferSize(24); - format.setStencilBufferSize(8); - format.setVersion(2,0); - format.setRenderableType(QSurfaceFormat::OpenGLES); - format.setSamples(0); - format.setOption(QSurfaceFormat::DebugContext); - QSurfaceFormat::setDefaultFormat(format); - - needNewContext(); - qDebug()<<"GL 4.3 context initialization failed. "; is_ogl_4_3 = false; } else @@ -659,7 +640,7 @@ void CGAL::QGLViewer::setCameraIsEdited(bool edit) { cameraIsEdited_ = edit; if (edit) { previousCameraZClippingCoefficient_ = camera()->zClippingCoefficient(); - // #CONNECTION# 5.0 also used in domElement() and in initFromDOMElement(). + camera()->setZClippingCoefficient(5.0); } else camera()->setZClippingCoefficient(previousCameraZClippingCoefficient_); @@ -751,7 +732,7 @@ void CGAL::QGLViewer::setDefaultMouseBindings() { (mh == qglviewer::FRAME) ? frameKeyboardModifiers : cameraKeyboardModifiers; setMouseBinding(modifiers, ::Qt::LeftButton, mh, qglviewer::ROTATE); - setMouseBinding(modifiers, ::Qt::MidButton, mh, qglviewer::ZOOM); + setMouseBinding(modifiers, ::Qt::MiddleButton, mh, qglviewer::ZOOM); setMouseBinding(modifiers, ::Qt::RightButton, mh, qglviewer::TRANSLATE); setMouseBinding(::Qt::Key_R, modifiers, ::Qt::LeftButton, mh, qglviewer::SCREEN_ROTATE); @@ -761,7 +742,7 @@ void CGAL::QGLViewer::setDefaultMouseBindings() { setWheelBinding(::Qt::Key_Z, ::Qt::NoModifier, qglviewer::CAMERA, qglviewer::ZOOM_FOV); // Z o o m o n r e g i o n - setMouseBinding(::Qt::ShiftModifier, ::Qt::MidButton, qglviewer::CAMERA, qglviewer::ZOOM_ON_REGION); + setMouseBinding(::Qt::ShiftModifier, ::Qt::MiddleButton, qglviewer::CAMERA, qglviewer::ZOOM_ON_REGION); // S e l e c t setMouseBinding(::Qt::ShiftModifier, ::Qt::LeftButton, qglviewer::SELECT); @@ -769,7 +750,7 @@ void CGAL::QGLViewer::setDefaultMouseBindings() { setMouseBinding(::Qt::ShiftModifier, ::Qt::RightButton, qglviewer::RAP_FROM_PIXEL); // D o u b l e c l i c k setMouseBinding(::Qt::NoModifier, ::Qt::LeftButton, qglviewer::ALIGN_CAMERA, true); - setMouseBinding(::Qt::NoModifier, ::Qt::MidButton, qglviewer::SHOW_ENTIRE_SCENE, true); + setMouseBinding(::Qt::NoModifier, ::Qt::MiddleButton, qglviewer::SHOW_ENTIRE_SCENE, true); setMouseBinding(::Qt::NoModifier, ::Qt::RightButton, qglviewer::CENTER_SCENE, true); setMouseBinding(frameKeyboardModifiers, ::Qt::LeftButton, qglviewer::ALIGN_FRAME, true); @@ -1076,46 +1057,6 @@ void CGAL::QGLViewer::stopAnimation() { killTimer(animationTimerId_); } -/*! Overloading of the \c QWidget method. - -Saves the viewer state using saveStateToFile() and then calls -QOpenGLWidget::closeEvent(). */ -CGAL_INLINE_FUNCTION -void CGAL::QGLViewer::closeEvent(QCloseEvent *e) { - // When the user clicks on the window close (x) button: - // - If the viewer is a top level window, closeEvent is called and then saves - // to file. - Otherwise, nothing happen s:( When the user press the - // EXIT_VIEWER keyboard shortcut: - If the viewer is a top level window, - // saveStateToFile() is also called - Otherwise, closeEvent is NOT called and - // keyPressEvent does the job. - - /* After tests: - E : Embedded widget - N : Widget created with new - C : closeEvent called - D : destructor called - - E N C D - y y - y n y - n y y - n n y y - - closeEvent is called iif the widget is NOT embedded. - - Destructor is called iif the widget is created on the stack - or if widget (resp. parent if embedded) is created with WDestructiveClose - flag. - - closeEvent always before destructor. - - Close using qApp->closeAllWindows or (x) is identical. - */ - - // #CONNECTION# Also done for EXIT_VIEWER in keyPressEvent(). - saveStateToFile(); - QOpenGLWidget::closeEvent(e); -} /*! Simple wrapper method: calls \c select(event->pos()). @@ -1236,7 +1177,7 @@ static QString mouseButtonsString(::Qt::MouseButtons b) { result += CGAL::QGLViewer::tr("Left", "left mouse button"); addAmpersand = true; } - if (b & ::Qt::MidButton) { + if (b & ::Qt::MiddleButton) { if (addAmpersand) result += " & "; result += CGAL::QGLViewer::tr("Middle", "middle mouse button"); @@ -1786,7 +1727,7 @@ Mouse tab. \c ::Qt::AltModifier, \c ::Qt::ShiftModifier, \c ::Qt::MetaModifier). Possibly combined using the \c "|" operator. -\p button is one of the ::Qt::MouseButtons (\c ::Qt::LeftButton, \c ::Qt::MidButton, +\p button is one of the ::Qt::MouseButtons (\c ::Qt::LeftButton, \c ::Qt::MiddleButton, \c ::Qt::RightButton...). \p doubleClick indicates whether or not the user has to double click this button @@ -2369,7 +2310,6 @@ void CGAL::QGLViewer::handleKeyboardAction(qglviewer::KeyboardAction id) { toggleTextIsEnabled(); break; case qglviewer::EXIT_VIEWER: - saveStateToFileForAllViewers(); qApp->closeAllWindows(); break; case qglviewer::FULL_SCREEN: @@ -3066,27 +3006,27 @@ void CGAL::QGLViewer::toggleCameraMode() { camera()->frame()->stopSpinning(); setMouseBinding(modifiers, ::Qt::LeftButton, qglviewer::CAMERA, qglviewer::MOVE_FORWARD); - setMouseBinding(modifiers, ::Qt::MidButton, qglviewer::CAMERA, qglviewer::LOOK_AROUND); + setMouseBinding(modifiers, ::Qt::MiddleButton, qglviewer::CAMERA, qglviewer::LOOK_AROUND); setMouseBinding(modifiers, ::Qt::RightButton, qglviewer::CAMERA, qglviewer::MOVE_BACKWARD); setMouseBinding(::Qt::Key_R, modifiers, ::Qt::LeftButton, qglviewer::CAMERA, qglviewer::ROLL); setMouseBinding(::Qt::NoModifier, ::Qt::LeftButton, qglviewer::NO_CLICK_ACTION, true); - setMouseBinding(::Qt::NoModifier, ::Qt::MidButton, qglviewer::NO_CLICK_ACTION, true); + setMouseBinding(::Qt::NoModifier, ::Qt::MiddleButton, qglviewer::NO_CLICK_ACTION, true); setMouseBinding(::Qt::NoModifier, ::Qt::RightButton, qglviewer::NO_CLICK_ACTION, true); setWheelBinding(modifiers, qglviewer::CAMERA, qglviewer::MOVE_FORWARD); } else { // Should stop flyTimer. But unlikely and not easy. setMouseBinding(modifiers, ::Qt::LeftButton, qglviewer::CAMERA, qglviewer::ROTATE); - setMouseBinding(modifiers, ::Qt::MidButton, qglviewer::CAMERA, qglviewer::ZOOM); + setMouseBinding(modifiers, ::Qt::MiddleButton, qglviewer::CAMERA, qglviewer::ZOOM); setMouseBinding(modifiers, ::Qt::RightButton, qglviewer::CAMERA, qglviewer::TRANSLATE); setMouseBinding(::Qt::Key_R, modifiers, ::Qt::LeftButton, qglviewer::CAMERA, qglviewer::SCREEN_ROTATE); setMouseBinding(::Qt::NoModifier, ::Qt::LeftButton, qglviewer::ALIGN_CAMERA, true); - setMouseBinding(::Qt::NoModifier, ::Qt::MidButton, qglviewer::SHOW_ENTIRE_SCENE, true); + setMouseBinding(::Qt::NoModifier, ::Qt::MiddleButton, qglviewer::SHOW_ENTIRE_SCENE, true); setMouseBinding(::Qt::NoModifier, ::Qt::RightButton, qglviewer::CENTER_SCENE, true); setWheelBinding(modifiers, qglviewer::CAMERA, qglviewer::ZOOM); @@ -3578,352 +3518,6 @@ void CGAL::QGLViewer::drawGrid(qreal size, int nbSubdivisions) { // S t a t i c m e t h o d s : Q G L V i e w e r P o o l // //////////////////////////////////////////////////////////////////////////////// -/*! saveStateToFile() is called on all the CGAL::QGLViewers using the QGLViewerPool(). - */ -CGAL_INLINE_FUNCTION -void CGAL::QGLViewer::saveStateToFileForAllViewers() { - Q_FOREACH (CGAL::QGLViewer *viewer, CGAL::QGLViewer::QGLViewerPool()) { - if (viewer) - viewer->saveStateToFile(); - } -} - -////////////////////////////////////////////////////////////////////////// -// S a v e s t a t e b e t w e e n s e s s i o n s // -////////////////////////////////////////////////////////////////////////// - -/*! Returns the state file name. Default value is \c .qglviewer.xml. - -This is the name of the XML file where saveStateToFile() saves the viewer state -(camera state, widget geometry, display flags... see domElement()) on exit. Use -restoreStateFromFile() to restore this state later (usually in your init() -method). - -Setting this value to \c QString() will disable the automatic state file -saving that normally occurs on exit. - -If more than one viewer are created by the application, this function will -return a numbered file name (as in ".qglviewer1.xml", ".qglviewer2.xml"... using -QGLViewer::QGLViewerIndex()) for extra viewers. Each viewer will then read back -its own information in restoreStateFromFile(), provided that the viewers are -created in the same order, which is usually the case. */ -CGAL_INLINE_FUNCTION -QString CGAL::QGLViewer::stateFileName() const { - QString name = stateFileName_; - - if (!name.isEmpty() && QGLViewer::QGLViewerIndex(this) > 0) { - QFileInfo fi(name); - if (fi.suffix().isEmpty()) - name += QString::number(QGLViewer::QGLViewerIndex(this)); - else - name = fi.absolutePath() + '/' + fi.completeBaseName() + - QString::number(QGLViewer::QGLViewerIndex(this)) + "." + - fi.suffix(); - } - - return name; -} - -/*! Saves in stateFileName() an XML representation of the CGAL::QGLViewer state, -obtained from domElement(). - -Use restoreStateFromFile() to restore this viewer state. - -This method is automatically called when a viewer is closed (using Escape or -using the window's upper right \c x close button). setStateFileName() to \c -QString() to prevent this. */ -CGAL_INLINE_FUNCTION -void CGAL::QGLViewer::saveStateToFile() { - QString name = stateFileName(); - - if (name.isEmpty()) - return; - - QFileInfo fileInfo(name); - - if (fileInfo.isDir()) { - QMessageBox::warning( - this, tr("Save to file error", "Message box window title"), - tr("State file name (%1) references a directory instead of a file.") - .arg(name)); - return; - } - - const QString dirName = fileInfo.absolutePath(); - if (!QFileInfo(dirName).exists()) { - QDir dir; - if (!(dir.mkdir(dirName))) { - QMessageBox::warning(this, - tr("Save to file error", "Message box window title"), - tr("Unable to create directory %1").arg(dirName)); - return; - } - } - - // Write the DOM tree to file - QFile f(name); - if (f.open(QIODevice::WriteOnly)) { - QTextStream out(&f); - QDomDocument doc("QGLVIEWER"); - doc.appendChild(domElement("CGAL::QGLViewer", doc)); - doc.save(out, 2); - f.flush(); - f.close(); - } else - QMessageBox::warning( - this, tr("Save to file error", "Message box window title"), - tr("Unable to save to file %1").arg(name) + ":\n" + f.errorString()); -} - -/*! Restores the CGAL::QGLViewer state from the stateFileName() file using -initFromDOMElement(). - -States are saved using saveStateToFile(), which is automatically called on -viewer exit. - -Returns \c true when the restoration is successful. Possible problems are an non -existing or unreadable stateFileName() file, an empty stateFileName() or an XML -syntax error. - -A manipulatedFrame() should be defined \e before calling this method, so that -its state can be restored. Initialization code put \e after this function will -override saved values: \code void Viewer::init() -{ -// Default initialization goes here (including the declaration of a possible -manipulatedFrame). - -if (!restoreStateFromFile()) -showEntireScene(); // Previous state cannot be restored: fit camera to scene. - -// Specific initialization that overrides file savings goes here. -} -\endcode */ -CGAL_INLINE_FUNCTION -bool CGAL::QGLViewer::restoreStateFromFile() { - QString name = stateFileName(); - - if (name.isEmpty()) - return false; - - QFileInfo fileInfo(name); - - if (!fileInfo.isFile()) - // No warning since it would be displayed at first start. - return false; - - if (!fileInfo.isReadable()) { - QMessageBox::warning( - this, tr("Problem in state restoration", "Message box window title"), - tr("File %1 is not readable.").arg(name)); - return false; - } - - // Read the DOM tree form file - QFile f(name); - if (f.open(QIODevice::ReadOnly)) { - QDomDocument doc; - doc.setContent(&f); - f.close(); - QDomElement main = doc.documentElement(); - initFromDOMElement(main); - } else { - QMessageBox::warning( - this, tr("Open file error", "Message box window title"), - tr("Unable to open file %1").arg(name) + ":\n" + f.errorString()); - return false; - } - - return true; -} - -/*! Returns an XML \c QDomElement that represents the CGAL::QGLViewer. - -Used by saveStateToFile(). restoreStateFromFile() uses initFromDOMElement() to -restore the CGAL::QGLViewer state from the resulting \c QDomElement. - -\p name is the name of the QDomElement tag. \p doc is the \c QDomDocument -factory used to create QDomElement. - -The created QDomElement contains state values (axisIsDrawn(), FPSIsDisplayed(), -isFullScreen()...), viewer geometry, as well as camera() (see -CGAL::qglviewer::Camera::domElement()) and manipulatedFrame() (if defined, see -CGAL::qglviewer::ManipulatedFrame::domElement()) states. - -Overload this method to add your own attributes to the state file: -\code -CGAL_INLINE_FUNCTION -QDomElement Viewer::domElement(const QString& name, QDomDocument& document) -const -{ -// Creates a custom node for a light -QDomElement de = document.createElement("Light"); -de.setAttribute("state", (lightIsOn()?"on":"off")); -// Note the include of the ManipulatedFrame domElement method. -de.appendChild(lightManipulatedFrame()->domElement("LightFrame", document)); - -// Get default state domElement and append custom node -CGAL_INLINE_FUNCTION -QDomElement res = CGAL::QGLViewer::domElement(name, document); -res.appendChild(de); -return res; -} -\endcode -See initFromDOMElement() for the associated restoration code. - -\attention For the manipulatedFrame(), CGAL::qglviewer::Frame::constraint() and -CGAL::qglviewer::Frame::referenceFrame() are not saved. See -CGAL::qglviewer::Frame::domElement(). */ -CGAL_INLINE_FUNCTION -QDomElement CGAL::QGLViewer::domElement(const QString &name, - QDomDocument &document) const { - QDomElement de = document.createElement(name); - - QDomElement stateNode = document.createElement("State"); - // hasMouseTracking() is not saved - stateNode.appendChild(DomUtils::QColorDomElement( - foregroundColor(), "foregroundColor", document)); - stateNode.appendChild(DomUtils::QColorDomElement( - backgroundColor(), "backgroundColor", document)); - // Revolve or fly camera mode is not saved - de.appendChild(stateNode); - - QDomElement displayNode = document.createElement("Display"); - DomUtils::setBoolAttribute(displayNode, "axisIsDrawn", axisIsDrawn()); - DomUtils::setBoolAttribute(displayNode, "gridIsDrawn", gridIsDrawn()); - DomUtils::setBoolAttribute(displayNode, "FPSIsDisplayed", FPSIsDisplayed()); - DomUtils::setBoolAttribute(displayNode, "cameraIsEdited", cameraIsEdited()); - // textIsEnabled() is not saved - de.appendChild(displayNode); - - QDomElement geometryNode = document.createElement("Geometry"); - DomUtils::setBoolAttribute(geometryNode, "fullScreen", isFullScreen()); - if (isFullScreen()) { - geometryNode.setAttribute("prevPosX", QString::number(prevPos_.x())); - geometryNode.setAttribute("prevPosY", QString::number(prevPos_.y())); - } else { - QWidget *tlw = topLevelWidget(); - geometryNode.setAttribute("width", QString::number(tlw->width())); - geometryNode.setAttribute("height", QString::number(tlw->height())); - geometryNode.setAttribute("posX", QString::number(tlw->pos().x())); - geometryNode.setAttribute("posY", QString::number(tlw->pos().y())); - } - de.appendChild(geometryNode); - - // Restore original Camera zClippingCoefficient before saving. - if (cameraIsEdited()) - camera()->setZClippingCoefficient(previousCameraZClippingCoefficient_); - de.appendChild(camera()->domElement("Camera", document)); - if (cameraIsEdited()) - // #CONNECTION# 5.0 from setCameraIsEdited() - camera()->setZClippingCoefficient(5.0); - - if (manipulatedFrame()) - de.appendChild( - manipulatedFrame()->domElement("ManipulatedFrame", document)); - - return de; -} - -/*! Restores the CGAL::QGLViewer state from a \c QDomElement created by domElement(). - -Used by restoreStateFromFile() to restore the CGAL::QGLViewer state from a file. - -Overload this method to retrieve custom attributes from the CGAL::QGLViewer state -file. This code corresponds to the one given in the domElement() documentation: -\code -CGAL_INLINE_FUNCTION -void Viewer::initFromDOMElement(const QDomElement& element) -{ -// Restore standard state -CGAL_INLINE_FUNCTION -CGAL::QGLViewer::initFromDOMElement(element); - -QDomElement child=element.firstChild().toElement(); -while (!child.isNull()) -{ -if (child.tagName() == "Light") -{ -if (child.hasAttribute("state")) -setLightOn(child.attribute("state").toLower() == "on"); - -// Assumes there is only one child. Otherwise you need to parse child's children -recursively. QDomElement lf = child.firstChild().toElement(); if (!lf.isNull() -&& lf.tagName() == "LightFrame") -lightManipulatedFrame()->initFromDomElement(lf); -} -child = child.nextSibling().toElement(); -} -} -\endcode - -CGAL_INLINE_FUNCTION -See also CGAL::qglviewer::Camera::initFromDOMElement(), -CGAL::qglviewer::ManipulatedFrame::initFromDOMElement(). - -\note The manipulatedFrame() \e pointer is not modified by this method. If -defined, its state is simply set from the \p element values. */ -CGAL_INLINE_FUNCTION -void CGAL::QGLViewer::initFromDOMElement(const QDomElement &element) { - QDomElement child = element.firstChild().toElement(); - bool tmpCameraIsEdited = cameraIsEdited(); - while (!child.isNull()) { - if (child.tagName() == "State") { - // #CONNECTION# default values from defaultConstructor() - // setMouseTracking(DomUtils::boolFromDom(child, "mouseTracking", false)); - // if ((child.attribute("cameraMode", "revolve") == "fly") && - // (cameraIsInRevolveMode())) toggleCameraMode(); - - QDomElement ch = child.firstChild().toElement(); - while (!ch.isNull()) { - if (ch.tagName() == "foregroundColor") - setForegroundColor(DomUtils::QColorFromDom(ch)); - if (ch.tagName() == "backgroundColor") - setBackgroundColor(DomUtils::QColorFromDom(ch)); - ch = ch.nextSibling().toElement(); - } - } - - if (child.tagName() == "Display") { - // #CONNECTION# default values from defaultConstructor() - setAxisIsDrawn(DomUtils::boolFromDom(child, "axisIsDrawn", false)); - setGridIsDrawn(DomUtils::boolFromDom(child, "gridIsDrawn", false)); - setFPSIsDisplayed(DomUtils::boolFromDom(child, "FPSIsDisplayed", false)); - } - - if (child.tagName() == "Geometry") { - setFullScreen(DomUtils::boolFromDom(child, "fullScreen", false)); - - if (!isFullScreen()) - { - int width = DomUtils::intFromDom(child, "width", 600); - int height = DomUtils::intFromDom(child, "height", 400); - topLevelWidget()->resize(width, height); - camera()->setScreenWidthAndHeight(this->width(), this->height()); - - QPoint pos; - pos.setX(DomUtils::intFromDom(child, "posX", 0)); - pos.setY(DomUtils::intFromDom(child, "posY", 0)); - topLevelWidget()->move(pos); - } - } - - child = child.nextSibling().toElement(); - } - - // The Camera always stores its "real" zClippingCoef in domElement(). If it is - // edited, its "real" coef must be saved and the coef set to 5.0, as is done - // in setCameraIsEdited(). BUT : Camera and Display are read in an arbitrary - // order. We must initialize Camera's "real" coef BEFORE calling - // setCameraIsEdited. Hence this temp cameraIsEdited and delayed call - cameraIsEdited_ = tmpCameraIsEdited; - if (cameraIsEdited_) { - previousCameraZClippingCoefficient_ = camera()->zClippingCoefficient(); - // #CONNECTION# 5.0 from setCameraIsEdited. - camera()->setZClippingCoefficient(5.0); - } -} - - CGAL_INLINE_FUNCTION void CGAL::QGLViewer::copyBufferToTexture(GLint , GLenum ) { diff --git a/GraphicsView/include/CGAL/Qt/quaternion.h b/GraphicsView/include/CGAL/Qt/quaternion.h index ae9fc6365d6..5322db4bea9 100644 --- a/GraphicsView/include/CGAL/Qt/quaternion.h +++ b/GraphicsView/include/CGAL/Qt/quaternion.h @@ -300,12 +300,6 @@ public: static Quaternion randomQuaternion(); //@} - /*! @name XML representation */ - //@{ - explicit Quaternion(const QDomElement &element); - QDomElement domElement(const QString &name, QDomDocument &document) const; - void initFromDOMElement(const QDomElement &element); -//@} #ifdef DOXYGEN /*! @name Output stream */ diff --git a/GraphicsView/include/CGAL/Qt/quaternion_impl.h b/GraphicsView/include/CGAL/Qt/quaternion_impl.h index 6f5f8fff5fa..bd719acfbfe 100644 --- a/GraphicsView/include/CGAL/Qt/quaternion_impl.h +++ b/GraphicsView/include/CGAL/Qt/quaternion_impl.h @@ -20,7 +20,6 @@ #endif #include #include -#include #include // RAND_MAX // All the methods are declared inline in Quaternion.h @@ -211,71 +210,6 @@ qreal Quaternion::angle() const { return (angle <= CGAL_PI) ? angle : 2.0 * CGAL_PI - angle; } -/*! Returns an XML \c QDomElement that represents the Quaternion. - - \p name is the name of the QDomElement tag. \p doc is the \c QDomDocument - factory used to create QDomElement. - - When output to a file, the resulting QDomElement will look like: - \code - - \endcode - - Use initFromDOMElement() to restore the Quaternion state from the resulting \c - QDomElement. See also the Quaternion(const QDomElement&) constructor. - -CGAL_INLINE_FUNCTION - See the Vec::domElement() documentation for a complete QDomDocument creation - and saving example. - -CGAL_INLINE_FUNCTION - See also Frame::domElement(), Camera::domElement(), -CGAL_INLINE_FUNCTION - KeyFrameInterpolator::domElement()... */ -CGAL_INLINE_FUNCTION -QDomElement Quaternion::domElement(const QString &name, - QDomDocument &document) const { - QDomElement de = document.createElement(name); - de.setAttribute("q0", QString::number(q[0])); - de.setAttribute("q1", QString::number(q[1])); - de.setAttribute("q2", QString::number(q[2])); - de.setAttribute("q3", QString::number(q[3])); - return de; -} - -/*! Restores the Quaternion state from a \c QDomElement created by domElement(). - - The \c QDomElement should contain the \c q0, \c q1 , \c q2 and \c q3 - attributes. If one of these attributes is missing or is not a number, a warning - is displayed and these fields are respectively set to 0.0, 0.0, 0.0 and 1.0 - (identity Quaternion). - - See also the Quaternion(const QDomElement&) constructor. */ -CGAL_INLINE_FUNCTION -void Quaternion::initFromDOMElement(const QDomElement &element) { - Quaternion q(element); - *this = q; -} - -/*! Constructs a Quaternion from a \c QDomElement representing an XML code of - the form \code< anyTagName q0=".." q1=".." q2=".." q3=".." />\endcode - - If one of these attributes is missing or is not a number, a warning is - displayed and the associated value is respectively set to 0, 0, 0 and 1 - (identity Quaternion). - - See also domElement() and initFromDOMElement(). */ -CGAL_INLINE_FUNCTION -Quaternion::Quaternion(const QDomElement &element) { - QStringList attribute; - attribute << "q0" - << "q1" - << "q2" - << "q3"; - for (int i = 0; i < attribute.size(); ++i) - q[i] = DomUtils::qrealFromDom(element, attribute[i], ((i < 3) ? 0.0 : 1.0)); -} - /*! Returns the Quaternion associated 4x4 OpenGL rotation matrix. Use \c glMultMatrixd(q.matrix()) to apply the rotation represented by diff --git a/GraphicsView/include/CGAL/Qt/vec.h b/GraphicsView/include/CGAL/Qt/vec.h index 615df43987e..903db34f0f9 100644 --- a/GraphicsView/include/CGAL/Qt/vec.h +++ b/GraphicsView/include/CGAL/Qt/vec.h @@ -16,8 +16,6 @@ #include #include -#include - // Included by all files as vec.h is at the end of the include hierarchy #include @@ -334,12 +332,6 @@ Normalizing a null vector will result in \c NaN values. */ void projectOnPlane(const Vec &normal); //@} - /*! @name XML representation */ - //@{ - explicit Vec(const QDomElement &element); - QDomElement domElement(const QString &name, QDomDocument &document) const; - void initFromDOMElement(const QDomElement &element); -//@} #ifdef DOXYGEN /*! @name Output stream */ diff --git a/GraphicsView/include/CGAL/Qt/vec_impl.h b/GraphicsView/include/CGAL/Qt/vec_impl.h index 84f8296159f..4ab54771d68 100644 --- a/GraphicsView/include/CGAL/Qt/vec_impl.h +++ b/GraphicsView/include/CGAL/Qt/vec_impl.h @@ -20,7 +20,6 @@ #endif #include -#include // Most of the methods are declared inline in vec.h @@ -72,100 +71,6 @@ Vec Vec::orthogonalVec() const { return Vec(-y, x, 0.0); } -/*! Constructs a Vec from a \c QDomElement representing an XML code of the form - \code< anyTagName x=".." y=".." z=".." />\endcode - -If one of these attributes is missing or is not a number, a warning is displayed -and the associated value is set to 0.0. - -See also domElement() and initFromDOMElement(). */ -CGAL_INLINE_FUNCTION -Vec::Vec(const QDomElement &element) { - QStringList attribute; - attribute << "x" - << "y" - << "z"; - for (int i = 0; i < attribute.size(); ++i) -#ifdef QGLVIEWER_UNION_NOT_SUPPORTED - this->operator[](i) = DomUtils::qrealFromDom(element, attribute[i], 0.0); -#else - v_[i] = DomUtils::qrealFromDom(element, attribute[i], 0.0); -#endif -} - -/*! Returns an XML \c QDomElement that represents the Vec. - - \p name is the name of the QDomElement tag. \p doc is the \c QDomDocument - factory used to create QDomElement. - - When output to a file, the resulting QDomElement will look like: - \code - - \endcode - - Use initFromDOMElement() to restore the Vec state from the resulting \c - QDomElement. See also the Vec(const QDomElement&) constructor. - - Here is complete example that creates a QDomDocument and saves it into a file: - \code - Vec sunPos; - QDomDocument document("myDocument"); - QDomElement sunElement = document.createElement("Sun"); - document.appendChild(sunElement); - sunElement.setAttribute("brightness", sunBrightness()); - sunElement.appendChild(sunPos.domElement("sunPosition", document)); - // Other additions to the document hierarchy... - - // Save doc document - QFile f("myFile.xml"); - if (f.open(IO_WriteOnly)) - { - QTextStream out(&f); - document.save(out, 2); - f.close(); - } - \endcode - -CGAL_INLINE_FUNCTION - See also Quaternion::domElement(), Frame::domElement(), Camera::domElement()... - */ -CGAL_INLINE_FUNCTION -QDomElement Vec::domElement(const QString &name, QDomDocument &document) const { - QDomElement de = document.createElement(name); - de.setAttribute("x", QString::number(x)); - de.setAttribute("y", QString::number(y)); - de.setAttribute("z", QString::number(z)); - return de; -} - -/*! Restores the Vec state from a \c QDomElement created by domElement(). - - The \c QDomElement should contain \c x, \c y and \c z attributes. If one of - these attributes is missing or is not a number, a warning is displayed and the - associated value is set to 0.0. - - To restore the Vec state from an xml file, use: - \code - // Load DOM from file - QDomDocument doc; - QFile f("myFile.xml"); - if (f.open(IO_ReadOnly)) - { - doc.setContent(&f); - f.close(); - } - // Parse the DOM tree and initialize - QDomElement main=doc.documentElement(); - myVec.initFromDOMElement(main); - \endcode - - See also the Vec(const QDomElement&) constructor. */ -CGAL_INLINE_FUNCTION -void Vec::initFromDOMElement(const QDomElement &element) { - const Vec v(element); - *this = v; -} - CGAL_INLINE_FUNCTION std::ostream &operator<<(std::ostream &o, const Vec &v) { return o << v.x << '\t' << v.y << '\t' << v.z; diff --git a/GraphicsView/src/CGAL_Qt5/CMakeLists.txt b/GraphicsView/src/CGAL_Qt5/CMakeLists.txt deleted file mode 100644 index 14204398dd3..00000000000 --- a/GraphicsView/src/CGAL_Qt5/CMakeLists.txt +++ /dev/null @@ -1,66 +0,0 @@ -message("Configuring libCGAL_Qt5") - -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() - -include(CGAL_SetupCGAL_Qt5Dependencies) - -if(CGAL_Qt5_MISSING_DEPS) - message( - STATUS - "libCGAL_Qt5 is missing the dependencies: ${CGAL_Qt5_MISSING_DEPS} cannot be configured." - ) - return() -endif() - -message(STATUS "USING Qt5_VERSION = '${Qt5Core_VERSION_STRING}'") -if(NOT CGAL_HEADER_ONLY) - collect_cgal_library( - CGAL_Qt5 - "${_CGAL_Qt5_MOC_FILES_private};${_CGAL_Qt5_RESOURCE_FILES_private};${_CGAL_Qt5_UI_FILES}" - ) - target_include_directories(CGAL_Qt5 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -else() - collect_cgal_library(CGAL_Qt5 "") -endif() - -if(CGAL_HEADER_ONLY) - set(keyword "INTERFACE") -endif() - -cgal_setup_cgal_qt5_dependencies(CGAL_Qt5 ${keyword}) - -if(COMMAND add_config_flag) - set(CGAL_HAS_QT5 TRUE) - add_config_flag(CGAL_HAS_QT5) -endif() - -install( - DIRECTORY "../../include/CGAL/Qt/" - DESTINATION "${CGAL_INSTALL_INC_DIR}/CGAL/Qt" - COMPONENT CGAL_Qt5) -if(CGAL_HEADER_ONLY) - if(EXISTS ${CGAL_MODULES_DIR}/demo/resources) - install( - DIRECTORY "${CGAL_MODULES_DIR}/demo/resources/" - DESTINATION "${CGAL_INSTALL_CMAKE_DIR}/demo/resources" - COMPONENT CGAL_Qt5) - install( - DIRECTORY "${CGAL_MODULES_DIR}/demo/icons/" - DESTINATION "${CGAL_INSTALL_CMAKE_DIR}/demo/icons" - COMPONENT CGAL_Qt5) - else() - install( - DIRECTORY "../../demo/resources/" - DESTINATION "${CGAL_INSTALL_CMAKE_DIR}/demo/resources" - COMPONENT CGAL_Qt5) - install( - DIRECTORY "../../demo/icons/" - DESTINATION "${CGAL_INSTALL_CMAKE_DIR}/demo/icons" - COMPONENT CGAL_Qt5) - endif() -endif() - -message("libCGAL_Qt5 is configured") diff --git a/GraphicsView/src/CGAL_Qt5/DemosMainWindow.cpp b/GraphicsView/src/CGAL_Qt5/DemosMainWindow.cpp deleted file mode 100644 index cc6726f3492..00000000000 --- a/GraphicsView/src/CGAL_Qt5/DemosMainWindow.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2008 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) : Andreas Fabri -// Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include -#include -#include -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/GraphicsView.qtmoc.cmake b/GraphicsView/src/CGAL_Qt5/GraphicsView.qtmoc.cmake deleted file mode 100644 index 95ba7c31f5a..00000000000 --- a/GraphicsView/src/CGAL_Qt5/GraphicsView.qtmoc.cmake +++ /dev/null @@ -1,8 +0,0 @@ -# moc files that are compiled directly as cpp files -qt5_wrap_cpp(mocfiles ../../include/CGAL/Qt/GraphicsViewNavigation.h - ../../include/CGAL/Qt/DemosMainWindow.h - ../../include/CGAL/Qt/GraphicsItem.h - ../../include/CGAL/Qt/GraphicsViewInput.h) - -# qrc files (resources files, that contain icons, at least) -qt5_add_resources ( RESOURCE_FILES ../../demo/resources/CGAL.qrc ../../demo/icons/Input.qrc ../../demo/icons/File.qrc ../../demo/icons/Triangulation_2.qrc) diff --git a/GraphicsView/src/CGAL_Qt5/GraphicsViewNavigation.cpp b/GraphicsView/src/CGAL_Qt5/GraphicsViewNavigation.cpp deleted file mode 100644 index fac60c7342d..00000000000 --- a/GraphicsView/src/CGAL_Qt5/GraphicsViewNavigation.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2008 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) : Andreas Fabri -// Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/GraphicsViewPolylineInput.cpp b/GraphicsView/src/CGAL_Qt5/GraphicsViewPolylineInput.cpp deleted file mode 100644 index 9876e5ce76a..00000000000 --- a/GraphicsView/src/CGAL_Qt5/GraphicsViewPolylineInput.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2008 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) : Andreas Fabri -// Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/camera.cpp b/GraphicsView/src/CGAL_Qt5/camera.cpp deleted file mode 100644 index 278cd06dfd2..00000000000 --- a/GraphicsView/src/CGAL_Qt5/camera.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2018 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 -// -// Author(s) : Maxime Gimeno - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/constraint.cpp b/GraphicsView/src/CGAL_Qt5/constraint.cpp deleted file mode 100644 index 3c052878a79..00000000000 --- a/GraphicsView/src/CGAL_Qt5/constraint.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2018 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 -// -// Author(s) : Maxime Gimeno - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/debug.cpp b/GraphicsView/src/CGAL_Qt5/debug.cpp deleted file mode 100644 index 59165a240b3..00000000000 --- a/GraphicsView/src/CGAL_Qt5/debug.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2008 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) : Andreas Fabri -// Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/frame.cpp b/GraphicsView/src/CGAL_Qt5/frame.cpp deleted file mode 100644 index e1f149f35bd..00000000000 --- a/GraphicsView/src/CGAL_Qt5/frame.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2018 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 -// -// Author(s) : Maxime Gimeno - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/keyFrameInterpolator.cpp b/GraphicsView/src/CGAL_Qt5/keyFrameInterpolator.cpp deleted file mode 100644 index 0ddb05d0aa2..00000000000 --- a/GraphicsView/src/CGAL_Qt5/keyFrameInterpolator.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2018 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 -// -// Author(s) : Maxime Gimeno - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/manipulatedCameraFrame.cpp b/GraphicsView/src/CGAL_Qt5/manipulatedCameraFrame.cpp deleted file mode 100644 index 5d24867991b..00000000000 --- a/GraphicsView/src/CGAL_Qt5/manipulatedCameraFrame.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2018 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 -// -// Author(s) : Maxime Gimeno - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/manipulatedFrame.cpp b/GraphicsView/src/CGAL_Qt5/manipulatedFrame.cpp deleted file mode 100644 index 99a10c2d700..00000000000 --- a/GraphicsView/src/CGAL_Qt5/manipulatedFrame.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2018 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 -// -// Author(s) : Maxime Gimeno - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/mouseGrabber.cpp b/GraphicsView/src/CGAL_Qt5/mouseGrabber.cpp deleted file mode 100644 index e92c7af56ea..00000000000 --- a/GraphicsView/src/CGAL_Qt5/mouseGrabber.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2018 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 -// -// Author(s) : Maxime Gimeno - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/qglviewer.cpp b/GraphicsView/src/CGAL_Qt5/qglviewer.cpp deleted file mode 100644 index 3a2134fbc3a..00000000000 --- a/GraphicsView/src/CGAL_Qt5/qglviewer.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2018 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 -// -// Author(s) : Maxime Gimeno - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/quaternion.cpp b/GraphicsView/src/CGAL_Qt5/quaternion.cpp deleted file mode 100644 index b9ee4d5fd1b..00000000000 --- a/GraphicsView/src/CGAL_Qt5/quaternion.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2018 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 -// -// Author(s) : Maxime Gimeno - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/resources.cpp b/GraphicsView/src/CGAL_Qt5/resources.cpp deleted file mode 100644 index 217660d9c2a..00000000000 --- a/GraphicsView/src/CGAL_Qt5/resources.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 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 - -#ifndef CGAL_HEADER_ONLY - -#include -#include -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/utility.cpp b/GraphicsView/src/CGAL_Qt5/utility.cpp deleted file mode 100644 index 247d18fc00a..00000000000 --- a/GraphicsView/src/CGAL_Qt5/utility.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2008 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) : Andreas Fabri -// Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/GraphicsView/src/CGAL_Qt5/vec.cpp b/GraphicsView/src/CGAL_Qt5/vec.cpp deleted file mode 100644 index 85a4f8823b1..00000000000 --- a/GraphicsView/src/CGAL_Qt5/vec.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2018 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 -// -// Author(s) : Maxime Gimeno - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/HalfedgeDS/test/HalfedgeDS/test_hds_range_based_loops.cpp b/HalfedgeDS/test/HalfedgeDS/test_hds_range_based_loops.cpp index 455367d6836..893d5e40b0e 100644 --- a/HalfedgeDS/test/HalfedgeDS/test_hds_range_based_loops.cpp +++ b/HalfedgeDS/test/HalfedgeDS/test_hds_range_based_loops.cpp @@ -47,7 +47,7 @@ void test_const_vertex_handles( auto lit = hds_list.vertices_begin(); assert(hds_list.vertex_handles().size() == 1); - for (const auto vh : hds_list.vertex_handles()) { + for (const auto& vh : hds_list.vertex_handles()) { assert(vh == lit); assert(vh->point() == lit->point()); assert(vh->halfedge() == lit->halfedge()); @@ -57,7 +57,7 @@ void test_const_vertex_handles( auto vit = hds_vector.vertices_begin(); assert(hds_vector.vertex_handles().size() == 1); - for (const auto vh : hds_vector.vertex_handles()) { + for (const auto& vh : hds_vector.vertex_handles()) { assert(vh == vit); assert(vh->point() == vit->point()); assert(vh->halfedge() == vit->halfedge()); @@ -97,7 +97,7 @@ void test_const_face_handles( auto lit = hds_list.faces_begin(); assert(hds_list.face_handles().size() == 2); - for (const auto fh : hds_list.face_handles()) { + for (const auto& fh : hds_list.face_handles()) { assert(fh == lit); assert(fh->plane() == lit->plane()); assert(fh->halfedge() == lit->halfedge()); @@ -107,7 +107,7 @@ void test_const_face_handles( auto vit = hds_vector.faces_begin(); assert(hds_vector.face_handles().size() == 2); - for (const auto fh : hds_vector.face_handles()) { + for (const auto& fh : hds_vector.face_handles()) { assert(fh == vit); assert(fh->plane() == vit->plane()); assert(fh->halfedge() == vit->halfedge()); @@ -147,7 +147,7 @@ void test_const_halfedge_handles( auto lit = hds_list.halfedges_begin(); assert(hds_list.halfedge_handles().size() == 2); - for (const auto hh : hds_list.halfedge_handles()) { + for (const auto& hh : hds_list.halfedge_handles()) { assert(hh == lit); assert(hh->face() == lit->face()); assert(hh->vertex() == lit->vertex()); @@ -157,7 +157,7 @@ void test_const_halfedge_handles( auto vit = hds_vector.halfedges_begin(); assert(hds_vector.halfedge_handles().size() == 2); - for (const auto hh : hds_vector.halfedge_handles()) { + for (const auto& hh : hds_vector.halfedge_handles()) { assert(hh == vit); assert(hh->face() == vit->face()); assert(hh->vertex() == vit->vertex()); diff --git a/Heat_method_3/examples/Heat_method_3/CMakeLists.txt b/Heat_method_3/examples/Heat_method_3/CMakeLists.txt index 66027c7ff32..c7811372e61 100644 --- a/Heat_method_3/examples/Heat_method_3/CMakeLists.txt +++ b/Heat_method_3/examples/Heat_method_3/CMakeLists.txt @@ -23,9 +23,9 @@ if(NOT Boost_FOUND) endif() find_package(Eigen3 3.3.0) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) -if(NOT TARGET CGAL::Eigen_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library (3.3 or greater), and will not be compiled." @@ -42,11 +42,11 @@ include_directories(BEFORE include) include(CGAL_CreateSingleSourceCGALProgram) create_single_source_cgal_program("heat_method.cpp") -target_link_libraries(heat_method PUBLIC CGAL::Eigen_support) +target_link_libraries(heat_method PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_polyhedron.cpp") -target_link_libraries(heat_method_polyhedron PUBLIC CGAL::Eigen_support) +target_link_libraries(heat_method_polyhedron PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_surface_mesh.cpp") -target_link_libraries(heat_method_surface_mesh PUBLIC CGAL::Eigen_support) +target_link_libraries(heat_method_surface_mesh PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_surface_mesh_direct.cpp") target_link_libraries(heat_method_surface_mesh_direct - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) diff --git a/Heat_method_3/test/Heat_method_3/CMakeLists.txt b/Heat_method_3/test/Heat_method_3/CMakeLists.txt index 962f84378b1..6641b2542ba 100644 --- a/Heat_method_3/test/Heat_method_3/CMakeLists.txt +++ b/Heat_method_3/test/Heat_method_3/CMakeLists.txt @@ -23,9 +23,9 @@ if(NOT Boost_FOUND) endif() find_package(Eigen3 3.3.0) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) -if(NOT TARGET CGAL::Eigen_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library (3.3 or greater), and will not be compiled." @@ -42,9 +42,9 @@ include_directories(BEFORE include) include(CGAL_CreateSingleSourceCGALProgram) create_single_source_cgal_program("heat_method_concept.cpp") -target_link_libraries(heat_method_concept PUBLIC CGAL::Eigen_support) +target_link_libraries(heat_method_concept PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_surface_mesh_test.cpp") -target_link_libraries(heat_method_surface_mesh_test PUBLIC CGAL::Eigen_support) +target_link_libraries(heat_method_surface_mesh_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_surface_mesh_direct_test.cpp") target_link_libraries(heat_method_surface_mesh_direct_test - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt index 7e9f118ad9d..be9c9bbc48e 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt @@ -17,21 +17,25 @@ find_package(LEDA QUIET) # Find Qt5 itself find_package(Qt5 QUIET COMPONENTS OpenGL Gui) + if(CGAL_Qt5_FOUND AND Qt5_FOUND AND (CGAL_Core_FOUND OR LEDA_FOUND)) - include_directories(BEFORE ./ ./include) # ui files, created with Qt Designer qt5_wrap_ui(UIS HDT2.ui) qt5_add_resources(RESOURCE_FILES resources/Delaunay_triangulation_2.qrc) # cpp files - add_executable(HDT2 HDT2.cpp ${CGAL_Qt5_RESOURCE_FILES} ${RESOURCE_FILES} - ${UIS}) - add_to_cached_list(CGAL_EXECUTABLE_TARGETS HDT2) - target_link_libraries(HDT2 CGAL::CGAL CGAL::CGAL_Qt5 CGAL::CGAL_Core - Qt5::Widgets) + add_executable ( HDT2 HDT2.cpp ${CGAL_Qt5_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) + if(CGAL_Core_FOUND) + target_link_libraries ( HDT2 CGAL::CGAL_Core) + else() + target_link_libraries ( HDT2 ${LEDA_LIBRARIES}) + endif() else() message( STATUS diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp index 9fbb9e6d730..1d32eba2c8f 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp @@ -11,7 +11,7 @@ #else #include #include - #include + #include "internal/Qt/HyperbolicPainterOstream.h" #endif #include 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 c07639e7c08..e91823b0dae 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 @@ -11,16 +11,18 @@ The class `Hyperbolic_Delaunay_triangulation_2` is the main class of the 2D Hype It is designed to represent Delaunay triangulations of sets of points in the hyperbolic plane. The hyperbolic plane is represented in the Poincaré disk model. -\tparam Gt must be a model of `HyperbolicDelaunayTriangulationTraits_2`. -\tparam Tds must be a model of `TriangulationDataStructure_2`. By default, this parameter is instantiated with -`Triangulation_data_structure_2< Triangulation_vertex_base_2, Hyperbolic_triangulation_face_base_2 >` +\tparam Gt is the geometric traits class and must be a model of `HyperbolicDelaunayTriangulationTraits_2`. +\tparam Tds is the triangulation graph data structure and must be a model of `TriangulationDataStructure_2` +whose vertex and face are models of `TriangulationVertexBase_2` and `HyperbolicTriangulationFaceBase_2`, respectively. +It defaults to: +\code +CGAL::Triangulation_data_structure_2< + CGAL::Triangulation_vertex_base_2, + CGAL::Hyperbolic_triangulation_face_base_2 > +\endcode -\sa `HyperbolicDelaunayTriangulationTraits_2` -\sa `TriangulationDataStructure_2` \sa `Delaunay_triangulation_2` - */ - template < class Gt, class Tds > class Hyperbolic_Delaunay_triangulation_2: private Delaunay_triangulation_2 { 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 744a7872854..45675b33aa7 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 @@ -7,7 +7,7 @@ \cgalRefines TriangulationFaceBase_2 -The concept HyperbolicTriangulationFaceBase_2 describes the requirements for the base +The concept `HyperbolicTriangulationFaceBase_2` describes the requirements for the base face class of a hyperbolic triangulation data structure. This concept provides an interface for the functionality needed in faces to compute 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 6c29153fc50..6ef7fadd068 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 @@ -104,11 +104,11 @@ parameters: primitives. The requirements on this first template parameter are described by the concept `HyperbolicDelaunayTriangulationTraits_2`, which refines - `DelaunayTriangulationTraits_2`. + `DelaunayTriangulationTraits_2`.
  • A triangulation data structure parameter, for which the - requirements are described by the concept - `TriangulationDataStructure_2`. The default for this second template parameter - is `Triangulation_data_structure_2< Triangulation_vertex_base_2, Hyperbolic_triangulation_face_base_2 >`. + requirements are described by the concept `TriangulationDataStructure_2`. + The vertex and face of this triangulation data structure must be models of + the concepts `TriangulationVertexBase_2` and `HyperbolicTriangulationFaceBase_2`, respectively.
  • Two models of the concept `HyperbolicDelaunayTriangulationTraits_2` diff --git a/Inscribed_areas/include/CGAL/Extremal_polygon_traits_2.h b/Inscribed_areas/include/CGAL/Extremal_polygon_traits_2.h index 64f3ac2dd1d..a85e9a76f47 100644 --- a/Inscribed_areas/include/CGAL/Extremal_polygon_traits_2.h +++ b/Inscribed_areas/include/CGAL/Extremal_polygon_traits_2.h @@ -19,7 +19,6 @@ #include #include #include -#include #include namespace CGAL { @@ -47,7 +46,7 @@ struct Extremal_polygon_area_traits_2 { }; typedef Kgon_triangle_area Baseop; - typedef boost::function2 Operation; + typedef std::function Operation; Extremal_polygon_area_traits_2() {} Extremal_polygon_area_traits_2(const K& k_) : k(k_) {} @@ -60,7 +59,7 @@ struct Extremal_polygon_area_traits_2 { Operation operation( const Point_2& p) const - { return boost::bind(Baseop(k), _1, _2, p); } + { return [&p, this](const Point_2& p1, const Point_2& p2){ return Baseop(this->k)(p1, p2, p);}; } template < class RandomAccessIC, class OutputIterator > OutputIterator @@ -184,7 +183,7 @@ struct Extremal_polygon_perimeter_traits_2 { }; typedef Kgon_triangle_perimeter Baseop; - typedef boost::function2 Operation; + typedef std::function Operation; Extremal_polygon_perimeter_traits_2() {} Extremal_polygon_perimeter_traits_2(const K& k_) : k(k_) {} @@ -197,7 +196,7 @@ struct Extremal_polygon_perimeter_traits_2 { Operation operation( const Point_2& p) const - { return boost::bind(Baseop(k), _1, _2, p); } + { return [this,&p](const Point_2& p1, const Point_2& p2){ return Baseop(this->k)(p1,p2,p); }; } template < class RandomAccessIC, class OutputIterator > OutputIterator @@ -234,10 +233,9 @@ struct Extremal_polygon_perimeter_traits_2 { max_element( points_begin + 1, points_end, - boost::bind( - less< FT >(), - boost::bind(operation(points_begin[0]), _1, points_begin[0]), - boost::bind(operation(points_begin[0]), _2, points_begin[0])))); + [points_begin, this](const Point_2& p1, const Point_2& p2) + { return less< FT >()( this->operation(points_begin[0])(p1, points_begin[0]), + this->operation(points_begin[0])(p2, points_begin[0])); } )); // give result: max_perimeter = operation(*points_begin)(*maxi, *points_begin); diff --git a/Inscribed_areas/include/CGAL/extremal_polygon_2.h b/Inscribed_areas/include/CGAL/extremal_polygon_2.h index 33c6a126f9a..2cd09fdd7c0 100644 --- a/Inscribed_areas/include/CGAL/extremal_polygon_2.h +++ b/Inscribed_areas/include/CGAL/extremal_polygon_2.h @@ -25,8 +25,6 @@ #include #include #include -#include -#include namespace CGAL { //!!! This will eventually be integrated into function_objects.h @@ -443,8 +441,8 @@ extremal_polygon_2( k, CGAL::transform_iterator( o, - boost::make_adaptable(boost::bind(Index_operator< RandomAccessIC, int, Point_2 >(), - points_begin, _1))), + std::function([points_begin](int i) + { return Index_operator< RandomAccessIC, int, Point_2 >()(points_begin, i); })), t); } diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 1bd032a7859..5787fc1441b 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -25,6 +25,25 @@ A comprehensive list of the supported file formats is available in the Stream_su - Added a filtering mechanism so that costly tests get only applied to the next candidate for the edge collapse. - Added the class `Polyhedral_envelope_filter` that enables to perform mesh simplification inside a polyhedral envelope of the input mesh. +### Surface Mesh Topology +- Added the function `CGAL::Surface_mesh_topology::Curves_on_surface_topology::is_homotopic_to_simple_cycle()`, which can be used to determine whehter a closed path + on a surface mesh can be continously transformed to a cycle without self intersection. + +### 2D Regularized Boolean Set Operations +- Added documentation for the free functions `oriented_side(const Point_2& p, ....)` that accept a point and a polygon, and improved the documentation of all other functions + +### [2D Polyline Simplification](https://doc.cgal.org/5.3/Manual/packages.html#PkgPolylineSimplification2) +- When polylines have common subsequences of vertices these subsequences may be simplifified simultaneously. + +### [2D and 3D Alpha Shapes](https://doc.cgal.org/5.3/Manual/packages.html#PkgAlphaShapes2) +- The following deprecated classes have been removed: `Alpha_shape_euclidean_traits_2`, + `Weighted_alpha_shape_euclidean_traits_2`, `Alpha_shape_euclidean_traits_3`, and + `Weighted_alpha_shape_euclidean_traits_3`. All CGAL kernel can be used directly as models + of the concepts of the 2D and 3D Alpha Shape packages. + +### [dD Triangulations](https://doc.cgal.org/5.3/Manual/packages.html#PkgTriangulations) +- Added the function `insert_if_in_star()` to the class `CGAL::Regular_triangulation`, which enables users to insert a point `p` in a regular triangulation on the condition that `p` appears post-insertion in the star of a user-specified, existing vertex. + [Release 5.2](https://github.com/CGAL/cgal/releases/tag/v5.2) ----------- diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 4210e21f2d1..b9125e65c8c 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -4,33 +4,18 @@ # ${CMAKE_SOURCE_DIR} and to the root binary directory of the project as # ${CMAKE_BINARY_DIR} or ${CMAKE_BINARY_DIR}. if(NOT PROJECT_NAME) - cmake_minimum_required(VERSION 3.1...3.15) + cmake_minimum_required(VERSION 3.12...3.18) project(CGAL CXX C) endif() -if(POLICY CMP0056) - # https://cmake.org/cmake/help/v3.2/policy/CMP0056.html - # - # Fix a bug: `try_compile` should use `CMAKE_EXE_LINKER_FLAGS`. - # That variable can contain important flags like - # - # -static-libstdc++ -static-libgcc - # - cmake_policy(SET CMP0056 NEW) -endif() - +# Fix a bug: `try_compile` should use `CMAKE_EXE_LINKER_FLAGS`. +# That variable can contain important flags like +# +# -static-libstdc++ -static-libgcc +# # Use GNUInstallDirs to get canonical paths include(GNUInstallDirs) - #-------------------------------------------------------------------------------------------------- -# -# -= HEADER ONLY =- -# -#-------------------------------------------------------------------------------------------------- -option(CGAL_HEADER_ONLY - "Enable header-only mode of CGAL (no compilation of CGAL libraries)" - TRUE) - #-------------------------------------------------------------------------------------------------- # # -= PACKAGE SETUP =- @@ -125,11 +110,6 @@ else(CGAL_BRANCH_BUILD) # Enable testing with BUILD_TESTING option(BUILD_TESTING "Build the testing tree." OFF) - if(BUILD_TESTING AND NOT POLICY CMP0064) - message( - FATAL_ERROR "CGAL support of CTest requires CMake version 3.4 or later. -The variable BUILD_TESTING must be set of OFF.") - endif() if(BUILD_TESTING) enable_testing() endif() @@ -416,9 +396,9 @@ set(CGAL_ImageIO_SOVERSION "14.0.0") set(CGAL_Qt5_SONAME_VERSION "14") set(CGAL_Qt5_SOVERSION "14.0.0") -message(STATUS "CGAL_SONAME_VERSION=${CGAL_SONAME_VERSION}") -message(STATUS "CGAL_SOVERSION =${CGAL_SOVERSION}") -set(CGAL_BUILDING_LIBS TRUE) +message( STATUS "CGAL_SONAME_VERSION=${CGAL_SONAME_VERSION}" ) +message( STATUS "CGAL_SOVERSION =${CGAL_SOVERSION}" ) + set(CGAL_VERSION_DIR CGAL-${CGAL_VERSION}) set(CGAL_MODULES_REL_DIR cmake/modules) @@ -577,34 +557,6 @@ endif() message("== Detect external libraries ==") -# this is the place to tell which external libs are supporting -# Remarks: -# External libs configured when Qt5 lib of cgal are required -# Coin is used in KDS, but no FindCoin or FindCOIN exists -# There exists FindIPE, FindMKL, but they are only used to support supporting libs -list( - INSERT - CGAL_SUPPORTING_3RD_PARTY_LIBRARIES - 0 - GMP - MPFR - ZLIB - OpenGL - LEDA - MPFI - RS - RS3 - OpenNL - Eigen3 - ESBTL - Coin3D - NTL - IPE) - -# Where CMake is run several times, to avoid duplicates -list(REMOVE_DUPLICATES CGAL_SUPPORTING_3RD_PARTY_LIBRARIES) -hide_variable(CGAL_SUPPORTING_3RD_PARTY_LIBRARIES) - # set some to have special prefix macro(set_special_prefix library prefix) set(SPECIAL_PREFIXES @@ -638,13 +590,8 @@ if(CGAL_DISABLE_GMP) unset(MPFR_FOUND CACHE) unset(WITH_CGAL_Core) unset(WITH_CGAL_Core CACHE) - unset(WITH_GMP) - unset(WITH_GMP CACHE) unset(CGAL_USE_GMP) unset(CGAL_USE_GMP CACHE) - unset(WITH_MPFR) - unset(WITH_MPFR CACHE) - # Nasty trick to make sure is not used when CGAL_DISABLE_GMP is TRUE file(WRITE "${CMAKE_BINARY_DIR}/include/gmp.h" "#error GMP is disabled by the CMake option CGAL_DISABLE_GMP") @@ -658,24 +605,6 @@ else() endif() hide_variable(CGAL_ESSENTIAL_3RD_PARTY_LIBRARIES) -foreach(lib ${CGAL_SUPPORTING_3RD_PARTY_LIBRARIES}) - - # set standard prefix - if(NOT DEFINED CGAL_EXT_LIB_${lib}_PREFIX) - set(CGAL_EXT_LIB_${lib}_PREFIX ${lib}) - endif() - hide_variable(CGAL_EXT_LIB_${lib}_PREFIX) - - # add option - list(FIND CGAL_ESSENTIAL_3RD_PARTY_LIBRARIES "${lib}" POSITION) - if("${POSITION}" STRGREATER "-1") # if lib is essential - option(WITH_${lib} "Select external library ${lib}" ON) - else() - option(WITH_${lib} "Select external library ${lib}" OFF) - endif() - -endforeach() - #-------------------------------------------------------------------------------------------------- # # -= DEPENDENCIES =- @@ -686,27 +615,16 @@ endforeach() # The following variables are in the cache just so subdirectories can set them persistently. # But they are not intended to persist from run to run as normal cache variables. # Similar variables are created when a library is detected. -# -cache_set(CGAL_3RD_PARTY_PRECONFIGURED "") - cache_set(CGAL_3RD_PARTY_DEFINITIONS "") cache_set(CGAL_3RD_PARTY_INCLUDE_DIRS "") cache_set(CGAL_3RD_PARTY_LIBRARIES "") cache_set(CGAL_3RD_PARTY_LIBRARIES_DIRS "") -# default is on, but some use-cases need to set it to off, e.g., debian packages -option(CGAL_ENABLE_PRECONFIG - "Select to allow to preconfiguration of external libraries" ON) - # additional info: some header files in CGAL add additional code if # certain optional libs are installed, and some examples/tests rely on # this; e.g. in MPFI/RS in Algebraic_kernel_d. For these cases CGAL # and the example/test must be configured with MPFI (just one is not sufficient) -if(NOT CGAL_HEADER_ONLY) - include(CGAL_SetupDependencies) -endif() - message("== Detect external libraries (DONE) ==\n") #-------------------------------------------------------------------------------------------------- @@ -715,77 +633,6 @@ message("== Detect external libraries (DONE) ==\n") # #-------------------------------------------------------------------------------------------------- -if(NOT CGAL_HEADER_ONLY) - # The variables set are the #defines expected by compiler_config.h - # Note: CMake will not notice when files are added or removed - # but this is probably OK for the installation procedure. - - message("== Write compiler_config.h ==") - - macro(add_config_flag flag) - if(${flag}) - file(APPEND ${CMAKE_BINARY_DIR}/include/CGAL/compiler_config.h - "#define ${flag} 1\n\n") - else() - file(APPEND ${CMAKE_BINARY_DIR}/include/CGAL/compiler_config.h - "//#define ${flag} 1\n\n") - endif() - endmacro() - - if(NOT CMAKE_CROSSCOMPILING) - file(GLOB all_config_tests "${CGAL_MODULES_DIR}/config/testfiles/*.cpp") - list(SORT all_config_tests) - - file( - WRITE ${CMAKE_BINARY_DIR}/include/CGAL/compiler_config.h - "//\n// compiler_config.h is included by CGAL headers to load the needed compiler settings.\n//\n// DO NOT EDIT compiler_config.h. It is generated by CMake.\n//\n\n" - ) - - foreach(config_test_cpp ${all_config_tests}) - # Test's name is .cpp's base name - get_filename_component(config_test_name ${config_test_cpp} NAME_WE) - - # Compile and run ${config_test_cpp}. Exit code is stored in ${config_test_name}. - check_cxx_file_runs(${config_test_cpp} ${config_test_name} - ${config_test_name}) - if(${config_test_name}) - set(${config_test_name} 0) - else() - set(${config_test_name} 1) - endif() - - add_config_flag(${config_test_name} ${config_test_name}) - endforeach() - endif() - - add_config_flag(CGAL_USE_GMP) - add_config_flag(CGAL_USE_MPFR) - add_config_flag(CGAL_USE_GMPXX) - add_config_flag(CGAL_USE_LEDA) - add_config_flag(CGAL_USE_MPFI) - add_config_flag(CGAL_USE_RS) - add_config_flag(CGAL_USE_NTL) - - add_config_flag(CGAL_BUILD_SHARED_LIBS) - - if(NOT ${WITH_CGAL_Core}) - set(CGAL_USE_CORE FALSE) - else() - set(CGAL_USE_CORE ${CGAL_USE_GMP}) - endif() - add_config_flag(CGAL_USE_CORE) - # ^^ there is CGAL_USE_CORE and not CGAL_HAS_CORE, as CORE is considered - # as external lib and not as CGAL component (EBEB: 24 Jan 2012) - - if(RUNNING_CGAL_AUTO_TEST AND MSVC) - file(APPEND "${CMAKE_BINARY_DIR}/include/CGAL/compiler_config.h" - "#include \n\n") - endif() - - message("== Write compiler_config.h (DONE) ==\n") - -endif(NOT CGAL_HEADER_ONLY) - #-------------------------------------------------------------------------------------------------- # # -= Installation Setup =- @@ -849,8 +696,6 @@ set(CGAL_INSTALL_MAN_DIR message("== Generating build files ==") -set(CGAL_LIBRARIES_DIR ${CMAKE_BINARY_DIR}/lib) - set(CGAL_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/include) foreach(package ${CGAL_CONFIGURED_PACKAGES}) @@ -861,18 +706,18 @@ endforeach() include_directories(${CGAL_INCLUDE_DIRS}) -cache_get(CGAL_3RD_PARTY_PRECONFIGURED) - -cache_get(CGAL_3RD_PARTY_DEFINITIONS) -cache_get(CGAL_3RD_PARTY_INCLUDE_DIRS) -cache_get(CGAL_3RD_PARTY_LIBRARIES) +cache_get(CGAL_3RD_PARTY_DEFINITIONS ) +cache_get(CGAL_3RD_PARTY_INCLUDE_DIRS ) +cache_get(CGAL_3RD_PARTY_LIBRARIES ) cache_get(CGAL_3RD_PARTY_LIBRARIES_DIRS) -add_subdirectory(src) +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}/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) + # -# Variables used when WITH_{demos|examples|tests} are TRUE, and -# CGAL_HEADER_ONLY=ON +# 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) @@ -927,15 +772,10 @@ if(CGAL_BRANCH_BUILD AND CGAL_REPORT_DUPLICATE_FILES) endif() -if(NOT CGAL_HEADER_ONLY) - create_cgalconfig_files() -else() - configure_file("${CGAL_MODULES_DIR}/CGALConfig_binary_header_only.cmake.in" - "${CMAKE_BINARY_DIR}/CGALConfig.cmake" @ONLY) - configure_file( - "${CGAL_MODULES_DIR}/CGALConfigVersion_binary_header_only.cmake.in" - "${CMAKE_BINARY_DIR}/CGALConfigVersion.cmake" @ONLY) -endif() +configure_file("${CGAL_MODULES_DIR}/CGALConfig_binary_header_only.cmake.in" + "${CMAKE_BINARY_DIR}/CGALConfig.cmake" @ONLY) +configure_file("${CGAL_MODULES_DIR}/CGALConfigVersion_binary_header_only.cmake.in" + "${CMAKE_BINARY_DIR}/CGALConfigVersion.cmake" @ONLY) #-------------------------------------------------------------------------------------------------- # @@ -991,23 +831,17 @@ if(ZLIB_IN_AUXILIARY) install(DIRECTORY auxiliary/zlib/lib/ DESTINATION ${CGAL_INSTALL_LIB_DIR}) endif() -if(NOT CGAL_HEADER_ONLY) - install(FILES ${CMAKE_BINARY_DIR}/CGALConfigVersion.cmake - ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake - DESTINATION ${CGAL_INSTALL_CMAKE_DIR}) -else() - install( - FILES ${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfig.cmake - ${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfigBuildVersion.cmake - ${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfigVersion.cmake +install(FILES + ${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfig.cmake + ${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfigBuildVersion.cmake + ${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfigVersion.cmake + DESTINATION ${CGAL_INSTALL_CMAKE_DIR}) +if(NOT CGAL_INSTALL_CMAKE_DIR STREQUAL "${CGAL_INSTALL_LIB_DIR}/cmake/CGAL") + configure_file(${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfig-installation-dirs.cmake.in + ${CMAKE_BINARY_DIR}/config/CGALConfig-installation-dirs.cmake) + install(FILES + ${CMAKE_BINARY_DIR}/config/CGALConfig-installation-dirs.cmake DESTINATION ${CGAL_INSTALL_CMAKE_DIR}) - if(NOT CGAL_INSTALL_CMAKE_DIR STREQUAL "${CGAL_INSTALL_LIB_DIR}/cmake/CGAL") - configure_file( - ${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfig-installation-dirs.cmake.in - ${CMAKE_BINARY_DIR}/config/CGALConfig-installation-dirs.cmake) - install(FILES ${CMAKE_BINARY_DIR}/config/CGALConfig-installation-dirs.cmake - DESTINATION ${CGAL_INSTALL_CMAKE_DIR}) - endif() endif() if(CGAL_INSTALL_MAN_DIR) @@ -1157,7 +991,7 @@ if(CGAL_BRANCH_BUILD) find_package(GMP REQUIRED) find_package(Doxygen REQUIRED) find_package(Eigen3 REQUIRED) - find_package(Qt5 COMPONENTS Core Widgets Xml OpenGL Gui REQUIRED) + find_package(Qt5 COMPONENTS Core Widgets OpenGL Gui REQUIRED) find_package(VTK COMPONENTS vtkImagingGeneral vtkIOImage NO_MODULE) find_package(IPE) find_package(RS3) @@ -1168,10 +1002,9 @@ if(CGAL_BRANCH_BUILD) set(compile_options "\ ${CMAKE_CXX_FLAGS} -DCGAL_EIGEN3_ENABLED -DCGAL_PROFILE \ -${Qt5Widgets_DEFINITIONS} ${Qt5Xml_DEFINITIONS} ${Qt5OpenGL_DEFINITIONS} ${Qt5Gui_DEFINITIONS} \ +${Qt5Widgets_DEFINITIONS} ${Qt5OpenGL_DEFINITIONS} ${Qt5Gui_DEFINITIONS} \ ${Qt5OpenGL_EXECUTABLE_COMPILE_FLAGS} -fPIC \ ${Qt5Gui_EXECUTABLE_COMPILE_FLAGS} \ -${Qt5Xml_EXECUTABLE_COMPILE_FLAGS} \ ${CGAL_3RD_PARTY_DEFINITIONS} ${CGAL_Qt5_3RD_PARTY_DEFINITIONS} \ ${CGAL_DEFINITIONS}") message("COMPILATION OPTIONS ARE : ${compile_options}") @@ -1220,9 +1053,6 @@ because OpenCV_FOUND is false") message(STATUS "Skip header \"CGAL/CGAL_ipelet_base.h\" \ because IPE_FOUND is false.") endif() - if("${IPE_VERSION}" EQUAL "7") - set(compile_options "${compile_options} -DCGAL_USE_IPE_7") - endif() if(CGAL_ENABLE_CHECK_HEADERS) set(flag "-fsyntax-only") @@ -1267,7 +1097,6 @@ You must disable CGAL_ENABLE_CHECK_HEADERS.") ${GMP_INCLUDE_DIR} ${Qt5OpenGL_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} - ${Qt5Xml_INCLUDE_DIRS} ${Qt5Gui_DEFINITIONS} ${CGAL_3RD_PARTY_INCLUDE_DIRS} ${CGAL_Qt5_3RD_PARTY_INCLUDE_DIRS}) @@ -1284,89 +1113,65 @@ You must disable CGAL_ENABLE_CHECK_HEADERS.") -DDOXYGEN_EXECUTABLE=${DOXYGEN_EXECUTABLE} "${CMAKE_SOURCE_DIR}/Documentation/doc" WORKING_DIRECTORY "${DOC_DIR}") - execute_process(COMMAND "${CMAKE_COMMAND}" --build . --target "doc" - WORKING_DIRECTORY "${DOC_DIR}") + execute_process( + COMMAND + "${CMAKE_COMMAND}" --build . --target "doc" + WORKING_DIRECTORY "${DOC_DIR}" ) - #Get the list of the documented headers + #Get the list of the documented headers + file(GLOB html_files RELATIVE "${DOC_DIR}/doc_output/" "${DOC_DIR}/doc_output/*/*.html") + file(GLOB example_files RELATIVE "${CMAKE_SOURCE_DIR}/" "${CMAKE_SOURCE_DIR}/*/examples/*/*.cpp") + list(SORT example_files) - file( - GLOB html_files - RELATIVE "${DOC_DIR}/doc_output/" - "${DOC_DIR}/doc_output/*/*.html") - file( - GLOB example_files - RELATIVE "${CMAKE_SOURCE_DIR}/" - "${CMAKE_SOURCE_DIR}/*/examples/*/*.cpp") - find_program(AWK awk) - set(awk_arguments - [=[{ match($0, /# *include *(<|[<"])(CGAL\/[^>&"]*)([>"]|>)| (CGAL\/[^>&"]*\.h)/,arr); if(arr[2]!="") print arr[2]; if(arr[4]!="") print arr[4] }]=] - ) - message("listing headers from html files") - foreach(f ${html_files}) - execute_process( - COMMAND "${AWK}" "${awk_arguments}" "${DOC_DIR}/doc_output/${f}" - OUTPUT_VARIABLE tmp_list) - if(NOT "${tmp_list}" STREQUAL "") - string(REPLACE "\n" ";" tmp_list ${tmp_list}) - list(APPEND list_of_documented_headers ${tmp_list}) - endif() - endforeach() - message("listing headers from examples files") - foreach(f ${example_files}) - execute_process( - COMMAND "${AWK}" "${awk_arguments}" "${CMAKE_SOURCE_DIR}/${f}" - OUTPUT_VARIABLE tmp_list) - if(NOT "${tmp_list}" STREQUAL "") - string(REPLACE "\n" ";" tmp_list ${tmp_list}) - list(APPEND list_of_documented_headers ${tmp_list}) - endif() - endforeach() - message("removing duplicates:") - list(REMOVE_DUPLICATES list_of_documented_headers) - message("sorting:") - list(SORT list_of_documented_headers) - #string(REPLACE ";" " \n" list_of_documented_headers "${list_of_documented_headers}") - if(NOT "${list_of_documented_headers}" STREQUAL "") - set(has_list_of_documented_headers TRUE) - else() - set(has_list_of_documented_headers FALSE) + find_program(AWK awk) + set(awk_arguments [=[{ match($0, /# *include *(<|[<"])(CGAL\/[^>&"]*)([>"]|>)| (CGAL\/[^>&"]*\.h)/,arr); if(arr[2]!="") print arr[2]; if(arr[4]!="") print arr[4] }]=]) + message("listing headers from html files") + foreach(f ${html_files}) + execute_process(COMMAND "${AWK}" "${awk_arguments}" "${DOC_DIR}/doc_output/${f}" + OUTPUT_VARIABLE tmp_list) + if (NOT "${tmp_list}" STREQUAL "") + string(REPLACE "\n" ";" tmp_list ${tmp_list}) + LIST( APPEND list_of_documented_headers ${tmp_list}) endif() - include( - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/list_of_whitelisted_headers.cmake - OPTIONAL - RESULT_VARIABLE has_list_of_whitelisted_headers) + endforeach() + + message("listing headers from examples files") + foreach(f ${example_files}) + execute_process(COMMAND "${AWK}" "${awk_arguments}" "${CMAKE_SOURCE_DIR}/${f}" + OUTPUT_VARIABLE tmp_list) + if (NOT "${tmp_list}" STREQUAL "") + string(REPLACE "\n" ";" tmp_list ${tmp_list}) + LIST( APPEND list_of_documented_headers ${tmp_list}) + endif() + endforeach() + message("removing duplicates:") + list(REMOVE_DUPLICATES list_of_documented_headers) + message("sorting:") + list(SORT list_of_documented_headers) + #string(REPLACE ";" " \n" list_of_documented_headers "${list_of_documented_headers}") + list(SORT list_of_documented_headers) + list(REMOVE_DUPLICATES list_of_documented_headers) + + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/list_of_whitelisted_headers.cmake + OPTIONAL RESULT_VARIABLE has_list_of_whitelisted_headers) message("list_of_whitelisted_headers: ${list_of_whitelisted_headers}") ## Loop on package and headers set(check_pkg_target_list) - if(POLICY CMP0057) - cmake_policy(SET CMP0057 NEW) - endif() #get build dir for removal from deps get_filename_component(BUILD_DIR ${CMAKE_BINARY_DIR} NAME) foreach(package ${CGAL_CONFIGURED_PACKAGES_NAMES}) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../${package}/include) set(check_pkg_headers_depends "") - if(has_list_of_documented_headers AND POLICY CMP0057) - # Then recurse2 - file( - GLOB_RECURSE ${package}_HEADERS - RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/../${package}/include" - "${CMAKE_CURRENT_SOURCE_DIR}/../${package}/include/CGAL/*.h*") - else() # do not recurse - file( - GLOB ${package}_HEADERS - RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/../${package}/include" - "${CMAKE_CURRENT_SOURCE_DIR}/../${package}/include/CGAL/*.h*") - endif() + file(GLOB_RECURSE ${package}_HEADERS #don't use a hard coded list because the ones for the documented headers is enough. + RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/../${package}/include" + "${CMAKE_CURRENT_SOURCE_DIR}/../${package}/include/CGAL/*.h*") + list(SORT ${package}_HEADERS) foreach(header ${${package}_HEADERS}) set(skip_hdr FALSE) - if(POLICY CMP0057) - if(has_list_of_documented_headers AND NOT header IN_LIST - list_of_documented_headers) - # message(STATUS "Skip non-documented header \"${header}\".") - set(skip_hdr TRUE) - endif() + if(NOT header IN_LIST list_of_documented_headers) +# message(STATUS "Skip non-documented header \"${header}\".") + set(skip_hdr TRUE) endif() if(NOT VTK_FOUND) string(REGEX MATCH ".*vtk.*" is_a_vtk_header ${header}) @@ -1382,12 +1187,10 @@ VTK_FOUND is false.") LEDA_FOUND is false.") set(skip_hdr TRUE) endif() - if(POLICY CMP0057) - if(has_list_of_whitelisted_headers AND header IN_LIST - list_of_whitelisted_headers) - message(STATUS "Skip whitelisted header \"${header}\".") - set(skip_hdr TRUE) - endif() + if(has_list_of_whitelisted_headers + AND header IN_LIST list_of_whitelisted_headers) + message(STATUS "Skip whitelisted header \"${header}\".") + set(skip_hdr TRUE) endif() if(NOT skip_hdr) list(APPEND list_of_headers_to_test ${header}) @@ -1456,7 +1259,6 @@ ${CMAKE_CURRENT_SOURCE_DIR}/../${package}/include/${header}" list(REMOVE_DUPLICATES packages_deps) endif() endforeach() # loop on packages - #Now check that a cpp file including all documented headers compiles file(WRITE ${CGAL_BINARY_DIR}/test_headers.cpp "#define BOOST_PARAMETER_MAX_ARITY 12 \n") @@ -1494,3 +1296,24 @@ if(NOT CGAL_BRANCH_BUILD AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/doc") # in a non-branch build this is the top-level CMakeLists.txt add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/doc") endif() + +#print some info about versions +if(RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE) + find_package(Qt5 QUIET COMPONENTS Core) + find_package(Boost) + if(NOT CGAL_DISABLE_GMP) + find_package(GMP) + find_package(MPFR) + get_dependency_version(GMP) + get_dependency_version(MPFR) + elseif(WITH_LEDA)#CGAL_DISABLE_GMP + find_package(LEDA) + endif()#NOT CGAL_DISABLE_GMP + message( + 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 +endif()#RUNNING_CGAL_AUTO_TEST diff --git a/Installation/cmake/modules/CGAL_Common.cmake b/Installation/cmake/modules/CGAL_Common.cmake index ed1fe54ad0c..c9c61644d23 100644 --- a/Installation/cmake/modules/CGAL_Common.cmake +++ b/Installation/cmake/modules/CGAL_Common.cmake @@ -24,17 +24,6 @@ if( NOT CGAL_COMMON_FILE_INCLUDED ) set( CMAKE_2_6_3_OR_ABOVE FALSE ) endif() - if ( CGAL_BUILDING_LIBS ) - option(BUILD_SHARED_LIBS "Build shared libraries" ON) - set(CGAL_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) - - if ( BUILD_SHARED_LIBS ) - message( STATUS "Building shared libraries" ) - else() - message( STATUS "Building static libraries" ) - endif() - endif() - if ( WIN32 ) find_program(CMAKE_UNAME uname /bin /usr/bin /usr/local/bin ) if(CMAKE_UNAME) diff --git a/Installation/cmake/modules/CGAL_CreateSingleSourceCGALProgram.cmake b/Installation/cmake/modules/CGAL_CreateSingleSourceCGALProgram.cmake index 52736d2523c..1eb308fbe1c 100644 --- a/Installation/cmake/modules/CGAL_CreateSingleSourceCGALProgram.cmake +++ b/Installation/cmake/modules/CGAL_CreateSingleSourceCGALProgram.cmake @@ -57,6 +57,12 @@ function(create_single_source_cgal_program firstfile ) set(NO_TESTING TRUE) endif() + if(NOT NO_TESTING) + cgal_add_test(${exe_name}) + else() + cgal_add_test(${exe_name} NO_EXECUTION) + endif() + add_to_cached_list( CGAL_EXECUTABLE_TARGETS ${exe_name} ) target_link_libraries(${exe_name} PRIVATE CGAL::CGAL CGAL::Data) diff --git a/Installation/cmake/modules/CGAL_Eigen3_support.cmake b/Installation/cmake/modules/CGAL_Eigen3_support.cmake new file mode 100644 index 00000000000..cc0df0fad10 --- /dev/null +++ b/Installation/cmake/modules/CGAL_Eigen3_support.cmake @@ -0,0 +1,9 @@ +if(EIGEN3_FOUND AND NOT TARGET CGAL::Eigen3_support) + if(NOT TARGET Threads::Threads) + find_package(Threads REQUIRED) + endif() + add_library(CGAL::Eigen3_support INTERFACE IMPORTED) + set_target_properties(CGAL::Eigen3_support PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "CGAL_EIGEN3_ENABLED" + INTERFACE_INCLUDE_DIRECTORIES "${EIGEN3_INCLUDE_DIR}") +endif() diff --git a/Installation/cmake/modules/CGAL_Macros.cmake b/Installation/cmake/modules/CGAL_Macros.cmake index 2a937ee19e0..f619cd32950 100644 --- a/Installation/cmake/modules/CGAL_Macros.cmake +++ b/Installation/cmake/modules/CGAL_Macros.cmake @@ -290,10 +290,9 @@ if( NOT CGAL_MACROS_FILE_INCLUDED ) # To deal with imported targets of Qt5 and Boost, when CGAL # targets are themselves imported by another project. - if(NOT CGAL_BUILDING_LIBS) - if (${component} STREQUAL "Qt5") - find_package(Qt5 COMPONENTS OpenGL Gui Core Script ScriptTools QUIET) - endif() + + if (${component} STREQUAL "Qt5") + find_package(Qt5 COMPONENTS OpenGL Gui Core Script ScriptTools QUIET) endif() else(WITH_CGAL_${component}) @@ -308,9 +307,8 @@ if( NOT CGAL_MACROS_FILE_INCLUDED ) set( vlib "${CGAL_EXT_LIB_${component}_PREFIX}" ) - if ( NOT CGAL_IGNORE_PRECONFIGURED_${component} AND ${vlib}_FOUND) + if (${vlib}_FOUND) - ####message( STATUS "External library ${component} has been preconfigured") use_lib( ${component} ${${vlib}_USE_FILE}) else() @@ -334,45 +332,6 @@ if( NOT CGAL_MACROS_FILE_INCLUDED ) endmacro() - macro( use_essential_libs ) - - # Comment: This is subject to be changed in the future - # - either more specific (giving precise include_dir- and link-order) - # - or even less specific if order becomes less relevant - # Eric Berberich 2012/06/29 - - if(NOT CGAL_DISABLE_GMP) - if(RS_FOUND) - use_component( RS ) - endif() - - if(MPFI_FOUND) - use_component( MPFI ) - endif() - - if(MPFR_FOUND) - use_component( MPFR ) - endif() - - if (GMPXX_FOUND) - use_component( GMPXX ) - endif() - - if(GMP_FOUND) - use_component( GMP ) - endif() - endif(NOT CGAL_DISABLE_GMP) - - if(LEDA_FOUND) - use_component( LEDA ) - endif() - - if(NTL_FOUND) - use_component( NTL ) - endif() - endmacro() - - function( cgal_setup_module_path ) # Avoid to modify the modules path twice if(NOT CGAL_MODULE_PATH_IS_SET) @@ -408,35 +367,6 @@ if( NOT CGAL_MACROS_FILE_INCLUDED ) file( APPEND ${CMAKE_BINARY_DIR}/CGALConfig.cmake "${SPECIAL_PREFIXES}\n") file( APPEND ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake "${SPECIAL_PREFIXES}") - foreach( lib ${CGAL_SUPPORTING_3RD_PARTY_LIBRARIES} ) - - list( FIND CGAL_ESSENTIAL_3RD_PARTY_LIBRARIES "${lib}" POSITION ) - # if lib is essential or preconfiguration for an activated library ... - if ( ("${POSITION}" STRGREATER "-1") OR ( CGAL_ENABLE_PRECONFIG AND WITH_${lib} )) - - set (vlib ${CGAL_EXT_LIB_${lib}_PREFIX} ) - #the next 'if' is needed to avoid ${vlib} config variables to be overidden in case of a local configuration change - file( APPEND ${CMAKE_BINARY_DIR}/CGALConfig.cmake "if (NOT CGAL_IGNORE_PRECONFIGURED_${lib})\n") - file( APPEND ${CMAKE_BINARY_DIR}/CGALConfig.cmake " set( ${vlib}_FOUND \"${${vlib}_FOUND}\" )\n") - file( APPEND ${CMAKE_BINARY_DIR}/CGALConfig.cmake " set( ${vlib}_USE_FILE \"${${vlib}_USE_FILE}\" )\n") - file( APPEND ${CMAKE_BINARY_DIR}/CGALConfig.cmake " set( ${vlib}_INCLUDE_DIR \"${${vlib}_INCLUDE_DIR}\" )\n") - file( APPEND ${CMAKE_BINARY_DIR}/CGALConfig.cmake " set( ${vlib}_LIBRARIES \"${${vlib}_LIBRARIES}\" )\n") - file( APPEND ${CMAKE_BINARY_DIR}/CGALConfig.cmake " set( ${vlib}_DEFINITIONS \"${${vlib}_DEFINITIONS}\" )\n") - file( APPEND ${CMAKE_BINARY_DIR}/CGALConfig.cmake "endif()\n\n") - - - #the next 'if' is needed to avoid ${vlib} config variables to be overidden in case of a local configuration change - file( APPEND ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake "if (NOT CGAL_IGNORE_PRECONFIGURED_${lib})\n") - file( APPEND ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake " set( ${vlib}_FOUND \"${${vlib}_FOUND}\")\n") - file( APPEND ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake " set( ${vlib}_USE_FILE \"${${vlib}_USE_FILE}\" )\n") - file( APPEND ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake " set( ${vlib}_INCLUDE_DIR \"${${vlib}_INCLUDE_DIR}\" )\n") - file( APPEND ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake " set( ${vlib}_LIBRARIES \"${${vlib}_LIBRARIES}\" )\n") - file( APPEND ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake " set( ${vlib}_DEFINITIONS \"${${vlib}_DEFINITIONS}\" )\n") - file( APPEND ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake "endif()\n\n") - endif() - - endforeach() - endmacro() macro ( fetch_env_var VAR ) diff --git a/Installation/cmake/modules/CGAL_Qt5_moc_and_resource_files.cmake b/Installation/cmake/modules/CGAL_Qt5_moc_and_resource_files.cmake index 2ff6bb7276a..f3d4f23dc21 100644 --- a/Installation/cmake/modules/CGAL_Qt5_moc_and_resource_files.cmake +++ b/Installation/cmake/modules/CGAL_Qt5_moc_and_resource_files.cmake @@ -2,24 +2,6 @@ if(CGAL_Qt5_moc_and_resource_files_included) return() endif() set(CGAL_Qt5_moc_and_resource_files_included TRUE) - -if(NOT CGAL_HEADER_ONLY AND CGAL_BUILDING_LIBS) - qt5_wrap_cpp(_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 - TARGET CGAL_Qt5 - ) -endif()#CGAL_HEADER_ONLY - # 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 diff --git a/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake index 6590e31f940..0745228def8 100644 --- a/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake @@ -23,11 +23,6 @@ # If set, the `LEDA` library will be searched and used to provide # the exact number types used by CGAL kernels. # -# .. variable:: CGAL_HEADER_ONLY -# -# Set this variable if you are using the CGAL libraries as -# header-only libraries. -# if(CGAL_SetupCGALDependencies_included) return() endif() @@ -72,56 +67,47 @@ endif() # # Link the target with the dependencies of CGAL:: # -# CGAL_setup_CGAL_dependencies( target [INTERFACE] ) +# CGAL_setup_CGAL_dependencies( target ) # -# If the option ``INTERFACE`` is passed, the dependencies are +# The dependencies are # added using :command:`target_link_libraries` with the ``INTERFACE`` -# keyword, or ``PUBLIC`` otherwise. +# keyword. # function(CGAL_setup_CGAL_dependencies target) - if(ARGV1 STREQUAL INTERFACE) - set(keyword INTERFACE) - else() - set(keyword PUBLIC) - endif() if(CGAL_DISABLE_GMP) - target_compile_definitions(${target} ${keyword} CGAL_DISABLE_GMP=1) + target_compile_definitions(${target} INTERFACE CGAL_DISABLE_GMP=1) else() - use_CGAL_GMP_support(${target} ${keyword}) + use_CGAL_GMP_support(${target} INTERFACE) set(CGAL_USE_GMP TRUE CACHE INTERNAL "CGAL library is configured to use GMP") set(CGAL_USE_MPFR TRUE CACHE INTERNAL "CGAL library is configured to use MPFR") endif() if(WITH_LEDA) - use_CGAL_LEDA_support(${target} ${keyword}) - endif() - - if (NOT CGAL_HEADER_ONLY) - target_compile_definitions(${target} ${keyword} CGAL_NOT_HEADER_ONLY=1) + use_CGAL_LEDA_support(${target} INTERFACE) endif() if (RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE) - target_compile_definitions(${target} ${keyword} CGAL_TEST_SUITE=1) + 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} ${keyword} cxx_decltype_auto) + target_compile_features(${target} INTERFACE cxx_decltype_auto) - use_CGAL_Boost_support(${target} ${keyword}) + use_CGAL_Boost_support(${target} INTERFACE) foreach(dir ${CGAL_INCLUDE_DIRS}) - target_include_directories(${target} ${keyword} + target_include_directories(${target} INTERFACE $) endforeach() - target_include_directories(${target} ${keyword} + target_include_directories(${target} INTERFACE $) # Now setup compilation flags if(MSVC) - target_compile_options(${target} ${keyword} + target_compile_options(${target} INTERFACE "-D_SCL_SECURE_NO_DEPRECATE;-D_SCL_SECURE_NO_WARNINGS") if(CMAKE_VERSION VERSION_LESS 3.11) - target_compile_options(${target} ${keyword} + target_compile_options(${target} INTERFACE /fp:strict /fp:except- /wd4503 # Suppress warnings C4503 about "decorated name length exceeded" @@ -129,7 +115,7 @@ function(CGAL_setup_CGAL_dependencies target) ) else() # The MSVC generator supports `$` since CMake 3.11. - target_compile_options(${target} ${keyword} + target_compile_options(${target} INTERFACE $<$:/fp:strict> $<$:/fp:except-> $<$:/wd4503> # Suppress warnings C4503 about "decorated name length exceeded" @@ -140,39 +126,39 @@ function(CGAL_setup_CGAL_dependencies target) if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 11.0.3) message(STATUS "Apple Clang version ${CMAKE_CXX_COMPILER_VERSION} compiler detected") message(STATUS "Boost MP is turned off for all Apple Clang versions below 11.0.3!") - target_compile_options(${target} ${keyword} "-DCGAL_DO_NOT_USE_BOOST_MP") + target_compile_options(${target} INTERFACE "-DCGAL_DO_NOT_USE_BOOST_MP") endif() elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel") message( STATUS "Using Intel Compiler. Adding -fp-model strict" ) if(WIN32) - target_compile_options(${target} ${keyword} "/fp:strict") + target_compile_options(${target} INTERFACE "/fp:strict") else() - target_compile_options(${target} ${keyword} "-fp-model" "strict") + target_compile_options(${target} INTERFACE "-fp-model" "strict") endif() elseif(CMAKE_CXX_COMPILER_ID MATCHES "SunPro") message( STATUS "Using SunPro compiler, using STLPort 4." ) - target_compile_options(${target} ${keyword} + target_compile_options(${target} INTERFACE "-features=extensions;-library=stlport4;-D_GNU_SOURCE") - target_link_libraries(${target} ${keyword} "-library=stlport4") + target_link_libraries(${target} INTERFACE "-library=stlport4") elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") if ( RUNNING_CGAL_AUTO_TEST ) - target_compile_options(${target} ${keyword} "-Wall") + target_compile_options(${target} INTERFACE "-Wall") endif() if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 3) message( STATUS "Using gcc version 4 or later. Adding -frounding-math" ) if(CMAKE_VERSION VERSION_LESS 3.3) - target_compile_options(${target} ${keyword} "-frounding-math") + target_compile_options(${target} INTERFACE "-frounding-math") else() - target_compile_options(${target} ${keyword} "$<$:-frounding-math>") + target_compile_options(${target} INTERFACE "$<$:-frounding-math>") endif() endif() if ( "${GCC_VERSION}" MATCHES "^4.2" ) message( STATUS "Using gcc version 4.2. Adding -fno-strict-aliasing" ) - target_compile_options(${target} ${keyword} "-fno-strict-aliasing" ) + target_compile_options(${target} INTERFACE "-fno-strict-aliasing" ) endif() if ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "alpha" ) message( STATUS "Using gcc on alpha. Adding -mieee -mfp-rounding-mode=d" ) - target_compile_options(${target} ${keyword} "-mieee" "-mfp-rounding-mode=d" ) + target_compile_options(${target} INTERFACE "-mieee" "-mfp-rounding-mode=d" ) endif() endif() endfunction() diff --git a/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake index 51c6bc73c4f..3387eae26c8 100644 --- a/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake @@ -46,22 +46,16 @@ endif() # # Link the target with the dependencies of `CGAL_Core`:: # -# CGAL_setup_CGAL_Core_dependencies( target [INTERFACE] ) +# CGAL_setup_CGAL_Core_dependencies( target) # -# If the option ``INTERFACE`` is passed, the dependencies are +# The dependencies are # added using :command:`target_link_libraries` with the ``INTERFACE`` -# keyword, or ``PUBLIC`` otherwise. +# keyword. # function(CGAL_setup_CGAL_Core_dependencies target) - if(ARGV1 STREQUAL INTERFACE) - set(keyword INTERFACE) - else() - set(keyword PUBLIC) - endif() - - use_CGAL_GMP_support(CGAL_Core ${keyword}) - target_compile_definitions(${target} ${keyword} CGAL_USE_CORE=1) - target_link_libraries( CGAL_Core ${keyword} CGAL::CGAL ) + use_CGAL_GMP_support(CGAL_Core INTERFACE) + target_compile_definitions(${target} INTERFACE CGAL_USE_CORE=1) + target_link_libraries( CGAL_Core INTERFACE CGAL::CGAL ) endfunction() diff --git a/Installation/cmake/modules/CGAL_SetupCGAL_ImageIODependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGAL_ImageIODependencies.cmake index 8ac856d0373..fd1d2bd7f2a 100644 --- a/Installation/cmake/modules/CGAL_SetupCGAL_ImageIODependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGAL_ImageIODependencies.cmake @@ -51,22 +51,14 @@ set(CGAL_ImageIO_FOUND TRUE) set_property(GLOBAL PROPERTY CGAL_ImageIO_FOUND TRUE) function(CGAL_setup_CGAL_ImageIO_dependencies target) - if(ARGV1 STREQUAL INTERFACE) - set(keyword INTERFACE) - else() - set(keyword PUBLIC) - endif() - target_link_libraries( CGAL_ImageIO ${keyword} CGAL::CGAL) + target_link_libraries( CGAL_ImageIO INTERFACE CGAL::CGAL) if(ZLIB_FOUND) - target_include_directories( CGAL_ImageIO SYSTEM ${keyword} ${ZLIB_INCLUDE_DIRS}) - target_link_libraries( CGAL_ImageIO ${keyword} ${ZLIB_LIBRARIES}) + target_include_directories( CGAL_ImageIO SYSTEM INTERFACE ${ZLIB_INCLUDE_DIRS}) + target_link_libraries( CGAL_ImageIO INTERFACE ${ZLIB_LIBRARIES}) - target_compile_definitions( CGAL_ImageIO ${keyword} CGAL_USE_ZLIB=1) - if(NOT ARGV1 STREQUAL INTERFACE) - set_target_properties(CGAL_ImageIO PROPERTIES CGAL_TARGET_USES_ZLIB TRUE) - endif() + target_compile_definitions( CGAL_ImageIO INTERFACE CGAL_USE_ZLIB=1) else() message( STATUS "NOTICE: libCGAL_ImageIO needs ZLib to read compressed files. That feature will not be activated.") endif() diff --git a/Installation/cmake/modules/CGAL_SetupCGAL_Qt5Dependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGAL_Qt5Dependencies.cmake index 2cdc190f75a..7ff7dde7a48 100644 --- a/Installation/cmake/modules/CGAL_SetupCGAL_Qt5Dependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGAL_Qt5Dependencies.cmake @@ -24,7 +24,7 @@ set(CGAL_SetupCGAL_Qt5Dependencies_included TRUE) # Used Modules # ^^^^^^^^^^^^ # - :module:`Qt5Config` -find_package(Qt5 QUIET COMPONENTS OpenGL Svg Xml) +find_package(Qt5 QUIET COMPONENTS OpenGL Svg) set(CGAL_Qt5_MISSING_DEPS "") if(NOT Qt5OpenGL_FOUND) @@ -54,9 +54,9 @@ if(NOT CGAL_Qt5_MISSING_DEPS) include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Qt5_moc_and_resource_files.cmake) - if(CGAL_HEADER_ONLY AND (WITH_demos OR WITH_examples OR WITH_tests OR NOT CGAL_BUILDING_LIBS) AND NOT TARGET CGAL_Qt5_moc_and_resources) - add_library(CGAL_Qt5_moc_and_resources STATIC - ${_CGAL_Qt5_MOC_FILES_private} + 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 @@ -75,7 +75,7 @@ if(NOT CGAL_Qt5_MISSING_DEPS) POSITION_INDEPENDENT_CODE TRUE EXCLUDE_FROM_ALL TRUE AUTOMOC TRUE) - target_link_libraries(CGAL_Qt5_moc_and_resources CGAL::CGAL Qt5::Widgets Qt5::OpenGL Qt5::Svg Qt5::Xml) + target_link_libraries(CGAL_Qt5_moc_and_resources CGAL::CGAL Qt5::Widgets Qt5::OpenGL Qt5::Svg ) 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) @@ -99,33 +99,26 @@ endif() # # Link the target with the dependencies of `CGAL_Qt5`:: # -# CGAL_setup_CGAL_Qt5_dependencies( target [INTERFACE] ) +# CGAL_setup_CGAL_Qt5_dependencies( target ) # -# If the option ``INTERFACE`` is passed, the dependencies are +# The dependencies are # added using :command:`target_link_libraries` with the ``INTERFACE`` -# keyword, or ``PUBLIC`` otherwise. +# keyword. # function(CGAL_setup_CGAL_Qt5_dependencies target) - if(ARGV1 STREQUAL INTERFACE) - set(keyword INTERFACE) - else() - set(keyword PUBLIC) - endif() if($ENV{CGAL_FAKE_PUBLIC_RELEASE}) - target_compile_definitions( ${target} ${keyword} CGAL_FAKE_PUBLIC_RELEASE=1 ) + target_compile_definitions( ${target} INTERFACE CGAL_FAKE_PUBLIC_RELEASE=1 ) endif() - target_link_libraries( ${target} ${keyword} CGAL::CGAL) - if(CGAL_HEADER_ONLY) - target_link_libraries( ${target} ${keyword} CGAL::Qt5_moc_and_resources) - endif() - target_link_libraries( ${target} ${keyword} Qt5::OpenGL Qt5::Svg Qt5::Xml) + 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::Svg ) # 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} ${keyword} "-Wno-deprecated-copy" "-Wno-cast-function-type" ) + target_compile_options( ${target} INTERFACE "-Wno-deprecated-copy" "-Wno-cast-function-type" ) endif() endfunction() diff --git a/Installation/cmake/modules/CGAL_SetupDependencies.cmake b/Installation/cmake/modules/CGAL_SetupDependencies.cmake index 1c0135b155a..6051c7d3ce4 100644 --- a/Installation/cmake/modules/CGAL_SetupDependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupDependencies.cmake @@ -1,77 +1,5 @@ include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Macros.cmake) -message ( STATUS "External libraries supported: ${CGAL_SUPPORTING_3RD_PARTY_LIBRARIES}") - -foreach (lib ${CGAL_SUPPORTING_3RD_PARTY_LIBRARIES}) - - # Part 1: Try to find lib - - set (vlib "${CGAL_EXT_LIB_${lib}_PREFIX}") - - # Check whether lib is essential or WITH_ is given: - - list(FIND CGAL_ESSENTIAL_3RD_PARTY_LIBRARIES "${lib}" POSITION) - - if ("${POSITION}" STRGREATER "-1" OR WITH_${lib}) - - # In both cases CGAL_USE_ will be finally set. - - #message (STATUS "With ${lib} given or essential: pos=${POSITION}") - - if ( CGAL_ENABLE_PRECONFIG ) - message (STATUS "Preconfiguring library: ${lib} ...") - else() - message (STATUS "Configuring library: ${lib} ...") - endif() - - find_package( ${lib} ) - - if ( ${vlib}_FOUND ) - if ( CGAL_ENABLE_PRECONFIG ) - message( STATUS "${lib} has been preconfigured:") - message( STATUS " Use${lib}-file: ${${vlib}_USE_FILE}") - message( STATUS " ${lib} include: ${${vlib}_INCLUDE_DIR}" ) - message( STATUS " ${lib} libraries: ${${vlib}_LIBRARIES}" ) - message( STATUS " ${lib} definitions: ${${vlib}_DEFINITIONS}" ) - else() - message( STATUS "${lib} has been configured") - use_lib( ${vlib} ${${vlib}_USE_FILE}) - endif() - - # TODO EBEB what about Qt5, zlib etc? - set ( CGAL_USE_${vlib} TRUE ) - - - # Part 2: Add some lib-specific definitions or obtain version - - if (${lib} STREQUAL "GMP") - get_dependency_version(GMP) - endif() - - if (${lib} STREQUAL "MPFR") - set( MPFR_DEPENDENCY_INCLUDE_DIR ${GMP_INCLUDE_DIR} ) - set( MPFR_DEPENDENCY_LIBRARIES ${GMP_LIBRARIES} ) - get_dependency_version(MPFR) - endif() - - if (${lib} STREQUAL "LEDA") - # special case for LEDA - add a flag - message( STATUS "LEDA cxx flags: ${LEDA_CXX_FLAGS}" ) - uniquely_add_flags( CMAKE_CXX_FLAGS ${LEDA_CXX_FLAGS} ) - endif() - - else() - - if ("${POSITION}" STRGREATER "-1") # if lib is essential - message( FATAL_ERROR "CGAL requires ${lib} to be found" ) - endif() - - endif() - - endif() - -endforeach() - if( (GMP_FOUND AND NOT MPFR_FOUND) OR (NOT GMP_FOUND AND MPFR_FOUND) ) message( FATAL_ERROR "CGAL needs for its full functionality both GMP and MPFR.") endif() diff --git a/Installation/cmake/modules/CGAL_SetupFlags.cmake b/Installation/cmake/modules/CGAL_SetupFlags.cmake index 9037edc6a5e..514ad5c58c8 100644 --- a/Installation/cmake/modules/CGAL_SetupFlags.cmake +++ b/Installation/cmake/modules/CGAL_SetupFlags.cmake @@ -6,12 +6,12 @@ if ( NOT CGAL_SETUP_FLAGS_INCLUDED ) # override the flags used to build the libraries # set( CGAL_DONT_OVERRIDE_CMAKE_FLAGS_DESCRIPTION - "Set this to TRUE if you want to define or modify any of CMAKE_*_FLAGS. When this is FALSE, all the CMAKE_*_FLAGS flags are overriden with the values used when building the CGAL libs. For CGAL_*_flags (used for ADDITIONAL flags) , there is no need to set this to TRUE." + "Set this to TRUE if you want to define or modify any of CMAKE_*_FLAGS. When this is FALSE, all the CMAKE_*_FLAGS flags are overriden with the values used when building the CGAL libs. For CGAL_*_flags (used for ADDITIONAL flags) , there is no need to set this to TRUE." ) -option( CGAL_DONT_OVERRIDE_CMAKE_FLAGS +option( CGAL_DONT_OVERRIDE_CMAKE_FLAGS ${CGAL_DONT_OVERRIDE_CMAKE_FLAGS_DESCRIPTION} - FALSE + FALSE ) if ( CGAL_CONFIG_LOADED AND NOT CGAL_DONT_OVERRIDE_CMAKE_FLAGS ) @@ -19,18 +19,14 @@ if ( CGAL_CONFIG_LOADED AND NOT CGAL_DONT_OVERRIDE_CMAKE_FLAGS ) typed_cache_set ( STRING "Build type: Release, Debug, RelWithDebInfo or MinSizeRel" CMAKE_BUILD_TYPE "${CGAL_BUILD_TYPE_INIT}" ) string( TOUPPER "${CMAKE_BUILD_TYPE}" CGAL_BUILD_TYPE_UPPER ) - - if ( CGAL_BUILD_SHARED_LIBS ) - set( CGAL_LINKER_FLAGS_TYPE SHARED ) - else() - set( CGAL_LINKER_FLAGS_TYPE MODULE ) - endif() - + + set( CGAL_LINKER_FLAGS_TYPE MODULE ) + typed_cache_set ( STRING "C++ compiler flags for all build types" CMAKE_CXX_FLAGS "${CGAL_CXX_FLAGS_INIT}" ) typed_cache_set ( STRING "C++ compiler flags for ${CGAL_BUILD_TYPE_UPPER}" CMAKE_CXX_FLAGS_${CGAL_BUILD_TYPE_UPPER} "${CGAL_CXX_FLAGS_${CGAL_BUILD_TYPE_UPPER}_INIT}" ) typed_cache_set ( STRING "Linker flags for all build types" CMAKE_EXE_LINKER_FLAGS "${CGAL_${CGAL_LINKER_FLAGS_TYPE}_LINKER_FLAGS_INIT}" ) typed_cache_set ( STRING "Linker flags for ${CGAL_BUILD_TYPE_UPPER}" CMAKE_EXE_LINKER_FLAGS_${CGAL_BUILD_TYPE_UPPER} "${CGAL_${CGAL_LINKER_FLAGS_TYPE}_LINKER_FLAGS_${CGAL_BUILD_TYPE_UPPER}_INIT}" ) - + endif() typed_cache_set( BOOL ${CGAL_DONT_OVERRIDE_CMAKE_FLAGS_DESCRIPTION} CGAL_DONT_OVERRIDE_CMAKE_FLAGS TRUE ) @@ -68,15 +64,7 @@ string( TOUPPER "${CMAKE_BUILD_TYPE}" CGAL_BUILD_TYPE_UPPER ) message( STATUS "USING CXXFLAGS = '${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${CGAL_BUILD_TYPE_UPPER}}'" ) -if ( CGAL_BUILDING_LIBS ) - if ( BUILD_SHARED_LIBS ) - message( STATUS "USING LDFLAGS = '${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_${CGAL_BUILD_TYPE_UPPER}}'" ) - else() - message( STATUS "USING LDFLAGS = '${CMAKE_STATIC_LINKER_FLAGS} ${CMAKE_STATIC_LINKER_FLAGS_${CGAL_BUILD_TYPE_UPPER}}'" ) - endif() -else() - message( STATUS "USING EXEFLAGS = '${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CGAL_BUILD_TYPE_UPPER}}'" ) -endif() +message( STATUS "USING EXEFLAGS = '${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CGAL_BUILD_TYPE_UPPER}}'" ) endif() diff --git a/Installation/cmake/modules/CGAL_SetupGMP.cmake b/Installation/cmake/modules/CGAL_SetupGMP.cmake index 6627df01796..4a1df74eabc 100644 --- a/Installation/cmake/modules/CGAL_SetupGMP.cmake +++ b/Installation/cmake/modules/CGAL_SetupGMP.cmake @@ -46,34 +46,29 @@ endif() # keyword, or ``PUBLIC`` otherwise. function(use_CGAL_GMP_support target) - if(ARGV1 STREQUAL INTERFACE) - set(keyword INTERFACE) - else() - set(keyword PUBLIC) - endif() if(NOT GMP_FOUND OR NOT MPFR_FOUND) message(FATAL_ERROR "CGAL requires GMP and MPFR.") return() endif() if(NOT GMP_INCLUDE_DIR STREQUAL "${CGAL_INSTALLATION_PACKAGE_DIR}/auxiliary/gmp/include") - target_include_directories(${target} SYSTEM ${keyword} ${GMP_INCLUDE_DIR}) + target_include_directories(${target} SYSTEM INTERFACE ${GMP_INCLUDE_DIR}) else() - target_include_directories(${target} SYSTEM ${keyword} + target_include_directories(${target} SYSTEM INTERFACE $ $) endif() if(NOT MPFR_INCLUDE_DIR STREQUAL "${CGAL_INSTALLATION_PACKAGE_DIR}/auxiliary/gmp/include") - target_include_directories(${target} SYSTEM ${keyword} ${MPFR_INCLUDE_DIR}) + target_include_directories(${target} SYSTEM INTERFACE ${MPFR_INCLUDE_DIR}) else() - target_include_directories(${target} SYSTEM ${keyword} + target_include_directories(${target} SYSTEM INTERFACE $ $) endif() if(WITH_GMPXX OR CGAL_WITH_GMPXX) - target_include_directories(${target} SYSTEM ${keyword} ${GMPXX_INCLUDE_DIR}) - target_link_libraries(${target} ${keyword} ${GMPXX_LIBRARIES}) - target_compile_definitions(${target} ${keyword} CGAL_USE_GMPXX=1) + target_include_directories(${target} SYSTEM INTERFACE ${GMPXX_INCLUDE_DIR}) + target_link_libraries(${target} INTERFACE ${GMPXX_LIBRARIES}) + target_compile_definitions(${target} INTERFACE CGAL_USE_GMPXX=1) endif() - target_link_libraries(${target} ${keyword} ${MPFR_LIBRARIES} ${GMP_LIBRARIES}) + target_link_libraries(${target} INTERFACE ${MPFR_LIBRARIES} ${GMP_LIBRARIES}) endfunction() diff --git a/Installation/cmake/modules/CGAL_SetupLEDA.cmake b/Installation/cmake/modules/CGAL_SetupLEDA.cmake index 72688b361ec..af207540058 100644 --- a/Installation/cmake/modules/CGAL_SetupLEDA.cmake +++ b/Installation/cmake/modules/CGAL_SetupLEDA.cmake @@ -32,11 +32,6 @@ find_package(LEDA) # keyword, or ``PUBLIC`` otherwise. function(use_CGAL_LEDA_support target) - if(ARGV1 STREQUAL INTERFACE) - set(keyword INTERFACE) - else() - set(keyword PUBLIC) - endif() if(NOT LEDA_FOUND) message(FATAL_ERROR "use_CGAL_LEDA_support is use whereas LEDA_FOUND is false.") return() @@ -45,12 +40,12 @@ function(use_CGAL_LEDA_support target) separate_arguments(LIST_LEDA_DEFINITIONS UNIX_COMMAND "${LEDA_DEFINITIONS} -DCGAL_USE_LEDA") if(CMAKE_VERSION VERSION_LESS 3.3) - target_compile_options(${target} ${keyword} ${LIST_LEDA_CXX_FLAGS}) + target_compile_options(${target} INTERFACE ${LIST_LEDA_CXX_FLAGS}) else() - target_compile_options(${target} ${keyword} $<$:${LIST_LEDA_CXX_FLAGS}>) + target_compile_options(${target} INTERFACE $<$:${LIST_LEDA_CXX_FLAGS}>) endif() - target_compile_options(${target} ${keyword} ${LIST_LEDA_DEFINITIONS}) + target_compile_options(${target} INTERFACE ${LIST_LEDA_DEFINITIONS}) - target_include_directories(${target} SYSTEM ${keyword} ${LEDA_INCLUDE_DIR}) - target_link_libraries(${target} ${keyword} ${LEDA_LIBRARIES} ${LEDA_LINKER_FLAGS}) + target_include_directories(${target} SYSTEM INTERFACE ${LEDA_INCLUDE_DIR}) + target_link_libraries(${target} INTERFACE ${LEDA_LIBRARIES} ${LEDA_LINKER_FLAGS}) endfunction() diff --git a/Installation/cmake/modules/CGAL_UseMPFI.cmake b/Installation/cmake/modules/CGAL_UseMPFI.cmake index c19a0d5ff36..186f807e1f9 100644 --- a/Installation/cmake/modules/CGAL_UseMPFI.cmake +++ b/Installation/cmake/modules/CGAL_UseMPFI.cmake @@ -3,7 +3,7 @@ if( MPFI_FOUND AND NOT MPFI_SETUP ) - if (GMP_FOUND AND MPFR_FOUND) + if (GMP_FOUND AND MPFR_FOUND) message( STATUS "UseMPFI" ) message( STATUS "MPFI include: ${MPFI_INCLUDE_DIR}" ) @@ -30,11 +30,7 @@ if( MPFI_FOUND AND NOT MPFI_SETUP ) add_definitions( ${MPFI_DEFINITIONS} "-DCGAL_USE_MPFI" ) link_libraries( ${MPFI_LIBRARIES} ) else( COMPILED_MPFI_TEST AND MPFI_TEST_RESULT EQUAL 0) - if (CGAL_ENABLE_PRECONFIG) - message( STATUS "MPFI is incorrectly configured with CGAL" ) - else() - message( STATUS "MPFI is incorrectly configured on this system" ) - endif() + message( STATUS "MPFI is incorrectly configured on this system" ) message( STATUS "Output of the failed MPFI test was:\n${MPFI_TEST_COMPILATION_OUTPUT}" ) message( STATUS "End of the MPFI test output" ) diff --git a/Installation/cmake/modules/CGAL_add_test.cmake b/Installation/cmake/modules/CGAL_add_test.cmake index 07f210ff964..780c212cd30 100644 --- a/Installation/cmake/modules/CGAL_add_test.cmake +++ b/Installation/cmake/modules/CGAL_add_test.cmake @@ -5,30 +5,10 @@ set(CGAL_add_test_included TRUE) option(BUILD_TESTING "Build the testing tree." OFF) -if(NOT POLICY CMP0064) - # CMake <= 3.3 - if(BUILD_TESTING) - message(WARNING - "CGAL CTest support requires CMake 3.4 or later.\n" - "You must either disable BUILD_TESTING or upgrade CMake.") - endif() - - # Add a fake function to avoid CMake errors - function(cgal_add_compilation_test) - endfunction() - # Add a fake function to avoid CMake errors - function(cgal_setup_test_properties) - endfunction() - - # Then return, to exit the file - return() -endif() - if(BUILD_TESTING) enable_testing() endif() -cmake_policy(SET CMP0064 NEW) include(CMakeParseArguments) @@ -94,7 +74,7 @@ function(expand_list_with_globbing list_name) endfunction() function(cgal_add_compilation_test exe_name) - if(NOT POLICY CMP0064 OR TEST compilation_of__${exe_name}) + if(TEST compilation_of__${exe_name}) return() endif() add_test(NAME "compilation_of__${exe_name}" @@ -111,15 +91,11 @@ function(cgal_add_compilation_test exe_name) COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_BINARY_DIR}" --target "cgal_check_build_system" --config "$") set_property(TEST "check_build_system" APPEND PROPERTY LABELS "CGAL_build_system") - if(POLICY CMP0066) # cmake 3.7 or later - set_property(TEST "check_build_system" - PROPERTY FIXTURES_SETUP "check_build_system_SetupFixture") - endif() - endif() - if(POLICY CMP0066) # cmake 3.7 or later - set_property(TEST "compilation_of__${exe_name}" - APPEND PROPERTY FIXTURES_REQUIRED "check_build_system_SetupFixture") + set_property(TEST "check_build_system" + PROPERTY FIXTURES_SETUP "check_build_system_SetupFixture") endif() + set_property(TEST "compilation_of__${exe_name}" + APPEND PROPERTY FIXTURES_REQUIRED "check_build_system_SetupFixture") if(TARGET CGAL_Qt5_moc_and_resources) # if CGAL_Qt5 was searched, and is header-only get_property(linked_libraries TARGET "${exe_name}" PROPERTY LINK_LIBRARIES) # message(STATUS "${exe_name} depends on ${linked_libraries}") @@ -167,8 +143,7 @@ function(cgal_setup_test_properties test_name) get_filename_component(_binary_dir_abs ${CMAKE_CURRENT_BINARY_DIR} ABSOLUTE) string(FIND "${_binary_dir_abs}" "${_source_dir_abs}" _search_binary_in_source) - if(_search_binary_in_source EQUAL "-1" - AND POLICY CMP0066) # CMake 3.7 or later + if(_search_binary_in_source EQUAL "-1") if(NOT TEST ${PROJECT_NAME}_SetupFixture) if(ANDROID) add_test(NAME ${PROJECT_NAME}_SetupFixture @@ -280,7 +255,7 @@ function(cgal_add_test exe_name) set(test_name "execution___of__${exe_name}") endif() # message(" test_name: ${test_name}") - if(cgal_add_test_NO_EXECUTION OR NOT POLICY CMP0064 OR TEST ${test_name}) + if(cgal_add_test_NO_EXECUTION OR TEST ${test_name}) return() endif() # message("Add test ${test_name}") @@ -324,11 +299,11 @@ function(cgal_add_test exe_name) set(ARGS) # 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}") - list(APPEND ARGS ${CMD_LINE_ARGS}) + separate_arguments(CMD_LINE_ARGS UNIX_COMMAND ${CMD_LINE}) + # message(STATUS " args: ${CMD_LINE_ARGS}") + list(APPEND ARGS ${CMD_LINE_ARGS}) endforeach() expand_list_with_globbing(ARGS) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/Installation/cmake/modules/CGAL_display_flags.cmake b/Installation/cmake/modules/CGAL_display_flags.cmake index 777d6402898..5367ac3c0e7 100644 --- a/Installation/cmake/modules/CGAL_display_flags.cmake +++ b/Installation/cmake/modules/CGAL_display_flags.cmake @@ -10,12 +10,4 @@ string( TOUPPER "${CMAKE_BUILD_TYPE}" CGAL_BUILD_TYPE_UPPER ) message( STATUS "USING CXXFLAGS = '${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${CGAL_BUILD_TYPE_UPPER}}'" ) -if ( CGAL_BUILDING_LIBS ) - if ( BUILD_SHARED_LIBS ) - message( STATUS "USING LDFLAGS = '${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_${CGAL_BUILD_TYPE_UPPER}}'" ) - else() - message( STATUS "USING LDFLAGS = '${CMAKE_STATIC_LINKER_FLAGS} ${CMAKE_STATIC_LINKER_FLAGS_${CGAL_BUILD_TYPE_UPPER}}'" ) - endif() -else() - message( STATUS "USING EXEFLAGS = '${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CGAL_BUILD_TYPE_UPPER}}'" ) -endif() +message( STATUS "USING EXEFLAGS = '${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CGAL_BUILD_TYPE_UPPER}}'" ) diff --git a/Installation/cmake/modules/CGAL_pointmatcher_support.cmake b/Installation/cmake/modules/CGAL_pointmatcher_support.cmake index c023102661f..7323feae702 100644 --- a/Installation/cmake/modules/CGAL_pointmatcher_support.cmake +++ b/Installation/cmake/modules/CGAL_pointmatcher_support.cmake @@ -1,7 +1,16 @@ if(libpointmatcher_FOUND AND NOT TARGET CGAL::pointmatcher_support) - add_library(CGAL::pointmatcher_support INTERFACE IMPORTED) - set_target_properties(CGAL::pointmatcher_support PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_POINTMATCHER" - INTERFACE_INCLUDE_DIRECTORIES "${libpointmatcher_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "${libpointmatcher_LIBRARIES}") + find_package(Boost COMPONENTS thread filesystem system program_options date_time chrono) + if(Boost_chrono_FOUND + AND Boost_thread_FOUND + AND Boost_filesystem_FOUND + AND Boost_system_FOUND + AND Boost_program_options_FOUND + AND Boost_date_time_FOUND) + add_library(CGAL::pointmatcher_support INTERFACE IMPORTED) + target_compile_definitions(CGAL::pointmatcher_support INTERFACE "CGAL_LINKED_WITH_POINTMATCHER") + target_include_directories(CGAL::pointmatcher_support INTERFACE "${libpointmatcher_INCLUDE_DIR}") + target_link_libraries(CGAL::pointmatcher_support INTERFACE "${libpointmatcher_LIBRARIES}") + else() + message(STATUS "NOTICE : the libpointmatcher library requires the following boost components: thread filesystem system program_options date_time chrono.") + endif() endif() diff --git a/Installation/cmake/modules/CGAL_setup_target_dependencies.cmake b/Installation/cmake/modules/CGAL_setup_target_dependencies.cmake index 73a357b4d08..bed40154c80 100644 --- a/Installation/cmake/modules/CGAL_setup_target_dependencies.cmake +++ b/Installation/cmake/modules/CGAL_setup_target_dependencies.cmake @@ -1,17 +1,11 @@ function(CGAL_setup_target_dependencies target) - if(ARGV1 STREQUAL INTERFACE) - set(keyword INTERFACE) - else() - set(keyword PUBLIC) - endif() - if(${target} STREQUAL CGAL) - CGAL_setup_CGAL_dependencies(${target} ${keyword}) + CGAL_setup_CGAL_dependencies(${target}) elseif(${target} STREQUAL CGAL_Core) - CGAL_setup_CGAL_Core_dependencies(${target} ${keyword}) + CGAL_setup_CGAL_Core_dependencies(${target}) elseif(${target} STREQUAL CGAL_ImageIO) - CGAL_setup_CGAL_ImageIO_dependencies(${target} ${keyword}) + CGAL_setup_CGAL_ImageIO_dependencies(${target}) elseif(${target} STREQUAL CGAL_Qt5) - CGAL_setup_CGAL_Qt5_dependencies(${target} ${keyword}) + CGAL_setup_CGAL_Qt5_dependencies(${target}) endif() endfunction() diff --git a/Installation/cmake/modules/FindIPE.cmake b/Installation/cmake/modules/FindIPE.cmake index 784bc90a817..e9885a56e12 100644 --- a/Installation/cmake/modules/FindIPE.cmake +++ b/Installation/cmake/modules/FindIPE.cmake @@ -10,14 +10,14 @@ # Is it already configured? if (IPE_INCLUDE_DIR AND IPE_LIBRARIES AND IPE_FULL_VERSION) set(IPE_FOUND TRUE) -else() - find_path(IPE_INCLUDE_DIR +else() + find_path(IPE_INCLUDE_DIR NAMES ipelib.h PATHS /usr/include /usr/local/include ) - find_library(IPE_LIBRARIES + find_library(IPE_LIBRARIES NAMES ipe PATHS /usr/lib /usr/local/lib @@ -26,7 +26,7 @@ else() if(IPE_INCLUDE_DIR) file(READ "${IPE_INCLUDE_DIR}/ipebase.h" IPEBASE_H) - string(REGEX MATCH "IPELIB_VERSION[ ]*=[ ]*([67])([0-9][0-9])([0-9][0-9]);" FOUND_IPE_VERSION "${IPEBASE_H}") + string(REGEX MATCH "IPELIB_VERSION[ ]*=[ ]*([6789])([0-9][0-9])([0-9][0-9]);" FOUND_IPE_VERSION "${IPEBASE_H}") if (FOUND_IPE_VERSION) set(IPE_VERSION ${CMAKE_MATCH_1} CACHE INTERNAL "Ipe version major number") set(IPE_MINOR_VERSION_1 ${CMAKE_MATCH_2} CACHE INTERNAL "Ipe version minor number") diff --git a/Installation/cmake/modules/UseCGAL.cmake b/Installation/cmake/modules/UseCGAL.cmake index 0187802b524..4d44ca90219 100644 --- a/Installation/cmake/modules/UseCGAL.cmake +++ b/Installation/cmake/modules/UseCGAL.cmake @@ -27,8 +27,6 @@ if(NOT USE_CGAL_FILE_INCLUDED) use_component( ${component} ) endforeach() - use_essential_libs() - include_directories( "${CMAKE_CURRENT_BINARY_DIR}" ) if(TARGET CGAL::CGAL) @@ -46,16 +44,8 @@ if(NOT USE_CGAL_FILE_INCLUDED) include_directories ( SYSTEM ${CGAL_3RD_PARTY_INCLUDE_DIRS} ) add_definitions ( ${CGAL_3RD_PARTY_DEFINITIONS} ${CGAL_DEFINITIONS} ) - if (CGAL_HEADER_ONLY) - if(NOT CGAL_NO_BLANKET_LINKING) - link_directories ( ${CGAL_3RD_PARTY_LIBRARIES_DIRS} ) - link_libraries ( ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} ) - endif() - else() - if(NOT CGAL_NO_BLANKET_LINKING) - link_directories ( ${CGAL_LIBRARIES_DIR} ${CGAL_3RD_PARTY_LIBRARIES_DIRS} ) - link_libraries ( ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} ) - endif() + 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/cmake/modules/UseEigen3.cmake b/Installation/cmake/modules/UseEigen3.cmake index ccdb6682bd7..de98158bad4 100644 --- a/Installation/cmake/modules/UseEigen3.cmake +++ b/Installation/cmake/modules/UseEigen3.cmake @@ -8,4 +8,4 @@ add_definitions(-DCGAL_EIGEN3_ENABLED) set (EIGEN3_SETUP TRUE) -message(DEPRECATION "This file UseEigen.cmake is deprecated, and the imported target `CGAL::Eigen_support` from CGAL_Eigen_support.cmake should be used instead.") +message(DEPRECATION "This file UseEigen.cmake is deprecated, and the imported target `CGAL::Eigen3_support` from CGAL_Eigen3_support.cmake should be used instead.") diff --git a/Installation/demo/CMakeLists.txt b/Installation/demo/CMakeLists.txt index 8f0b28cb33a..0e2de825566 100644 --- a/Installation/demo/CMakeLists.txt +++ b/Installation/demo/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1...3.15) +cmake_minimum_required(VERSION 3.12...3.18) project(CGAL_DEMOS) if(CGAL_BRANCH_BUILD) @@ -17,10 +17,8 @@ endif() list(SORT list) -if(NOT CGAL_BUILDING_LIBS) - find_package(CGAL REQUIRED) - include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake) -endif() +find_package(CGAL REQUIRED) +include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake) message("== Generating build files for demos ==") foreach(entry ${list}) diff --git a/Installation/examples/CMakeLists.txt b/Installation/examples/CMakeLists.txt index cf7b9e215a2..24cf289021b 100644 --- a/Installation/examples/CMakeLists.txt +++ b/Installation/examples/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1...3.15) +cmake_minimum_required(VERSION 3.12...3.18) project(CGAL_EXAMPLES) if(CGAL_BRANCH_BUILD) @@ -17,10 +17,8 @@ endif() list(SORT list) -if(NOT CGAL_BUILDING_LIBS) - find_package(CGAL REQUIRED) - include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake) -endif() +find_package(CGAL REQUIRED) +include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake) message("== Generating build files for examples ==") foreach(entry ${list}) diff --git a/Installation/lib/cmake/CGAL/CGALConfig.cmake b/Installation/lib/cmake/CGAL/CGALConfig.cmake index dd8794fc047..549c1abc31e 100644 --- a/Installation/lib/cmake/CGAL/CGALConfig.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfig.cmake @@ -9,8 +9,6 @@ set(CGAL_LIBRARIES CGAL) get_filename_component(CGAL_CONFIG_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -set(CGAL_HEADER_ONLY TRUE) - #set CGAL_DATA_DIR if (NOT CGAL_DATA_DIR) if(DEFINED ENV{CGAL_DATA_DIR}) @@ -62,10 +60,10 @@ if(BRANCH_BUILD) foreach(package_dir ${packages_dirs}) set(inc_dir ${package_dir}/include) if(IS_DIRECTORY ${inc_dir} - AND IS_DIRECTORY ${package_dir}/package_info) + AND IS_DIRECTORY ${package_dir}/package_info) list(APPEND CGAL_INCLUDE_DIRS ${inc_dir}) if(EXISTS ${inc_dir}/CGAL/config.h) - set(CGAL_FOUND TRUE) + set(CGAL_FOUND TRUE) endif() endif() endforeach() @@ -108,21 +106,15 @@ include(${CGAL_MODULES_DIR}/CGAL_TweakFindBoost.cmake) set(CGAL_USE_FILE ${CGAL_MODULES_DIR}/UseCGAL.cmake) - -if(CGAL_BUILDING_LIBS) - foreach(comp ${CGAL_FIND_COMPONENTS}) - if(CGAL_${comp}_FOUND) - list(APPEND CGAL_LIBRARIES CGAL_${comp}) - endif() - endforeach() - return() -endif() - foreach(comp ${CGAL_FIND_COMPONENTS}) if(NOT comp MATCHES "Core|ImageIO|Qt5") message(FATAL_ERROR "The requested CGAL component ${comp} does not exist!") endif() - list(APPEND CGAL_LIBRARIES CGAL_${comp}) + if(comp MATCHES "Core" AND CGAL_DISABLE_GMP) + message("CGAL_Core needs GMP and won't be used.") + else() + list(APPEND CGAL_LIBRARIES CGAL_${comp}) + endif() endforeach() set(CGALConfig_all_targets_are_defined TRUE) @@ -165,15 +157,11 @@ include(CGAL_setup_target_dependencies) foreach(cgal_lib ${CGAL_LIBRARIES}) set(WITH_${cgal_lib} TRUE) if(${cgal_lib}_FOUND AND NOT TARGET ${cgal_lib}) - if(CGAL_BUILDING_LIBS OR CMAKE_VERSION VERSION_LESS "3.11") - add_library(${cgal_lib} INTERFACE) - else() - add_library(${cgal_lib} INTERFACE IMPORTED GLOBAL) - endif() + add_library(${cgal_lib} INTERFACE IMPORTED GLOBAL) if(NOT TARGET CGAL::${cgal_lib}) add_library(CGAL::${cgal_lib} ALIAS ${cgal_lib}) endif() - CGAL_setup_target_dependencies(${cgal_lib} INTERFACE) + CGAL_setup_target_dependencies(${cgal_lib}) endif() endforeach() diff --git a/Installation/src/CGAL/CMakeLists.txt b/Installation/src/CGAL/CMakeLists.txt deleted file mode 100644 index d4474a5138f..00000000000 --- a/Installation/src/CGAL/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -message("Configuring libCGAL") - -collect_cgal_library(CGAL "") - -include(CGAL_SetupCGALDependencies) - -if(CGAL_HEADER_ONLY) - set(keyword "INTERFACE") -endif() - -cgal_setup_cgal_dependencies(CGAL ${keyword}) - -if(NOT CGAL_HEADER_ONLY) - target_compile_definitions(CGAL INTERFACE CGAL_NOT_HEADER_ONLY=1) -endif() - -if(NOT CGAL_DISABLE_GMP) - get_dependency_version(GMP) - get_dependency_version(MPFR) -endif() - -message( - STATUS - "USING BOOST_VERSION = '${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}'" -) - -message("libCGAL is configured") diff --git a/Installation/src/CGAL_libs_verinfo.rc.in b/Installation/src/CGAL_libs_verinfo.rc.in deleted file mode 100644 index 56a65021857..00000000000 --- a/Installation/src/CGAL_libs_verinfo.rc.in +++ /dev/null @@ -1,68 +0,0 @@ -# if defined(UNDER_CE) -# include -# else -# include -# endif - -// The following is set by CMake -#cmakedefine CGAL_BRANCH_BUILD - -// The values of the following variable are filled by CMake -#define CGAL_LIB_NAME @LIBRARY_NAME@ -#define CGAL_VERSION_MAJOR @CGAL_MAJOR_VERSION@ -#define CGAL_VERSION_MINOR @CGAL_MINOR_VERSION@ -#define CGAL_VERSION_PATCH @CGAL_BUGFIX_VERSION@ -#define CGAL_VERSION_BUILD @CGAL_BUILD_VERSION@ -#ifdef _DEBUG -# define CGAL_LIB_FULLNAME "@DEBUG_MANGLED_NAME@.dll" -#else -# define CGAL_LIB_FULLNAME "@RELEASE_MANGLED_NAME@.dll" -#endif - -#define CGAL_VER_EMPTY_STR "\0" -#define CGAL_VER_xxstr(s) #s -#define CGAL_VER_xstr(s) CGAL_VER_xxstr(s) CGAL_VER_EMPTY_STR -#define CGAL_VER_str(s) CGAL_VER_xstr(s) - -#define CGAL_VER_VERSION CGAL_VERSION_MAJOR,CGAL_VERSION_MINOR,CGAL_VERSION_PATCH,CGAL_VERSION_BUILD -#define CGAL_VER_VERSION_STR CGAL_VER_str(CGAL_VERSION_MAJOR) "." CGAL_VER_str(CGAL_VERSION_MINOR) "." CGAL_VER_str(CGAL_VERSION_PATCH) "." CGAL_VER_str(CGAL_VERSION_BUILD) -#define CGAL_VER_COMPANYNAME_STR "The CGAL Project, https://www.cgal.org/\0" -#define CGAL_VER_FILEDESCRIPTION_STR "@LIBRARY_NAME@ Library\0" -#define CGAL_VER_FILEVERSION_STR CGAL_VER_VERSION_STR -#define CGAL_VER_ORIGINALFILENAME_STR CGAL_LIB_FULLNAME CGAL_VER_EMPTY_STR -#define CGAL_VER_PRODUCTNAME_STR "CGAL\0" -#define CGAL_VER_PRODUCTVERSION_STR CGAL_VER_VERSION_STR - -VS_VERSION_INFO VERSIONINFO - FILEVERSION CGAL_VER_VERSION - PRODUCTVERSION CGAL_VER_VERSION - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_DLL - FILESUBTYPE 0x0L - BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", CGAL_VER_COMPANYNAME_STR - VALUE "FileDescription", CGAL_VER_FILEDESCRIPTION_STR - VALUE "FileVersion", CGAL_VER_FILEVERSION_STR - VALUE "OriginalFilename", CGAL_VER_ORIGINALFILENAME_STR - VALUE "ProductName", CGAL_VER_PRODUCTNAME_STR - VALUE "ProductVersion", CGAL_VER_PRODUCTVERSION_STR - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END - END -/* End of Version info */ - diff --git a/Installation/src/CMakeLists.txt b/Installation/src/CMakeLists.txt deleted file mode 100644 index a4684d2b13b..00000000000 --- a/Installation/src/CMakeLists.txt +++ /dev/null @@ -1,276 +0,0 @@ -function(collect_cgal_library LIBRARY_NAME ADDITIONAL_FILES) - - if(NOT CGAL_HEADER_ONLY) - # IMPORTANT: First delete all_files.cpp - if(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/all_files.cpp) - file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/all_files.cpp) - endif() - - # THEN collect *.cpp - foreach(package ${CGAL_CONFIGURED_PACKAGES}) - file(GLOB CGAL_LIBRARY_SOURCE_FILES_TMP - ${package}/src/${LIBRARY_NAME}/*.cpp) - list(SORT CGAL_LIBRARY_SOURCE_FILES_TMP) - foreach(file ${CGAL_LIBRARY_SOURCE_FILES_TMP}) - if(NOT ${file} MATCHES "/qrc_.*") - list(APPEND CGAL_LIBRARY_SOURCE_FILES ${file}) - endif() - endforeach() - endforeach() - - foreach(source ${CGAL_LIBRARY_SOURCE_FILES}) - # It may happen that a file all_files.cpp had been created in-source by - # a previous in-source build. We certainly do not want to include that - # file in the new all_files.cpp because .cpp files would be included - # twice, and that breaks the one-definition rule (ODR). - if(NOT source MATCHES ".*/all_files.cpp") - file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/all_files.cpp - "\#include \"${source}\"\n") - endif() - endforeach() - endif() - - if(CGAL_BUILD_SHARED_LIBS) - set(CGAL_LIB_PREFIX "") - else() - set(CGAL_LIB_PREFIX "lib") - endif() - - set(RELEASE_MANGLED_NAME - "${CGAL_LIB_PREFIX}${LIBRARY_NAME}-${CGAL_TOOLSET}-mt-${CGAL_FULL_VERSION}" - ) - set(DEBUG_MANGLED_NAME - "${CGAL_LIB_PREFIX}${LIBRARY_NAME}-${CGAL_TOOLSET}-mt-gd-${CGAL_FULL_VERSION}" - ) - - if(CGAL_BUILD_SHARED_LIBS AND WIN32) - configure_file(${CGAL_INSTALLATION_PACKAGE_DIR}/src/CGAL_libs_verinfo.rc.in - ${LIBRARY_NAME}_verinfo.rc @ONLY) - set(rc_file ${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}_verinfo.rc) - else() - set(rc_file) - endif() - - if(NOT CGAL_HEADER_ONLY) - add_library(${LIBRARY_NAME} ${CMAKE_CURRENT_BINARY_DIR}/all_files.cpp - ${rc_file} ${ADDITIONAL_FILES}) - # add_library (${LIBRARY_NAME} ${CGAL_LIBRARY_SOURCE_FILES} ${rc_file} ${ADDITIONAL_FILES}) # builing not creating temporary all_files.cpp - if(${LIBRARY_NAME}_SOVERSION AND ${LIBRARY_NAME}_SONAME_VERSION) - set_target_properties( - ${LIBRARY_NAME} - PROPERTIES VERSION "${${LIBRARY_NAME}_SOVERSION}" - SOVERSION "${${LIBRARY_NAME}_SONAME_VERSION}") - elseif(CGAL_SOVERSION AND CGAL_SONAME_VERSION) - set_target_properties( - ${LIBRARY_NAME} PROPERTIES VERSION "${CGAL_SOVERSION}" - SOVERSION "${CGAL_SONAME_VERSION}") - endif() - else() - if(${LIBRARY_NAME}_LIB_DEPENDS) - # Fix a bug when CGAL is configured first without `CGAL_HEADER_ONLY` - # and then `CGAL_HEADER_ONLY` is set without cleaning the cache. - unset(${LIBRARY_NAME}_LIB_DEPENDS CACHE) - endif() - add_library(${LIBRARY_NAME} INTERFACE) - endif() - - # Add an alias with the prefix `CGAL::`, so that consumer - # CMakeLists.txt can be the target like if it was an imported - # target. - add_library(CGAL::${LIBRARY_NAME} ALIAS ${LIBRARY_NAME}) - if(NOT TARGET ALL_CGAL_TARGETS) - add_custom_target(ALL_CGAL_TARGETS) - endif() - add_dependencies(ALL_CGAL_TARGETS ${LIBRARY_NAME}) - if(CGAL_AUTO_LINK_ENABLED) - if(NOT CGAL_HEADER_ONLY) - set_target_properties( - ${LIBRARY_NAME} - PROPERTIES OUTPUT_NAME_DEBUG "${DEBUG_MANGLED_NAME}" - OUTPUT_NAME_RELEASE "${RELEASE_MANGLED_NAME}" - OUTPUT_NAME_MINSIZEREL "${RELEASE_MANGLED_NAME}" - OUTPUT_NAME_RELWITHDEBINFO "${RELEASE_MANGLED_NAME}") - - if(HAS_CFG_INTDIR) - add_custom_command( - TARGET ${LIBRARY_NAME} - POST_BUILD - COMMAND if exist \"$(TargetDir)$(TargetName).dll\" copy /Y - \"$(TargetDir)$(TargetName).dll\" \"$(TargetDir)..\") - add_custom_command( - TARGET ${LIBRARY_NAME} - POST_BUILD - COMMAND if exist \"$(TargetDir)$(TargetName).pdb\" copy /Y - \"$(TargetDir)$(TargetName).pdb\" \"$(TargetDir)..\") - add_custom_command( - TARGET ${LIBRARY_NAME} - POST_BUILD - COMMAND - if exist - \"$(SolutionDir)lib\\$(ConfigurationName)\\$(TargetName).lib\" copy - /Y \"$(SolutionDir)lib\\$(ConfigurationName)\\$(TargetName).lib\" - \"$(SolutionDir)lib\") - endif() - endif() - endif() - - if(NOT CGAL_HEADER_ONLY) - install( - TARGETS ${LIBRARY_NAME} - EXPORT ${LIBRARY_NAME}Exports - RUNTIME DESTINATION "${CGAL_INSTALL_BIN_DIR}" - LIBRARY DESTINATION "${CGAL_INSTALL_LIB_DIR}" - ARCHIVE DESTINATION "${CGAL_INSTALL_LIB_DIR}") - install( - EXPORT ${LIBRARY_NAME}Exports - DESTINATION "${CGAL_INSTALL_CMAKE_DIR}" - NAMESPACE CGAL::) - - # We have to call configure_file twice to force double expansion of variables. - configure_file("${CGAL_MODULES_DIR}/CGALLibConfig.cmake.in" - "${CMAKE_BINARY_DIR}/${LIBRARY_NAME}LibConfig.cmake" @ONLY) - configure_file("${CMAKE_BINARY_DIR}/${LIBRARY_NAME}LibConfig.cmake" - "${CMAKE_BINARY_DIR}/${LIBRARY_NAME}LibConfig.cmake" @ONLY) - install(FILES "${CMAKE_BINARY_DIR}/${LIBRARY_NAME}LibConfig.cmake" - DESTINATION ${CGAL_INSTALL_CMAKE_DIR}) - endif() -endfunction() - -function(configure_component DIR COMPONENT) - set(enabled_by_default ON) - option(WITH_${COMPONENT} "Enable CGAL component ${COMPONENT}" - ${enabled_by_default}) - if(WITH_${COMPONENT}) - add_subdirectory(${DIR} ${COMPONENT}) - endif() -endfunction() - -# Output directory of libraries (.so, .dylib, non-static .lib) -set(CGAL_LIBRARIES_DIR ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CGAL_LIBRARIES_DIR}) -# Output directory of static libraries (.a, static .lib) -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CGAL_LIBRARIES_DIR}) - -# For output directory of DLLs (.dll files) -set(CGAL_RUNTIME_DIR ${CMAKE_BINARY_DIR}/bin) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CGAL_RUNTIME_DIR}) - -## Prevent use of intermediate directory with MSVC, because we use name -## mangling -#foreach(Conf_type ${CMAKE_CONFIGURATION_TYPES}) -# # Conf_type is Debug, Release, DebWithDebInfo... -# string(TOUPPER ${Conf_type} CONF_TYPE) -# # CONF_TYPE is DEBUG, RELEASE, DEBWITHDEBINFO -# set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONF_TYPE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) -# set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONF_TYPE} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}) -# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONF_TYPE} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) -#endforeach() - -# TODO: Seems useless, because it is called again in ../CMakeLists.txt -# Should probably be removed. -- Laurent Rineau, 2014/07/22 -if(NOT CGAL_HEADER_ONLY) - create_cgalconfig_files() -endif() - -set(CGAL_DIR ${CMAKE_BINARY_DIR}) - -add_subdirectory(CGAL) - -# search libs -set(CGAL_CONFIGURED_LIBRARIES "") - -foreach(package ${CGAL_CONFIGURED_PACKAGES}) - file(GLOB CONFIGURED_LIBS_IN_PACKAGE ${package}/src/CGAL_*/CMakeLists.txt) - list(SORT CONFIGURED_LIBS_IN_PACKAGE) - foreach(libconfigfile ${CONFIGURED_LIBS_IN_PACKAGE}) - get_filename_component(CGAL_CONFIGURED_LIBRARY_NAME ${libconfigfile} PATH) - get_filename_component(CGAL_CONFIGURED_LIBRARY_NAME - ${CGAL_CONFIGURED_LIBRARY_NAME} NAME) - - if(NOT ${CGAL_CONFIGURED_LIBRARY_NAME} STREQUAL "CGAL") - - message( - STATUS - "Sources for CGAL component library '${CGAL_CONFIGURED_LIBRARY_NAME}' detected" - ) - list(APPEND CGAL_CONFIGURED_LIBRARIES ${CGAL_CONFIGURED_LIBRARY_NAME}) - #message(STATUS "Library config detected: ${CGAL_CONFIGURED_LIBRARIES}") - - cache_set(${CGAL_CONFIGURED_LIBRARY_NAME}_LIBRARY "") - cache_set(${CGAL_CONFIGURED_LIBRARY_NAME}_3RD_PARTY_DEFINITIONS "") - cache_set(${CGAL_CONFIGURED_LIBRARY_NAME}_3RD_PARTY_INCLUDE_DIRS "") - cache_set(${CGAL_CONFIGURED_LIBRARY_NAME}_3RD_PARTY_LIBRARIES "") - cache_set(${CGAL_CONFIGURED_LIBRARY_NAME}_3RD_PARTY_LIBRARIES_DIRS "") - if(${CGAL_CONFIGURED_LIBRARY_NAME} STREQUAL "CGAL_Core") - if(NOT CGAL_NO_CORE) - configure_component(${package}/src/${CGAL_CONFIGURED_LIBRARY_NAME} - ${CGAL_CONFIGURED_LIBRARY_NAME}) - else(NOT CGAL_NO_CORE) - message( - STATUS - "CGAL_Core is not being configured (missing GMP, or 64bit architecture)." - ) - endif(NOT CGAL_NO_CORE) - else() - configure_component(${package}/src/${CGAL_CONFIGURED_LIBRARY_NAME} - ${CGAL_CONFIGURED_LIBRARY_NAME}) - endif() - - cache_get(${CGAL_CONFIGURED_LIBRARY_NAME}_LIBRARY) - - cache_get(${CGAL_CONFIGURED_LIBRARY_NAME}_3RD_PARTY_DEFINITIONS) - cache_get(${CGAL_CONFIGURED_LIBRARY_NAME}_3RD_PARTY_INCLUDE_DIRS) - cache_get(${CGAL_CONFIGURED_LIBRARY_NAME}_3RD_PARTY_LIBRARIES) - cache_get(${CGAL_CONFIGURED_LIBRARY_NAME}_3RD_PARTY_LIBRARIES_DIRS) - - else() - - list(APPEND CGAL_CONFIGURED_LIBRARIES CGAL) - - endif() - endforeach() -endforeach() - -if(NOT CGAL_CONFIGURED_LIBRARIES) - message( - FATAL_ERROR - "No component library in configured packages found. Please fix package-file." - ) -endif() - -list(REMOVE_DUPLICATES CGAL_CONFIGURED_LIBRARIES) -list(SORT CGAL_CONFIGURED_LIBRARIES) -cache_set(CGAL_CONFIGURED_LIBRARIES "${CGAL_CONFIGURED_LIBRARIES}") - -# CGAL_CONFIGURED_LIBRARIES is a virtually useless variable, because -# we do not know if those components actually created a target. It -# might seem bad that we hardcode the target names here, but they have -# always been hardcoded in the CGALConfig files, so we do not make it -# any worse. We can also not use export(EXPORT) since that is only -# available in newer CMake versions. -set(CGAL_ACTUAL_CONFIGURED_LIBRARIES "") -macro(CGAL_add_if_target TARGET) - if(TARGET ${TARGET}) - list(APPEND CGAL_ACTUAL_CONFIGURED_LIBRARIES ${TARGET}) - endif() -endmacro() - -cgal_add_if_target(CGAL) -cgal_add_if_target(CGAL_Core) -cgal_add_if_target(CGAL_ImageIO) -cgal_add_if_target(CGAL_Qt5) - -cache_set(CGAL_ACTUAL_CONFIGURED_LIBRARIES - "${CGAL_ACTUAL_CONFIGURED_LIBRARIES}") - -if(NOT CGAL_HEADER_ONLY) - export( - TARGETS ${CGAL_ACTUAL_CONFIGURED_LIBRARIES} - NAMESPACE CGAL:: - FILE "${CMAKE_BINARY_DIR}/CGALExports.cmake") -endif() - -message( - STATUS - "Sources for CGAL component libraries '${CGAL_CONFIGURED_LIBRARIES}' detected" -) diff --git a/Installation/test/CMakeLists.txt b/Installation/test/CMakeLists.txt index d01cbc74f7c..417295084e0 100644 --- a/Installation/test/CMakeLists.txt +++ b/Installation/test/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1...3.15) +cmake_minimum_required(VERSION 3.12...3.18) project(CGAL_TESTS) if(CGAL_BRANCH_BUILD) @@ -17,10 +17,8 @@ endif() list(SORT list) -if(NOT CGAL_BUILDING_LIBS) - find_package(CGAL REQUIRED) - include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake) -endif() +find_package(CGAL REQUIRED) +include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake) message("== Generating build files for tests ==") foreach(entry ${list}) diff --git a/Installation/test/Installation/CMakeLists.txt b/Installation/test/Installation/CMakeLists.txt index f22bddd7708..684b9f40731 100644 --- a/Installation/test/Installation/CMakeLists.txt +++ b/Installation/test/Installation/CMakeLists.txt @@ -1,7 +1,8 @@ # Created by the script cgal_create_cmake_script # This is the CMake script for compiling a CGAL application. -cmake_minimum_required(VERSION 3.11...3.15) +cmake_minimum_required(VERSION 3.12...3.18) + project( Installation_Tests ) @@ -55,7 +56,7 @@ endif() create_link_to_program(CGAL) -if(WITH_CGAL_Core) +if ( CGAL_Core_FOUND ) create_link_to_program(CGAL_Core) endif() @@ -63,6 +64,7 @@ if(WITH_CGAL_ImageIO) create_link_to_program(CGAL_ImageIO) 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) @@ -77,7 +79,7 @@ else() endif() if(WITH_CGAL_Qt5) - find_package(Qt5 QUIET) + find_package(Qt5 QUIET COMPONENTS Core) if(Qt5_FOUND) create_link_to_program(CGAL_Qt5) endif() @@ -221,7 +223,7 @@ list(APPEND test_config_lst "test_config_file_3") if(CGAL_Qt5_FOUND) #configure cgal for a non standard install with qt5 add_test(NAME config_non_standard_cgal_qt5 - COMMAND ${CMAKE_COMMAND} ${GENERATOR} ${INIT_FILE} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${NON_STANDARD_INSTALL_PREFIX}/non_standard_install_qt5 -DCGAL_INSTALL_LIB_DIR=lib -DWITH_CGAL_Qt5=ON + COMMAND ${CMAKE_COMMAND} ${GENERATOR} ${INIT_FILE} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${NON_STANDARD_INSTALL_PREFIX}/non_standard_install_qt5 -DCGAL_INSTALL_LIB_DIR=lib "${CGAL_SOURCE_DIR}" WORKING_DIRECTORY "${NON_STANDARD_INSTALL_PREFIX}/non_standard_build_qt5") #install cgal in the non standard place diff --git a/Interpolation/TODO b/Interpolation/TODO index b1cde04626a..574426e92ef 100644 --- a/Interpolation/TODO +++ b/Interpolation/TODO @@ -181,6 +181,6 @@ long and hold to much information at once for a manual. For example: predicate you have to read at least twice before getting the meaning. More, but simpler sentences would do a lot, especially as people look up the manual on the web. Partly it just simply reads more like a -scientific paper then like a manual. +scientific paper than like a manual. =================== 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 5dc93e65edd..49f64fa5fca 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 @@ -26,17 +26,17 @@ CGAL_DO_INTERSECT_FUNCTION(Plane_3, Line_3, 3) template < class K > inline boost::optional -intersection_point(const Plane_3& plane, const Line_3& line) +intersection_point_for_polyhedral_envelope(const Plane_3& plane, const Line_3& line) { - return K().intersect_point_3_object()(plane, line); + return K().intersect_point_3_for_polyhedral_envelope_object()(plane, line); } template < class K > inline boost::optional - intersection_point(const Line_3& line, const Plane_3& plane) + intersection_point_for_polyhedral_envelope(const Line_3& line, const Plane_3& plane) { - return K().intersect_point_3_object()(plane, line); + return K().intersect_point_3_for_polyhedral_envelope_object()(plane, line); } } diff --git a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3.h b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3.h index 5f3a176056c..7f82f23b740 100644 --- a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3.h +++ b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3.h @@ -26,9 +26,9 @@ CGAL_DO_INTERSECT_FUNCTION_SELF(Plane_3, 3) template < class K > inline boost::optional -intersection_point(const Plane_3& p0, const Plane_3& p1, const Plane_3& p2) +intersection_point_for_polyhedral_envelope(const Plane_3& p0, const Plane_3& p1, const Plane_3& p2) { - return K().intersect_point_3_object()(p0, p1, p2); + return K().intersect_point_3_for_polyhedral_envelope_object()(p0, p1, p2); } } 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 977c7dcc584..270693f2fb9 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 @@ -8,7 +8,7 @@ // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // -// Author(s) : Maxime Gimeno +// Author(s) : Sebastien Loriot and Andreas Fabri // #ifndef CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_PLANE_3_INTERSECTION_H @@ -16,320 +16,195 @@ #include #include +#include -#include -#include -#include - -#include +#include +#include namespace CGAL { namespace Intersections { namespace internal { -template -void filter_points(std::vector& input, - std::vector& output) -{ - std::sort(input.begin(), input.end()); - auto last = std::unique(input.begin(), input.end()); - input.erase(last, input.end()); - output = std::move(input); -} - -//Tetrahedron_3 Line_3 +//Iso_cuboid_3 Plane_3 template typename Intersection_traits::result_type intersection( - const typename K::Iso_cuboid_3 &cub, - const typename K::Plane_3 &pl, - const K& k) + const typename K::Iso_cuboid_3& cub, + const typename K::Plane_3& plane, + const K& k) { typedef typename K::Point_3 Point_3; - typedef typename K::Segment_3 Segment_3; - typedef typename K::Line_3 Line_3; - typedef typename K::Plane_3 Plane_3; - typedef std::vector Poly; + typedef typename Intersection_traits::result_type result_type; + typename K::Oriented_side_3 oriented_side = k.oriented_side_3_object(); - typedef typename Intersection_traits, - CGAL::Plane_3 >::result_type result_type; + std::vector corners(8); + corners.reserve(14); // 8 corners + up to 6 polygon points + corners[0] = cub[0]; + corners[1] = cub[3]; + corners[2] = cub[2]; + corners[3] = cub[1]; + corners[4] = cub[5]; + corners[5] = cub[4]; + corners[6] = cub[7]; + corners[7] = cub[6]; - typedef typename Intersection_traits, - CGAL::Plane_3 >::result_type Inter_type; + const std::array orientations { { + oriented_side(plane, corners[0]), + oriented_side(plane, corners[1]), + oriented_side(plane, corners[2]), + oriented_side(plane, corners[3]), + oriented_side(plane, corners[4]), + oriented_side(plane, corners[5]), + oriented_side(plane, corners[6]), + oriented_side(plane, corners[7]) + } }; - std::vector edges; - edges.reserve(12); + // description of faces of the bbox + constexpr std::array face_indices + { { 0, 1, 2, 3, + 2, 1, 5, 6, + 3, 2, 6, 7, + 1, 0, 4, 5, + 4, 0, 3, 7, + 6, 5, 4, 7 } }; - //get all edges of cub - for(int i=0; i< 4; ++i) - edges.emplace_back(cub.vertex(i), cub.vertex((i+1)%4)); - for(int i=0; i < 4; ++i) - edges.emplace_back(cub.vertex(i+4), cub.vertex((i+1)%4+4)); - for(int i=0; i < 4; ++i) - edges.emplace_back(cub.vertex(i), cub.vertex((i+1)%4+4)); + constexpr std::array edge_indices + { { 0, 1, 2, 3, + 1, 4, 5, 6, + 2, 6, 7, 8, + 0, 9, 10, 4, + 9, 3, 8, 11, + 5, 10, 11, 7 } }; - //get all intersections between pl and cub edges - std::vector segments; - std::vector points; + std::array edge_ipt_id; + edge_ipt_id.fill(-1); - for(int i=0; i < 12; ++i) + auto inter_pt_index = + [&plane, &corners, &edge_ipt_id](int i, int j, int edge_id) { - // Intersect_3 checks the orientation of the segment's extremities to avoid actually computing - // the intersection if possible - Inter_type inter = typename K::Intersect_3()(pl, edges[i]); - if(inter) + if (edge_ipt_id[edge_id]==-1) { - if(const Segment_3* seg = boost::get(&*inter)) - segments.push_back(*seg); - else if(const Point_3* p = boost::get(&*inter)) - points.push_back(*p); + edge_ipt_id[edge_id] = static_cast (corners.size()); + corners.push_back(typename K::Construct_plane_line_intersection_point_3() + (plane, corners[i], corners[j])); } - } - if(segments.empty() && points.empty()) - return result_type(); + return edge_ipt_id[edge_id]; + }; - switch(segments.size()) + bool all_in = true; + bool all_out = true; + + std::vector> neighbor_ids(14, {-1,-1}); + + auto add_neighbor = [&neighbor_ids](int i, int j) { - case 0: - //points dealt with later - break; - case 1: - { - //adj to an edge - if(points.size() == 4) + if (neighbor_ids[i][0] == -1 ) { + neighbor_ids[i][0] = j; + } + else { + if (neighbor_ids[i][0]!=j && neighbor_ids[i][1]==-1) { - return result_type(std::forward(segments.front())); + neighbor_ids[i][1] = j; } - //plane intersecting through an edge (not 2) - else - { - Poly res(4); - const Segment_3& entry_seg(segments.front()); - Point_3 p1, p2; - bool p1_found(false), - p2_found(false); + } + }; - for(const Point_3& p : points) + int start_id = -1; + int solo_id = -1; + // for each face of the bbox, we look for intersection of the plane with its edges + std::vector ids; + for (int i = 0; i < 6; ++i) + { + ids.clear(); + for (int k = 0; k < 4; ++k) + { + + int current_id = face_indices[4 * i + k]; + int next_id = face_indices[4 * i + (k + 1) % 4]; + int edge_id = edge_indices[4 * i + k]; + + switch (orientations[current_id]) + { + case ON_NEGATIVE_SIDE: { - if(!k.equal_3_object()(entry_seg.source(), p) - && ! k.equal_3_object()(entry_seg.target(), p)) + all_out = false; + // check for intersection of the edge + if (orientations[next_id] == ON_POSITIVE_SIDE) { - if(!p1_found) - { - p1 = p; - p1_found = true; - } - else { - p2 = p; - p2_found = true; - break; - } + ids.push_back( + inter_pt_index(current_id, next_id, edge_id)); } - } - CGAL_USE(p2_found); - CGAL_assertion(p1_found && p2_found); - res[0] = entry_seg.target(); - res[1] = p2; - res[2] = p1; - res[3] = entry_seg.source(); - - typename K::Coplanar_orientation_3 coplanar_orientation = - k.coplanar_orientation_3_object(); - - if( coplanar_orientation(res[0], res[1], res[2]) - != coplanar_orientation(res[0], res[1], res[3])) - { - std::swap(res[1], res[2]); - } - - return result_type(std::forward(res)); - } - } - break; - - case 2: //intersects diagonally - { - Poly res(4); - Segment_3 &front(segments.front()), - &back(segments.back()); - res[0] = front.target(); - res[1] = back.target(); - res[2] = back.source(); - res[3] = front.source(); - typename K::Coplanar_orientation_3 coplanar_orientation = - k.coplanar_orientation_3_object(); - - if( coplanar_orientation(res[0], res[1], res[2]) - != coplanar_orientation(res[0], res[1], res[3])) - { - std::swap(res[1], res[2]); - } - - return result_type(std::forward(res)); - } - break; - case 4: // intersects a face - { - Poly res; - res.reserve(4); - typename K::Has_on_3 has_on; - if(has_on(pl, cub.vertex(0)) - && has_on(pl, cub.vertex(5)) - && has_on(pl, cub.vertex(4))) - { - res.push_back(cub.vertex(0)); - res.push_back(cub.vertex(5)); - res.push_back(cub.vertex(4)); - res.push_back(cub.vertex(3)); - } - else if(has_on(pl, cub.vertex(0)) - && has_on(pl, cub.vertex(1)) - && has_on(pl, cub.vertex(6))) - { - res.push_back(cub.vertex(0)); - res.push_back(cub.vertex(1)); - res.push_back(cub.vertex(6)); - res.push_back(cub.vertex(5)); - - } - else if(has_on(pl, cub.vertex(1)) - && has_on(pl, cub.vertex(2)) - && has_on(pl, cub.vertex(7))) - { - res.push_back(cub.vertex(1)); - res.push_back(cub.vertex(2)); - res.push_back(cub.vertex(7)); - res.push_back(cub.vertex(6)); - } - else if(has_on(pl, cub.vertex(2)) - && has_on(pl, cub.vertex(3)) - && has_on(pl, cub.vertex(4))) - { - res.push_back(cub.vertex(2)); - res.push_back(cub.vertex(3)); - res.push_back(cub.vertex(4)); - res.push_back(cub.vertex(7)); - } - else if(has_on(pl, cub.vertex(6)) - && has_on(pl, cub.vertex(7)) - && has_on(pl, cub.vertex(4))) - { - res.push_back(cub.vertex(6)); - res.push_back(cub.vertex(7)); - res.push_back(cub.vertex(4)); - res.push_back(cub.vertex(5)); - } - else if(has_on(pl, cub.vertex(2)) - && has_on(pl, cub.vertex(1)) - && has_on(pl, cub.vertex(0))) - { - res.push_back(cub.vertex(2)); - res.push_back(cub.vertex(1)); - res.push_back(cub.vertex(0)); - res.push_back(cub.vertex(3)); - } - return result_type(std::forward(res)); - } - break; - default: - break; - } - - Poly filtered_points; - filter_points(points, filtered_points); - - //adjacent to a vertex - if(filtered_points.size() == 1) - { - return result_type(std::forward(filtered_points.front())); - } - - //get intersections between pl and each face -> line. Foreach line, creates segment with points. Then use helper_function to recover polygon. - typedef typename Intersection_traits, - CGAL::Plane_3 >::result_type Pl_pl_type; - - std::vector plane_intersections; - Pl_pl_type pl_inter = CGAL::intersection(pl, Plane_3(cub.vertex(0), - cub.vertex(1), - cub.vertex(5))); - if(const Line_3* line = boost::get(&*pl_inter)){ - plane_intersections.push_back(*line); - } - pl_inter = CGAL::intersection(pl, Plane_3(cub.vertex(0), - cub.vertex(3), - cub.vertex(4))); - if(const Line_3* line = boost::get(&*pl_inter)){ - plane_intersections.push_back(*line); - } - pl_inter = CGAL::intersection(pl, Plane_3(cub.vertex(0), - cub.vertex(1), - cub.vertex(3))); - if(const Line_3* line = boost::get(&*pl_inter)){ - plane_intersections.push_back(*line); - } - pl_inter = CGAL::intersection(pl, Plane_3(cub.vertex(7), - cub.vertex(6), - cub.vertex(1))); - if(const Line_3* line = boost::get(&*pl_inter)){ - plane_intersections.push_back(*line); - } - pl_inter = CGAL::intersection(pl, Plane_3(cub.vertex(7), - cub.vertex(4), - cub.vertex(3))); - if(const Line_3* line = boost::get(&*pl_inter)){ - plane_intersections.push_back(*line); - } - pl_inter = CGAL::intersection(pl, Plane_3(cub.vertex(7), - cub.vertex(6), - cub.vertex(4))); - if(const Line_3* line = boost::get(&*pl_inter)){ - plane_intersections.push_back(*line); - } - - std::list tmp_segs; - for(const auto& line : plane_intersections) - { - bool first_found = false; - Point_3 first_p; - typename K::Has_on_3 has_on; - for(const auto &p : filtered_points) - { - if(has_on(line, p)) - { - if(!first_found) - { - first_found = true; - first_p = p; - } - else - { - tmp_segs.emplace_back(first_p, p); break; } + case ON_POSITIVE_SIDE: + { + all_in = false; + // check for intersection of the edge + if (orientations[next_id] == ON_NEGATIVE_SIDE) + { + ids.push_back(inter_pt_index(current_id, next_id, edge_id)); + } + break; + } + case ON_ORIENTED_BOUNDARY: + { + all_in = all_out = false; + ids.push_back(current_id); + } } } + + switch (ids.size()) + { + case 4: + { + std::vector res({ corners[ids[0]], + corners[ids[1]], + corners[ids[2]], + corners[ids[3]] }); + return result_type(res); + } + case 2: + { + if (start_id == -1) start_id = ids[0]; + add_neighbor(ids[0], ids[1]); + add_neighbor(ids[1], ids[0]); + break; + } + case 1: + solo_id = ids[0]; + default: + break; + } } - if(tmp_segs.size() < 3) - return result_type(); + if (all_in || all_out) return boost::none; + if (start_id == -1) return { result_type(corners[solo_id]) }; - std::list tmp_pts; - fill_points_list(tmp_segs,tmp_pts); - - Poly res; - for(const auto& p : tmp_pts) - res.push_back(p); - - if(res.size() == 3){ - typename K::Triangle_3 tr(res[0], res[1], res[2]); - return result_type(std::forward(tr)); - } - else - { - return result_type(std::forward(res)); - } + int prv_id = -1; + int cur_id = start_id; + std::vector res; + res.reserve(6); + do { + res.push_back(corners[cur_id]); + int nxt_id = neighbor_ids[cur_id][0] == prv_id + ? neighbor_ids[cur_id][1] + : neighbor_ids[cur_id][0]; + if (nxt_id == -1 || nxt_id == start_id){ + if(res.size() == 2){ + typename K::Segment_3 seg(res[0], res[1]); + return result_type(seg); + } + if(res.size() == 3){ + typename K::Triangle_3 tr(res[0], res[1], res[2]); + return result_type(tr); + } + return result_type(res); + } + prv_id = cur_id; + cur_id = nxt_id; + } while (true); } template diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Plane_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Plane_3_intersection.h index fa55cb268f2..498ab69a56e 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Plane_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Plane_3_intersection.h @@ -32,101 +32,170 @@ template typename Intersection_traits::result_type intersection( const typename K::Tetrahedron_3 &tet, - const typename K::Plane_3 &pl, - const K&) + const typename K::Plane_3 &plane, + const K& k) { - typedef typename Intersection_traits::result_type result_type; + typedef typename K::Point_3 Point_3; + typedef typename K::Triangle_3 Triangle_3; + typedef typename Intersection_traits::result_type result_type; + typename K::Oriented_side_3 oriented_side = k.oriented_side_3_object(); - typedef typename Intersection_traits::result_type Inter_type; + std::vector corners(4); + corners.reserve(8); // 4 corners + up to 4 polygon points + corners[0] = tet[0]; + corners[1] = tet[1]; + corners[2] = tet[2]; + corners[3] = tet[3]; - typedef typename K::Segment_3 Segment_3; - Inter_type intersections[4]; - int p_id = -1; - std::vector points; - std::vector segments; - for(int i = 0; i < 4; ++i) + const std::array orientations { { + oriented_side(plane, corners[0]), + oriented_side(plane, corners[1]), + oriented_side(plane, corners[2]), + oriented_side(plane, corners[3]) + } }; + + // description of faces of the bbox + constexpr std::array face_indices + { { 0, 1, 2, + 0, 1, 3, + 1, 2, 3, + 2, 0, 3 } }; + + constexpr std::array edge_indices + { { 0, 1, 2, + 0, 3, 5, + 1, 4, 3, + 2, 5, 4 } }; + + std::array edge_ipt_id; + edge_ipt_id.fill(-1); + + auto inter_pt_index = + [&plane, &corners, &edge_ipt_id](int i, int j, int edge_id) { - const typename K::Triangle_3 triangle(tet.vertex((i+1)%4), - tet.vertex((i+2)%4), - tet.vertex((i+3)%4)); - intersections[i] = typename K::Intersect_3()(pl, triangle); - if(intersections[i]){ - if(const typename K::Triangle_3* tr = boost::get(&*intersections[i])) + if (edge_ipt_id[edge_id]==-1) + { + edge_ipt_id[edge_id] = static_cast (corners.size()); + corners.push_back(typename K::Construct_plane_line_intersection_point_3() + (plane, corners[i], corners[j])); + } + + return edge_ipt_id[edge_id]; + }; + + bool all_in = true; + bool all_out = true; + + std::vector> neighbor_ids(8, {-1,-1}); + + auto add_neighbor = [&neighbor_ids](int i, int j) + { + if (neighbor_ids[i][0] == -1 ) { + neighbor_ids[i][0] = j; + } + else { + if (neighbor_ids[i][0]!=j && neighbor_ids[i][1]==-1) { - typename K::Triangle_3 res = *tr; - return result_type(std::forward(res)); - } - else if( const Segment_3* s - = boost::get(&*intersections[i])) - { - segments.push_back(*s); - } - else if( const typename K::Point_3* p - = boost::get(&*intersections[i])) - { - points.push_back(*p); - p_id = i; + neighbor_ids[i][1] = j; } } - } - CGAL_assertion(segments.size() != 1); + }; - switch(segments.size()) + int start_id = -1; + int solo_id = -1; + // for each face of the bbox, we look for intersection of the plane with its edges + std::vector ids; + for (int i = 0; i < 4; ++i) { - case 0: - { - if(p_id == -1) - return result_type(); - else + ids.clear(); + for (int k = 0; k < 3; ++k) { - typename K::Point_3 p - = *boost::get(&*intersections[p_id]); - return result_type(std::forward(p)); + int current_id = face_indices[3 * i + k]; + int next_id = face_indices[3 * i + (k + 1) % 3]; + int edge_id = edge_indices[3 * i + k]; + + switch (orientations[current_id]) + { + case ON_NEGATIVE_SIDE: + { + all_out = false; + // check for intersection of the edge + if (orientations[next_id] == ON_POSITIVE_SIDE) + { + ids.push_back( + inter_pt_index(current_id, next_id, edge_id)); + } + break; + } + case ON_POSITIVE_SIDE: + { + all_in = false; + // check for intersection of the edge + if (orientations[next_id] == ON_NEGATIVE_SIDE) + { + ids.push_back(inter_pt_index(current_id, next_id, edge_id)); + } + break; + } + case ON_ORIENTED_BOUNDARY: + { + all_in = all_out = false; + ids.push_back(current_id); + } + } } - } - break; - case 2: - { - return result_type(std::forward(segments.back())); - } - break; - default: - { - std::set all_points; - for (const auto& s : segments) + + switch (ids.size()) { - all_points.insert(s.source()); - all_points.insert(s.target()); - } - if(all_points.size() == 3) - { - auto p_it = all_points.begin(); - ++p_it; - typename K::Point_3 mid_point = *p_it; - ++p_it; - typename K::Triangle_3 result(*all_points.begin(), mid_point, *p_it ); - return result_type(std::forward(result)); - } - else //size = 4 - { - std::list segs(segments.begin(), segments.end()); - std::list tmp; - fill_points_list(segs, tmp); - std::vector res; - for( const auto& p : tmp) - res.push_back(p); - return result_type(std::forward >(res)); + case 3: + { + Triangle_3 res(corners[ids[0]], + corners[ids[1]], + corners[ids[2]]); + return result_type(res); + } + case 2: + { + if (start_id == -1) start_id = ids[0]; + add_neighbor(ids[0], ids[1]); + add_neighbor(ids[1], ids[0]); + break; + } + case 1: + solo_id = ids[0]; + default: + break; } } - break; - } - CGAL_assertion(false); - return result_type(); + + if (all_in || all_out) return boost::none; + if (start_id == -1) return { result_type(corners[solo_id]) }; + + int prv_id = -1; + int cur_id = start_id; + std::vector res; + res.reserve(4); + do { + res.push_back(corners[cur_id]); + int nxt_id = neighbor_ids[cur_id][0] == prv_id + ? neighbor_ids[cur_id][1] + : neighbor_ids[cur_id][0]; + if (nxt_id == -1 || nxt_id == start_id){ + if(res.size() == 2){ + typename K::Segment_3 seg(res[0], res[1]); + return result_type(seg); + } + if(res.size() == 3){ + typename K::Triangle_3 tr(res[0], res[1], res[2]); + return result_type(tr); + } + return result_type(res); + } + prv_id = cur_id; + cur_id = nxt_id; + } while (true); + } template diff --git a/Intersections_3/test/Intersections_3/issue_5428.cpp b/Intersections_3/test/Intersections_3/issue_5428.cpp new file mode 100644 index 00000000000..ea6dc18cd0f --- /dev/null +++ b/Intersections_3/test/Intersections_3/issue_5428.cpp @@ -0,0 +1,24 @@ +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel EPICK; + +typedef EPICK::Point_3 Point; + +int main() +{ + EPICK::Plane_3 pl(Point(0, 0, 0), Point(1, 0, 0), Point(0, 1, 0)); + + std::vector pts; + pts.push_back(Point(-10,-10,-10)); + pts.push_back(Point(10,10,10)); + CGAL::Bbox_3 cub = CGAL::bbox_3(pts.begin(), pts.end()); + + auto result = intersection(cub,pl); + + const std::vector* res = boost::get >(&*result); + for (Point p : *res) { + std::cout << p << std::endl; + } + + return 0; +} diff --git a/Intersections_3/test/Intersections_3/test_intersections_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_3.cpp index 7247a3c472e..f93026b3d11 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_3.cpp @@ -672,7 +672,8 @@ struct Test { P(0,1,0)); check_intersection (tet, Pl(P(0,0.5,0), P(1,0.5,-5), P(0.5,0.5,0.5)), - Tr(P(0.5,0.5,0), P(0,0.5,0), P(0,0.5,0.5))); + Tr(P(0, 0.5, 0), P(0.5,0.5,0), P(0,0.5,0.5))); + Pl pl(P(0,0.9,0), P(0.9,0,0), P(0.9,0.01,0.06)); typedef typename CGAL::Intersection_traits >(&*res); assert(poly != nullptr); assert(poly->size() == 4); @@ -940,8 +942,8 @@ struct Test { check_intersection (cub, Pl(P(2, 1.66, 2), P(1.66,2,2), P(2,2,1.66)), - Tr(P(2, 2, 1.66), - P(1.66,2,2), + Tr(P(1.66,2,2), + P(2, 2, 1.66), P(2,1.66,2))); //other edge @@ -1100,7 +1102,7 @@ struct Test { //edge check_intersection (cub, Pl(P(1,1,1), P(1,2,1), P(1.5,0,0)), - S(P(1,2,1), P(1,1,1))); + S(P(1,1,1), P(1,2,1))); //face typedef typename CGAL::Intersection_traits -#if defined(CGAL_USE_BOOST_PROGRAM_OPTIONS) && ! defined(DONT_USE_BOOST_PROGRAM_OPTIONS) #include namespace po = boost::program_options; -#endif using namespace std; diff --git a/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt b/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt index 72054804f9c..3adab3d539e 100644 --- a/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt +++ b/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt @@ -8,10 +8,10 @@ find_package(CGAL REQUIRED) # use Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("blind_1pt.cpp") - target_link_libraries(blind_1pt PUBLIC CGAL::Eigen_support) + target_link_libraries(blind_1pt PUBLIC CGAL::Eigen3_support) else() message( STATUS 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 98ea9f7ed60..bb63612593e 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h @@ -355,8 +355,10 @@ through the intersection of `l1` and `l2`. If `l1` and `l2` are parallel, then the bisector is defined as the line which has the same direction as `l1`, and which is at the same distance from `l1` and `l2`. -This function requires that `Kernel::RT` supports the `sqrt()` -operation. +If `Kernel::FT` is not a model of `FieldWithSqrt` +an approximation of the square root will be used in this function, +impacting the exactness of the result even with an (exact) multiprecision +number type. */ template CGAL::Line_2 bisector(const CGAL::Line_2 &l1, @@ -379,8 +381,10 @@ passes through the intersection of `h1` and `h2`. If `h1` and `h2` are parallel, then the bisector is defined as the plane which has the same oriented normal vector as `l1`, and which is at the same distance from `h1` and `h2`. -This function requires that `Kernel::RT` supports the `sqrt()` -operation. +If `Kernel::FT` is not a model of `FieldWithSqrt` +an approximation of the square root will be used in this function, +impacting the exactness of the result even with an (exact) multiprecision +number type. */ template CGAL::Plane_3 bisector(const CGAL::Plane_3 &h1, 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 56b476d9735..63759e8c3ba 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 @@ -77,7 +77,7 @@ typedef Line_3 Line_2; A construction object. Provides the operator : -`Object_2 operator()(Segment_2 s1, Segment_2 s2);` +`boost::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/squared_distance_2.h b/Kernel_23/doc/Kernel_23/CGAL/squared_distance_2.h index 21c220fd95b..5927a121da3 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/squared_distance_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/squared_distance_2.h @@ -40,7 +40,8 @@ following: - `Plane_3` as well as combinations `Point_3`/`Triangle_3`, -and `Weighted_point_3`/`Triangle_3`. +and `Weighted_point_3`/`Triangle_3`, as well as `Point_3`/`Tetrahedron_3`, +and `Weighted_point_3`/`Tetrahedron_3` \sa `compare_distance_to_point_grp` \sa `compare_signed_distance_to_line_grp` diff --git a/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h b/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h index 44e13cfbbe4..61033d6d3ab 100644 --- a/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h +++ b/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h @@ -3882,8 +3882,6 @@ public: If `l1` and `l2` are parallel, then the bisector is defined as the line which has the same direction as `l1`, and which is at the same distance from `l1` and `l2`. - This function requires that `Kernel::RT` supports the `sqrt()` - operation. */ Kernel::Line_2 operator()(const Kernel::Line_2&l1, const Kernel::Line_2&l2); @@ -3925,8 +3923,6 @@ public: If `h1` and `h2` are parallel, then the bisector is defined as the plane which has the same oriented normal vector as `h1`, and which is at the same distance from `h1` and `h2`. - This function requires that `Kernel::RT` supports the `sqrt()` - operation. */ Kernel::Plane_3 operator()(const Kernel::Plane_3&h1, const Kernel::Plane_3&h2); @@ -9271,7 +9267,7 @@ public: /*! returns \ref CGAL::ON_ORIENTED_BOUNDARY, - \ref CGAL::ON_NEGATIVE_SIDE, or the constant \ref CGAL::ON_POSITIVE_SIDE, + \ref CGAL::ON_NEGATIVE_SIDE, or \ref CGAL::ON_POSITIVE_SIDE, depending on the position of `p` relative to the oriented plane `h`. */ Oriented_side operator()(const Kernel::Plane_3&h, @@ -9279,7 +9275,17 @@ public: /*! returns \ref CGAL::ON_ORIENTED_BOUNDARY, - \ref CGAL::ON_NEGATIVE_SIDE, or the constant \ref CGAL::ON_POSITIVE_SIDE, + \ref CGAL::ON_NEGATIVE_SIDE, or \ref CGAL::ON_POSITIVE_SIDE, + depending on the position of `p` relative to the oriented plane constructed + from `plane_point` and `plane_vector`. + */ + Oriented_side operator()(const Kernel::Point_3& plane_point, + const Kernel::Vector_3& plane_vector, + const Kernel::Point_3&p); + + /*! + returns \ref CGAL::ON_ORIENTED_BOUNDARY, + \ref CGAL::ON_NEGATIVE_SIDE, or \ref CGAL::ON_POSITIVE_SIDE, depending on the position of `p` relative to the oriented tetrahedron `t`. */ Oriented_side operator()(const Kernel::Tetrahedron_3&t, @@ -9287,7 +9293,7 @@ public: /*! returns \ref CGAL::ON_ORIENTED_BOUNDARY, - \ref CGAL::ON_NEGATIVE_SIDE, or the \ref CGAL::ON_POSITIVE_SIDE, + \ref CGAL::ON_NEGATIVE_SIDE, or \ref CGAL::ON_POSITIVE_SIDE, depending on the position of `p` relative to the oriented sphere `s`. */ Oriented_side operator()(const Kernel::Sphere_3& s, diff --git a/Kernel_23/examples/Kernel_23/intersections.cpp b/Kernel_23/examples/Kernel_23/intersections.cpp index 283fd5b9aad..bbe913a36df 100644 --- a/Kernel_23/examples/Kernel_23/intersections.cpp +++ b/Kernel_23/examples/Kernel_23/intersections.cpp @@ -2,8 +2,6 @@ #include #include -#include - typedef CGAL::Exact_predicates_exact_constructions_kernel K; typedef K::Point_2 Point; typedef K::Segment_2 Segment; diff --git a/Kernel_23/include/CGAL/Kernel/function_objects.h b/Kernel_23/include/CGAL/Kernel/function_objects.h index b462f6ef001..1d698f65b6e 100644 --- a/Kernel_23/include/CGAL/Kernel/function_objects.h +++ b/Kernel_23/include/CGAL/Kernel/function_objects.h @@ -3568,8 +3568,12 @@ namespace CommonKernelFunctors { }; + // This functor is not part of the documented Kernel API, but an implementation detail + // of Polygon_mesh_processing::Polyhedral_envelope + // When used with the Lazy_kernel (that is Epeck) the returned point + // is a singleton (so its coordinates will be changed by another call). template - class Intersect_point_3 + class Intersect_point_3_for_polyhedral_envelope { public: typedef typename K::Point_3 Point_3; @@ -3787,6 +3791,7 @@ namespace CommonKernelFunctors { class Oriented_side_3 { typedef typename K::Point_3 Point_3; + typedef typename K::Vector_3 Vector_3; typedef typename K::Tetrahedron_3 Tetrahedron_3; typedef typename K::Plane_3 Plane_3; typedef typename K::Sphere_3 Sphere_3; @@ -3801,6 +3806,12 @@ namespace CommonKernelFunctors { operator()( const Plane_3& pl, const Point_3& p) const { return pl.rep().oriented_side(p); } + result_type + operator()( const Point_3& plane_pt, const Vector_3& plane_normal, const Point_3& query) const + { + return typename K::Construct_plane_3()(plane_pt, plane_normal).rep().oriented_side(query); + } + result_type operator()( const Tetrahedron_3& t, const Point_3& p) const { return t.rep().oriented_side(p); } diff --git a/Kernel_23/include/CGAL/Kernel/interface_macros.h b/Kernel_23/include/CGAL/Kernel/interface_macros.h index 43f5ff7a2f7..a4caf77e7be 100644 --- a/Kernel_23/include/CGAL/Kernel/interface_macros.h +++ b/Kernel_23/include/CGAL/Kernel/interface_macros.h @@ -542,8 +542,8 @@ CGAL_Kernel_cons(Intersect_2, intersect_2_object) CGAL_Kernel_cons(Intersect_3, intersect_3_object) -CGAL_Kernel_cons(Intersect_point_3, - intersect_point_3_object) +CGAL_Kernel_cons(Intersect_point_3_for_polyhedral_envelope, + intersect_point_3_for_polyhedral_envelope_object) CGAL_Kernel_pred(Is_degenerate_2, is_degenerate_2_object) CGAL_Kernel_pred_RT(Is_degenerate_3, diff --git a/Kernel_23/include/CGAL/internal/Projection_traits_3.h b/Kernel_23/include/CGAL/internal/Projection_traits_3.h index ec721a715ee..eb94a85caf6 100644 --- a/Kernel_23/include/CGAL/internal/Projection_traits_3.h +++ b/Kernel_23/include/CGAL/internal/Projection_traits_3.h @@ -308,8 +308,13 @@ public: return (CGAL::abs(dx)>CGAL::abs(dy)) ? ( p.x()-source.x() ) / dx : (p.y()-source.y() ) / dy; } - Object operator()(const Segment_3& s1, const Segment_3& s2) const + + + boost::optional< boost::variant > + operator()(const Segment_3& s1, const Segment_3& s2) const { + typedef boost::variant variant_type; + Point_2 s1_source = project(s1.source()); Point_2 s1_target = project(s1.target()); Point_2 s2_source = project(s2.source()); @@ -321,11 +326,14 @@ public: //compute intersection points in projected plane //We know that none of the segment is degenerate - Object o = intersection(s1_2,s2_2); - const Point_2* pi=CGAL::object_cast(&o); - if (pi==nullptr) { //case of segment or empty - const Segment_2* si=CGAL::object_cast(&o); - if (si==nullptr) return Object(); + + typename CGAL::cpp11::result_of::type + o = intersection(s1_2,s2_2); + if(! o){ + return boost::none; + } + + if(const Segment_2* si = boost::get(&*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] )); @@ -343,8 +351,11 @@ public: src[Projector::y_index] = si->source().y(); tgt[Projector::x_index] = si->target().x(); tgt[Projector::y_index] = si->target().y(); - return make_object( Segment_3( Point_3(src[0],src[1],src[2]),Point_3(tgt[0],tgt[1],tgt[2]) ) ); + return boost::make_optional(variant_type(Segment_3( Point_3(src[0],src[1],src[2]),Point_3(tgt[0],tgt[1],tgt[2]) ) ) ); } + + + const Point_2* pi = boost::get(&*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] )); @@ -356,7 +367,7 @@ public: Point_3 res(coords[0],coords[1],coords[2]); CGAL_assertion(x(res)==pi->x() && y(res)==pi->y()); - return make_object(res); + return boost::make_optional(variant_type(res)); } }; diff --git a/Kernel_23/src/CGAL/kernel.cpp b/Kernel_23/src/CGAL/kernel.cpp deleted file mode 100644 index 73c0aeec5f7..00000000000 --- a/Kernel_23/src/CGAL/kernel.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 1999 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Andreas Fabri, Stefan Schirra - -#ifndef CGAL_HEADER_ONLY -#include -#include -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_line_2.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_line_2.h index e88c95fb0fe..05df87c02f1 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_line_2.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_line_2.h @@ -18,22 +18,9 @@ #ifndef CGAL__TEST_FCT_LINE_2_H #define CGAL__TEST_FCT_LINE_2_H -// Accessory function testing functions that require sqrt(). -// Doesn't instantiate anything if RT doesn't support sqrt(). template bool -_test_fct_line_sqrt_2(const R&, CGAL::Tag_false) -{ -// bool UNTESTED_STUFF_BECAUSE_SQRT_IS_NOT_SUPPORTED; - std::cout << std::endl - << "NOTE : FT doesn't support sqrt()," - " hence some functions are not tested." << std::endl; - return true; -} - -template -bool -_test_fct_line_sqrt_2(const R&, CGAL::Tag_true) +_test_fct_line_sqrt_2(const R&) { typedef typename R::Point_2 Point_2; typedef typename R::Line_2 Line_2; @@ -66,7 +53,6 @@ _test_fct_line_2(const R& ) std::cout << "Testing functions Line_2" ; typedef typename R::RT RT; - typedef typename R::FT FT; typedef typename R::Point_2 Point_2; typedef typename R::Line_2 Line_2; @@ -178,13 +164,9 @@ _test_fct_line_2(const R& ) assert(bl1.oriented_side(p2) == CGAL::ON_POSITIVE_SIDE); assert( CGAL::parallel(bl1, bl2) ); - // More tests, that require sqrt(). - { - typedef ::CGAL::Algebraic_structure_traits AST; - static const bool has_sqrt = - ! ::boost::is_same< ::CGAL::Null_functor, typename AST::Sqrt >::value; - _test_fct_line_sqrt_2(R(), ::CGAL::Boolean_tag()); - } + // More tests, that require sqrt() or use approx. + _test_fct_line_sqrt_2(R()); + std::cout << "done" << std::endl; return true; } diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_plane_3.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_plane_3.h index f39bc4d1ae7..17578d544ce 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_plane_3.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_plane_3.h @@ -17,22 +17,9 @@ #ifndef CGAL__TEST_FCT_PLANE_3_H #define CGAL__TEST_FCT_PLANE_3_H -// Accessory function testing functions that require sqrt(). -// Doesn't instantiate anything if RT doesn't support sqrt(). template bool -_test_fct_plane_sqrt_3(const R&, CGAL::Tag_false) -{ -// bool UNTESTED_STUFF_BECAUSE_SQRT_IS_NOT_SUPPORTED; - std::cout << std::endl - << "NOTE : FT doesn't support sqrt()," - " hence some functions are not tested." << std::endl; - return true; -} - -template -bool -_test_fct_plane_sqrt_3(const R&, CGAL::Tag_true) +_test_fct_plane_sqrt_3(const R&) { typedef typename R::Point_3 Point_3; typedef typename R::Plane_3 Plane_3; @@ -66,7 +53,6 @@ _test_fct_plane_3(const R& ) std::cout << "Testing functions Plane_3" ; typedef typename R::RT RT; - typedef typename R::FT FT; typedef typename R::Point_3 Point_3; typedef typename R::Plane_3 Plane_3; @@ -97,11 +83,8 @@ _test_fct_plane_3(const R& ) assert( CGAL::parallel(h1, h2) ); assert( ! CGAL::parallel(h1, h5) ); - // More tests, that require sqrt(). - typedef ::CGAL::Algebraic_structure_traits AST; - static const bool has_sqrt = - ! ::boost::is_same< ::CGAL::Null_functor, typename AST::Sqrt >::value; - _test_fct_plane_sqrt_3(R(), ::CGAL::Boolean_tag()); + // More tests, that require sqrt() or use approx. + _test_fct_plane_sqrt_3(R()); std::cout << "done" << std::endl; return true; diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_new_3.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_new_3.h index 540eafe080f..0beec86c962 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_new_3.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_new_3.h @@ -747,6 +747,7 @@ test_new_3(const R& rep) = rep.oriented_side_3_object(); Oriented_side tmp39 = oriented_side(h2,p2); tmp39 = oriented_side(sp9,p2); + tmp39 = oriented_side(p2,v1,p2); (void) tmp39; typename R::Bounded_side_3 bounded_side diff --git a/Kernel_d/include/CGAL/Kernel_d/Iso_box_d.h b/Kernel_d/include/CGAL/Kernel_d/Iso_box_d.h index 3794119da67..12ff9aeb723 100644 --- a/Kernel_d/include/CGAL/Kernel_d/Iso_box_d.h +++ b/Kernel_d/include/CGAL/Kernel_d/Iso_box_d.h @@ -25,6 +25,7 @@ #include #include #include +#include namespace CGAL { @@ -41,9 +42,11 @@ namespace CGAL { typedef typename Point::Cartesian_const_iterator Iterator; typedef Cartesian_iterator Self; - typedef typename Functor::result_type value_type; - typedef value_type& reference; - typedef value_type* pointer; + typedef decltype(std::declval()( + *std::declval(), + *std::declval())) value_type; + typedef value_type reference; + typedef const value_type* pointer; typedef std::ptrdiff_t difference_type; typedef std::input_iterator_tag iterator_category; @@ -89,7 +92,7 @@ namespace CGAL { return tmp; } - value_type operator*() const { return f(*pb, *qb); } + reference operator*() const { return f(*pb, *qb); } pointer operator->() const { return &(**this); } const Functor& functor() const { return f; } @@ -118,9 +121,12 @@ namespace CGAL { typedef typename Point::Homogeneous_const_iterator Iterator; typedef Homogeneous_iterator Self; - typedef typename Functor::result_type value_type; - typedef value_type& reference; - typedef value_type* pointer; + typedef typename Kernel_traits::Kernel::RT RT; + typedef decltype(std::declval()( + *std::declval() * std::declval(), + *std::declval() * std::declval())) value_type; + typedef value_type reference; + typedef const value_type* pointer; typedef std::ptrdiff_t difference_type; typedef std::input_iterator_tag iterator_category; @@ -128,7 +134,6 @@ namespace CGAL { Iterator pb, qb; Functor f; - typedef typename Kernel_traits::Kernel::RT RT; RT hp, hq; // homogenizing coordinates public: diff --git a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt index 1d49f69cf2f..76b250600d2 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt @@ -37,7 +37,7 @@ add_definitions(-DCGAL_PROFILE_LCC_DEMO) ################## find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) if(NOT (CGAL_Qt5_FOUND diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Linear_cell_complex_3_demo.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Linear_cell_complex_3_demo.cpp index 42713752435..cd31d859217 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Linear_cell_complex_3_demo.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Linear_cell_complex_3_demo.cpp @@ -14,6 +14,7 @@ #include #include #include +#include // Global random CGAL::Random myrandom; @@ -23,15 +24,12 @@ int main(int argc, char** argv) // std::cout<<"Size of dart: "<= QT_VERSION_CHECK(5, 3, 0)) - application.setAttribute(Qt::AA_UseDesktopOpenGL); -#endif // Import resources from libCGALQt5 // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index 3f82a3ffab7..dafcccb1695 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -15,7 +15,7 @@ #include Viewer::Viewer(QWidget* parent) : - Base(parent, NULL, ""), + Base(parent, nullptr, ""), m_previous_scene_empty(true) {} @@ -50,4 +50,3 @@ void Viewer::keyPressEvent(QKeyEvent *e) QString Viewer::helpString() const { return Base::helpString("LCC Demo"); } - diff --git a/Linear_cell_complex/examples/Linear_cell_complex/basic_viewer.h b/Linear_cell_complex/examples/Linear_cell_complex/basic_viewer.h index db5a49f847f..6b7b97eb3c1 100644 --- a/Linear_cell_complex/examples/Linear_cell_complex/basic_viewer.h +++ b/Linear_cell_complex/examples/Linear_cell_complex/basic_viewer.h @@ -17,7 +17,7 @@ #include #include -#include +#include #include #include #include @@ -43,15 +43,15 @@ typedef Local_kernel::Vector_3 Local_vector; //Vertex source code const char vertex_source_mono[] = { - "#version 120 \n" - "attribute highp vec4 vertex;\n" - "attribute highp vec3 normal;\n" + "#version 150 \n" + "in highp vec4 vertex;\n" + "in highp vec3 normal;\n" "uniform highp mat4 mvp_matrix;\n" "uniform highp mat4 mv_matrix; \n" - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" + "out highp vec4 fP; \n" + "out highp vec3 fN; \n" "void main(void)\n" "{\n" " fP = mv_matrix * vertex; \n" @@ -62,17 +62,17 @@ const char vertex_source_mono[] = const char vertex_source_color[] = { - "#version 120 \n" - "attribute highp vec4 vertex;\n" - "attribute highp vec3 normal;\n" - "attribute highp vec3 color;\n" + "#version 150 \n" + "in highp vec4 vertex;\n" + "in highp vec3 normal;\n" + "in highp vec3 color;\n" "uniform highp mat4 mvp_matrix;\n" "uniform highp mat4 mv_matrix; \n" - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" - "varying highp vec4 fColor; \n" + "out highp vec4 fP; \n" + "out highp vec3 fN; \n" + "out highp vec4 fColor; \n" "void main(void)\n" "{\n" " fP = mv_matrix * vertex; \n" @@ -85,15 +85,16 @@ const char vertex_source_color[] = //Vertex source code const char fragment_source_mono[] = { - "#version 120 \n" - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" + "#version 150 \n" + "in highp vec4 fP; \n" + "in highp vec3 fN; \n" "uniform highp vec4 color; \n" "uniform highp vec4 light_pos; \n" "uniform highp vec4 light_diff; \n" "uniform highp vec4 light_spec; \n" "uniform highp vec4 light_amb; \n" "uniform float spec_power ; \n" + "out highp vec4 out_color; \n" "void main(void) { \n" @@ -108,22 +109,23 @@ const char fragment_source_mono[] = " highp vec4 diffuse = max(dot(N,L), 0.0) * light_diff * color; \n" " highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n" - "gl_FragColor = light_amb*color + diffuse ; \n" + "out_color = light_amb*color + diffuse ; \n" "} \n" "\n" }; const char fragment_source_color[] = { - "#version 120 \n" - "varying highp vec4 fP; \n" - "varying highp vec3 fN; \n" - "varying highp vec4 fColor; \n" + "#version 150 \n" + "in highp vec4 fP; \n" + "in highp vec3 fN; \n" + "in highp vec4 fColor; \n" "uniform highp vec4 light_pos; \n" "uniform highp vec4 light_diff; \n" "uniform highp vec4 light_spec; \n" "uniform highp vec4 light_amb; \n" "uniform float spec_power ; \n" + "out highp vec4 out_color; \n" "void main(void) { \n" @@ -138,7 +140,7 @@ const char fragment_source_color[] = " highp vec4 diffuse = max(dot(N,L), 0.0) * light_diff * fColor; \n" " highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n" - "gl_FragColor = light_amb*fColor + diffuse ; \n" + "out_color = light_amb*fColor + diffuse ; \n" "} \n" "\n" }; @@ -146,8 +148,8 @@ const char fragment_source_color[] = //Vertex source code const char vertex_source_p_l[] = { - "#version 120 \n" - "attribute highp vec4 vertex;\n" + "#version 150 \n" + "in highp vec4 vertex;\n" "uniform highp mat4 mvp_matrix;\n" "void main(void)\n" "{\n" @@ -157,10 +159,11 @@ const char vertex_source_p_l[] = //Vertex source code const char fragment_source_p_l[] = { - "#version 120 \n" + "#version 150 \n" "uniform highp vec4 color; \n" + "out highp vec4 out_color; \n" "void main(void) { \n" - "gl_FragColor = color; \n" + "out_color = color; \n" "} \n" "\n" }; @@ -194,7 +197,7 @@ typename K::Vector_3 compute_normal_of_face(const std::vector::" << std::endl; std::cerr << "operator()(): input error: facet " << i - << " has less than 3 vertices." << std::endl; + << " has fewer than 3 vertices." << std::endl; } B.rollback(); in.clear( std::ios::badbit); diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 6f630b2c0b1..49383d6f5eb 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -15,6 +15,7 @@ #include #ifdef CGAL_USE_BASIC_VIEWER +#include #include #include @@ -170,29 +171,27 @@ public: // First draw: vertices; edges, faces; multi-color; inverse normal Base(parent, title, true, true, true, false, false), lcc(alcc), - m_oriented_mark(lcc->get_new_mark()), m_nofaces(anofaces), m_random_face_color(false), m_drawing_functor(drawing_functor) { - lcc->orient(m_oriented_mark); - compute_elements(); + if (lcc!=nullptr) + { compute_elements(); } } ~SimpleLCCViewerQt() - { lcc->free_mark(m_oriented_mark); } + {} protected: void set_lcc(const LCC* alcc, bool doredraw=true) { - if (lcc!=nullptr) - { lcc->free_mark(m_oriented_mark); } + if (lcc==alcc) + { return; } lcc=alcc; - m_oriented_mark=lcc->get_new_mark(); - lcc->orient(m_oriented_mark); + if (lcc!=nullptr) + { compute_elements(); } - compute_elements(); if (doredraw) { redraw(); } } @@ -272,10 +271,13 @@ protected: clear(); if (lcc==nullptr) return; - typename LCC::size_type markvolumes = lcc->get_new_mark(); - typename LCC::size_type markfaces = lcc->get_new_mark(); - typename LCC::size_type markedges = lcc->get_new_mark(); - typename LCC::size_type markvertices = lcc->get_new_mark(); + typename LCC::size_type markvolumes =lcc->get_new_mark(); + typename LCC::size_type markfaces =lcc->get_new_mark(); + typename LCC::size_type markedges =lcc->get_new_mark(); + typename LCC::size_type markvertices =lcc->get_new_mark(); + typename LCC::size_type oriented_mark=lcc->get_new_mark(); + + lcc->orient(oriented_mark); for (typename LCC::Dart_range::const_iterator it=lcc->darts().begin(), itend=lcc->darts().end(); it!=itend; ++it ) @@ -290,7 +292,7 @@ protected: { lcc->mark(itv, markvolumes); // To be sure that all darts of the basic iterator will be marked if (!lcc->is_marked(itv, markfaces) && - lcc->is_marked(itv, m_oriented_mark) && + lcc->is_marked(itv, oriented_mark) && m_drawing_functor.draw_face(*lcc, itv)) { if (!m_drawing_functor.volume_wireframe(*lcc, itv) && @@ -335,13 +337,14 @@ protected: lcc->unmark(it, markedges); lcc->unmark(it, markfaces); lcc->unmark(it, markvolumes); - + lcc->unmark(it, oriented_mark); } lcc->free_mark(markvolumes); lcc->free_mark(markfaces); lcc->free_mark(markedges); lcc->free_mark(markvertices); + lcc->free_mark(oriented_mark); } virtual void init() @@ -372,7 +375,6 @@ protected: protected: const LCC* lcc; - typename LCC::size_type m_oriented_mark; bool m_nofaces; bool m_random_face_color; const DrawingFunctorLCC& m_drawing_functor; @@ -404,6 +406,7 @@ void draw(const CGAL_LCC_TYPE& alcc, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc=1; const char* argv[2]={"lccviewer","\0"}; QApplication app(argc,const_cast(argv)); diff --git a/Maintenance/public_release/scripts/github-release-upload b/Maintenance/public_release/scripts/github-release-upload index 760916fd838..8a253f112bd 100755 --- a/Maintenance/public_release/scripts/github-release-upload +++ b/Maintenance/public_release/scripts/github-release-upload @@ -3,11 +3,8 @@ # Should be run in the directory with the release files, and named after # the release name, like "CGAL-4.9.1". -# Use github-release from -# https://github.com/aktau/github-release +release=${${PWD:t}/CGAL-/} +tag=v${release} -source $HOME/private/github-token.txt - -for f in *.(zip|xz|txt|exe); do - github-release upload -u CGAL -r cgal -t v${${PWD:t}/CGAL-/} --name $f -f $f; -done +gh release upload "$tag" *.(zip|xz|txt|exe) -R CGAL/cgal +gh release upload "$tag" CGAL-${release}-win64-auxiliary-libraries-gmp-mpfr.zip'#GMP and MPFR libraries, for Windows 64bits' -R CGAL/cgal --clobber diff --git a/Maintenance/public_release/scripts/prepare_release b/Maintenance/public_release/scripts/prepare_release index 639f9fe5c63..889c7e99da3 100755 --- a/Maintenance/public_release/scripts/prepare_release +++ b/Maintenance/public_release/scripts/prepare_release @@ -81,6 +81,10 @@ pushd "$DEST_DIR/doc_html" zip -q -r ../cgal_manual.zip * popd +pushd /srv/CGAL/www/precompiled_libs/auxiliary/x64/ +cp CGAL-5.2-win64-auxiliary-libraries-gmp-mpfr.zip "$DEST_DIR/${PUBLIC_RELEASE_NAME}-win64-auxiliary-libraries-gmp-mpfr.zip" +popd + pushd "$DEST_DIR" printf "Compute md5sum.txt..." md5sum *.^txt > md5sum.txt diff --git a/Matrix_search/examples/Matrix_search/sorted_matrix_search.cpp b/Matrix_search/examples/Matrix_search/sorted_matrix_search.cpp index 6fce8f6dd10..a9c261a494c 100644 --- a/Matrix_search/examples/Matrix_search/sorted_matrix_search.cpp +++ b/Matrix_search/examples/Matrix_search/sorted_matrix_search.cpp @@ -38,7 +38,7 @@ int main() CGAL::sorted_matrix_search( &M, &M + 1, CGAL::sorted_matrix_search_traits_adaptor( - boost::bind2nd(std::greater_equal(), bound), M)); + [&bound](const auto& m){ return std::greater_equal()(m, bound); }, M)); std::cout << "Upper bound for " << bound << " is " << upper_bound << "." << std::endl; diff --git a/Matrix_search/include/CGAL/Cartesian_matrix.h b/Matrix_search/include/CGAL/Cartesian_matrix.h index 1bad69fc2d4..d3ad276a715 100644 --- a/Matrix_search/include/CGAL/Cartesian_matrix.h +++ b/Matrix_search/include/CGAL/Cartesian_matrix.h @@ -18,6 +18,7 @@ #include #include +#include namespace CGAL { @@ -26,7 +27,12 @@ template < class Operation, class RandomAccessIC_column > 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/Matrix_search/include/CGAL/Transform_iterator.h b/Matrix_search/include/CGAL/Transform_iterator.h index 4797271123d..c3ab6e8c437 100644 --- a/Matrix_search/include/CGAL/Transform_iterator.h +++ b/Matrix_search/include/CGAL/Transform_iterator.h @@ -34,7 +34,6 @@ struct Transform_iterator { typedef std::_Unchecked_iterator_tag _Checked_iterator_category; typedef std::output_iterator_tag iterator_category; typedef Transform_iterator< OutputIterator, Operation > self; - typedef typename Operation::argument_type argument_type; typedef typename std::iterator_traits::difference_type difference_type; typedef typename std::iterator_traits::value_type value_type; @@ -54,6 +53,7 @@ struct Transform_iterator { self& operator++( int) { return *this; } + template self& operator=( const argument_type& a) { *(o_++) = op_( a); return *this; diff --git a/Matrix_search/include/CGAL/sorted_matrix_search.h b/Matrix_search/include/CGAL/sorted_matrix_search.h index 8d2cf105ffb..dd21234b4f5 100644 --- a/Matrix_search/include/CGAL/sorted_matrix_search.h +++ b/Matrix_search/include/CGAL/sorted_matrix_search.h @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -254,10 +253,10 @@ sorted_matrix_search(InputIterator f, InputIterator l, Traits t) std::nth_element(active_cells.begin(), active_cells.begin() + upper_median_rank, active_cells.end(), - boost::bind( - t.compare_strictly(), - boost::bind(Cell_min(), _1), - boost::bind(Cell_min(), _2))); + [&t](const Cell& c1, const Cell& c2) + { + return t.compare_strictly()(Cell_min()(c1), Cell_min()(c2)); + }); Cell_iterator lower_median_cell = active_cells.begin() + upper_median_rank; @@ -267,10 +266,10 @@ sorted_matrix_search(InputIterator f, InputIterator l, Traits t) std::nth_element(active_cells.begin(), active_cells.begin() + lower_median_rank, active_cells.end(), - boost::bind( - t.compare_strictly(), - boost::bind(Cell_max< Cell >(ccd), _1), - boost::bind(Cell_max< Cell >(ccd), _2))); + [&t, &ccd](const Cell& c1, const Cell& c2) + { + return t.compare_strictly()(Cell_max< Cell >(ccd)(c1), Cell_max< Cell >(ccd)(c2)); + }); Cell_iterator upper_median_cell = active_cells.begin() + lower_median_rank; @@ -282,10 +281,10 @@ sorted_matrix_search(InputIterator f, InputIterator l, Traits t) lower_median_cell = find_if(active_cells.begin(), active_cells.end(), - boost::bind( - equal_to< Value >(), - lower_median, - boost::bind(Cell_min< Cell >(), _1))); + [&lower_median](const Cell& c) + { + return equal_to< Value >()(lower_median, Cell_min< Cell >()(c)); + }); CGAL_optimisation_assertion(lower_median_cell != active_cells.end()); // ------------------------------------------------------ // test feasibility of medians and remove cells accordingly: @@ -318,10 +317,10 @@ sorted_matrix_search(InputIterator f, InputIterator l, Traits t) remove_if( active_cells.begin() + 1, active_cells.end(), - boost::bind( - t.compare_non_strictly(), - min_median, - boost::bind(Cell_min< Cell >(), _1))); + [&t, &min_median](const Cell& c) + { + return t.compare_non_strictly()(min_median, Cell_min< Cell >()(c)); + }); } // lower_median and upper_median are feasible else { // lower_median is feasible, but upper_median is not @@ -337,16 +336,11 @@ sorted_matrix_search(InputIterator f, InputIterator l, Traits t) remove_if( active_cells.begin() + 1, active_cells.end(), - boost::bind( - logical_or< bool >(), - boost::bind( - t.compare_non_strictly(), - lower_median, - boost::bind(Cell_min< Cell >(), _1)), - boost::bind( - t.compare_non_strictly(), - boost::bind(Cell_max< Cell >( ccd), _1), - upper_median))); + [&t, &lower_median, &upper_median, &ccd](const Cell& c) + { + return t.compare_non_strictly()(lower_median, Cell_min< Cell >()(c)) || + t.compare_non_strictly()(Cell_max< Cell >(ccd)(c), upper_median); + }); } // lower_median is feasible, but upper_median is not else @@ -364,16 +358,11 @@ sorted_matrix_search(InputIterator f, InputIterator l, Traits t) remove_if( active_cells.begin() + 1, active_cells.end(), - boost::bind( - logical_or< bool >(), - boost::bind( - t.compare_non_strictly(), - upper_median, - boost::bind(Cell_min< Cell >(), _1)), - boost::bind( - t.compare_non_strictly(), - boost::bind(Cell_max< Cell >( ccd), _1), - lower_median))); + [&t, &lower_median, &upper_median, &ccd](const Cell& c) + { + return t.compare_non_strictly()(upper_median, Cell_min()(c)) || + t.compare_non_strictly()(Cell_max(ccd)(c),lower_median); + }); } // upper_median is feasible, but lower_median is not else { // both upper_median and lower_median are infeasible @@ -385,11 +374,11 @@ sorted_matrix_search(InputIterator f, InputIterator l, Traits t) remove_if( active_cells.begin(), active_cells.end(), - boost::bind( - t.compare_non_strictly(), - boost::bind(Cell_max< Cell >( ccd), _1), - max BOOST_PREVENT_MACRO_SUBSTITUTION ( lower_median, upper_median))); - + [&t, &ccd, &lower_median, &upper_median](const Cell& c) + { + return t.compare_non_strictly()(Cell_max( ccd)(c), + max BOOST_PREVENT_MACRO_SUBSTITUTION ( lower_median, upper_median)); + }); } // both upper_median and lower_median are infeasible active_cells.erase( new_end, active_cells.end()); diff --git a/Matrix_search/test/Matrix_search/sorted_matrix_search_test.cpp b/Matrix_search/test/Matrix_search/sorted_matrix_search_test.cpp index af9d062c74f..22b2e16b82d 100644 --- a/Matrix_search/test/Matrix_search/sorted_matrix_search_test.cpp +++ b/Matrix_search/test/Matrix_search/sorted_matrix_search_test.cpp @@ -181,7 +181,7 @@ main( int argc, char* argv[]) matrices.begin(), matrices.end(), sorted_matrix_search_traits_adaptor( - boost::bind( greater_equal< Value >(), _1, bound), + [&bound](const auto& m){ return greater_equal< Value >()(m, bound); }, *(matrices.begin())))); #ifdef OUTPUT diff --git a/Mesh_2/doc/Mesh_2/CGAL/lloyd_optimize_mesh_2.h b/Mesh_2/doc/Mesh_2/CGAL/lloyd_optimize_mesh_2.h index 957eaf0c380..060cb8994e8 100644 --- a/Mesh_2/doc/Mesh_2/CGAL/lloyd_optimize_mesh_2.h +++ b/Mesh_2/doc/Mesh_2/CGAL/lloyd_optimize_mesh_2.h @@ -19,14 +19,13 @@ and the Delaunay triangulation is updated. Vertices on the mesh boundaries are not moved. \tparam CDT is required to be or derive from `CGAL::Constrained_Delaunay_triangulation_2`, -with vertex base and face base of its underlying `TriangulationDataStructure_2` -respectively implementing the concepts `DelaunayMeshFaceBase_2` and `DelaunayMeshVertexBase_2`. +with vertex base and face base of its underlying `TriangulationDataStructure_2` +being models of `DelaunayMeshVertexBase_2` and `DelaunayMeshFaceBase_2`, respectively. The argument `cdt`, passed by reference, provides the initial mesh and is modified by the algorithm to represent the final optimized mesh. \tparam PointIterator must be an iterator with value type `Kernel::Point_2` - The function has several optional parameters which are named parameters (we use the Boost.Parameter library). Therefore, when calling the function, the parameters can be provided in any order diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index 9683e4ed57a..2f9ba7d5b27 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -21,7 +21,7 @@ endif() # Use Eigen find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) find_package(VTK QUIET COMPONENTS vtkImagingGeneral vtkIOImage NO_MODULE) if(VTK_FOUND) @@ -41,33 +41,33 @@ else() endif() create_single_source_cgal_program("mesh_hybrid_mesh_domain.cpp") -target_link_libraries(mesh_hybrid_mesh_domain PUBLIC CGAL::Eigen_support) +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::Eigen_support) +target_link_libraries(mesh_implicit_sphere 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::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_two_implicit_spheres_with_balls.cpp") target_link_libraries(mesh_two_implicit_spheres_with_balls - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_implicit_domains_2.cpp" "implicit_functions.cpp") -target_link_libraries(mesh_implicit_domains_2 PUBLIC CGAL::Eigen_support) +target_link_libraries(mesh_implicit_domains_2 PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_cubes_intersection.cpp") -target_link_libraries(mesh_cubes_intersection PUBLIC CGAL::Eigen_support) +target_link_libraries(mesh_cubes_intersection PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_cubes_intersection_with_features.cpp") target_link_libraries(mesh_cubes_intersection_with_features - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_implicit_domains.cpp" "implicit_functions.cpp") -target_link_libraries(mesh_implicit_domains PUBLIC CGAL::Eigen_support) +target_link_libraries(mesh_implicit_domains PUBLIC CGAL::Eigen3_support) find_package( ITT QUIET ) if(TARGET ITT::ITT) @@ -76,40 +76,40 @@ if(TARGET ITT::ITT) endif() create_single_source_cgal_program( "mesh_polyhedral_domain.cpp" ) -target_link_libraries(mesh_polyhedral_domain PUBLIC CGAL::Eigen_support) +target_link_libraries(mesh_polyhedral_domain PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_domain_sm.cpp") -target_link_libraries(mesh_polyhedral_domain_sm PUBLIC CGAL::Eigen_support) +target_link_libraries(mesh_polyhedral_domain_sm PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program( "mesh_polyhedral_domain_with_surface_inside.cpp") target_link_libraries(mesh_polyhedral_domain_with_surface_inside - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("remesh_polyhedral_surface.cpp") -target_link_libraries(remesh_polyhedral_surface PUBLIC CGAL::Eigen_support) +target_link_libraries(remesh_polyhedral_surface PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("remesh_polyhedral_surface_sm.cpp") -target_link_libraries(remesh_polyhedral_surface_sm PUBLIC CGAL::Eigen_support) +target_link_libraries(remesh_polyhedral_surface_sm PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_domain_with_features.cpp") target_link_libraries(mesh_polyhedral_domain_with_features - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_domain_with_features_sm.cpp") target_link_libraries(mesh_polyhedral_domain_with_features_sm - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program( "mesh_polyhedral_domain_with_lipschitz_sizing.cpp") target_link_libraries(mesh_polyhedral_domain_with_lipschitz_sizing - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_complex.cpp") -target_link_libraries(mesh_polyhedral_complex PUBLIC CGAL::Eigen_support) +target_link_libraries(mesh_polyhedral_complex PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_complex_sm.cpp") -target_link_libraries(mesh_polyhedral_complex_sm PUBLIC CGAL::Eigen_support) +target_link_libraries(mesh_polyhedral_complex_sm PUBLIC CGAL::Eigen3_support) if(TARGET CGAL::CGAL_ImageIO) if(VTK_FOUND AND ("${VTK_VERSION_MAJOR}" GREATER "5" OR VTK_VERSION @@ -117,41 +117,41 @@ 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::Eigen_support CGAL::CGAL CGAL::CGAL_ImageIO + PUBLIC CGAL::Eigen3_support CGAL::CGAL CGAL::CGAL_ImageIO ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} ${VTK_LIBRARIES}) cgal_add_test(mesh_3D_gray_vtk_image) add_to_cached_list(CGAL_EXECUTABLE_TARGETS mesh_3D_gray_vtk_image) endif() create_single_source_cgal_program("mesh_3D_gray_image.cpp") - target_link_libraries(mesh_3D_gray_image PUBLIC CGAL::Eigen_support) + target_link_libraries(mesh_3D_gray_image PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_3D_gray_image_multiple_values.cpp") target_link_libraries(mesh_3D_gray_image_multiple_values - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_3D_image_with_features.cpp") - target_link_libraries(mesh_3D_image_with_features PUBLIC CGAL::Eigen_support) + target_link_libraries(mesh_3D_image_with_features PUBLIC CGAL::Eigen3_support) if(CGAL_ImageIO_USE_ZLIB) create_single_source_cgal_program("mesh_optimization_example.cpp") - target_link_libraries(mesh_optimization_example PUBLIC CGAL::Eigen_support) + target_link_libraries(mesh_optimization_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_optimization_lloyd_example.cpp") target_link_libraries(mesh_optimization_lloyd_example - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_3D_image.cpp") - target_link_libraries(mesh_3D_image PUBLIC CGAL::Eigen_support) + target_link_libraries(mesh_3D_image PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program( "mesh_3D_image_with_custom_initialization.cpp") target_link_libraries(mesh_3D_image_with_custom_initialization - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_3D_image_variable_size.cpp") target_link_libraries(mesh_3D_image_variable_size - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) else() message( STATUS @@ -173,6 +173,7 @@ if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support) mesh_3D_image_variable_size mesh_3D_image_with_custom_initialization mesh_3D_image_with_features + mesh_implicit_domains mesh_implicit_sphere mesh_implicit_sphere_variable_size mesh_optimization_example diff --git a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h index ae33317599b..60c7a84589d 100644 --- a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h @@ -40,7 +40,7 @@ #include #include #include -#include +#include #include #include #include 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 954909113b6..ab9a4844e5f 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 @@ -50,8 +50,7 @@ #include -#include -#include +#include #ifndef CGAL_NO_ASSERTIONS # include // for float_prior #endif @@ -1879,7 +1878,7 @@ next_vertex_along_curve(const Vertex_handle& start, adjacent_vertices.erase (std::remove_if(adjacent_vertices.begin(), adjacent_vertices.end(), - boost::bind(&Adjacent_vertices::value_type::second, _1) != curve_index), + [curve_index](const auto& p){ return p.second != curve_index; }), adjacent_vertices.end()); CGAL_assertion(adjacent_vertices.size() == 2); 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 b7d7e050735..7392d5667a9 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h @@ -470,7 +470,7 @@ public: std::string debug_info_element_impl(const Cell_handle &ch) const { std::stringstream sstr; - sstr << "Cell { " << std::endl + sstr << "Cell " << (void*)(ch.operator->()) << " { " << std::endl << " " << *ch->vertex(0) << std::endl << " " << *ch->vertex(1) << std::endl << " " << *ch->vertex(2) << std::endl diff --git a/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h b/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h index ecc9607774f..ee91f1d3f70 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h +++ b/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h @@ -36,9 +36,8 @@ #include -#include #include -#include +#include #include #include diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Facet_patch_id_map.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Facet_patch_id_map.h new file mode 100644 index 00000000000..bc66737a111 --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Facet_patch_id_map.h @@ -0,0 +1,76 @@ +// Copyright (c) 2010,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) : Laurent Rineau +// + +#ifndef CGAL_MESH_3_FACET_PATCH_ID_MAP_H +#define CGAL_MESH_3_FACET_PATCH_ID_MAP_H + +#include + +#include +#include +#include + +namespace CGAL { namespace Mesh_3 { + +/// A property map that, from a primitive of a AABB tree +/// retrieve the patch_id() of the facet. +template ::value > +struct Facet_patch_id_map; + +// Primitive::Id is an iterator type +template +struct Facet_patch_id_map +{ + typedef typename Primitive::Id Id; + typedef typename std::iterator_traits::value_type Face; + typedef typename Face::Patch_id value_type; + typedef const value_type& reference; + typedef typename Primitive::Id key_type; + typedef boost::readable_property_map_tag category; + + friend reference get(Facet_patch_id_map, key_type primitive_id) + { + return primitive_id->patch_id(); + } +}; + +// Primitive::Id is a std::pair +template +struct Facet_patch_id_map +{ + typedef typename MeshDomain::AABB_primitive::Id Id; + typedef typename MeshDomain::Patch_id value_type; + typedef value_type reference; + typedef typename MeshDomain::AABB_primitive::Id key_type; + typedef boost::readable_property_map_tag category; + + friend reference get(Facet_patch_id_map, key_type primitive_id) + { + typedef typename boost::property_map< + typename MeshDomain::Polyhedron, + face_patch_id_t >::type Fpim; + Fpim fpim = get(face_patch_id_t(), + *(primitive_id.second)); + typename MeshDomain::Patch_id patch_index = get(fpim, + primitive_id.first); + return patch_index; + } +}; + +}} // end namespace CGAL::Mesh_3 + +#endif // CGAL_MESH_3_FACET_PATCH_ID_MAP_H diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Get_facet_patch_id.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Get_facet_patch_id.h index ab4862f6b99..926cad5a1aa 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Get_facet_patch_id.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Get_facet_patch_id.h @@ -16,108 +16,14 @@ #include -#include -#include -#include +#include namespace CGAL { namespace Mesh_3 { -namespace internal { -BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Primitive_has_Id, Id, false) -} // end namespace CGAL::Mesh_3::internal - -/// A property map that, from a primitive of a AABB tree of polyhedron -/// facets, retrieve the patch_id() of the facet. -template -struct Get_facet_patch_id{}; - - -// generic version, that test if Primitive::Id exists -template ::value > -struct Get_facet_patch_id_property_traits { -}; - -// specialization when Primitive::Id exists -template -struct Get_facet_patch_id_property_traits -{ - typedef typename Primitive::Id Id; - typedef typename std::iterator_traits::value_type Face; - typedef typename Face::Patch_id value_type; - typedef value_type& reference; - typedef Primitive key_type; - typedef boost::readable_property_map_tag category; -}; - -}} // end namespace CGAL::Mesh_3 - -namespace boost { - // specialization for using pointers as property maps - template - struct property_traits > - : public CGAL::Mesh_3::Get_facet_patch_id_property_traits {}; -} - -namespace CGAL { namespace Mesh_3 { - -template -typename boost::property_traits< Get_facet_patch_id >::value_type -get(const Get_facet_patch_id, const typename Primitive::Id& primitive_id) { - return primitive_id->patch_id(); -} - - - -/// A property map that, from a primitive of a AABB tree of Gwdwg -/// facets, retrieve the patch_id() of the facet. -template < typename MeshDomain> -struct Get_facet_patch_id_sm{}; - - -// generic version, that test if Primitive::Id exists -template ::value> -struct Get_facet_patch_id_sm_property_traits { -}; - -// specialization when Primitive::Id exists +// backward compatibility with user code template -struct Get_facet_patch_id_sm_property_traits -{ - typedef typename MeshDomain::AABB_primitive::Id Id; - typedef typename MeshDomain::Patch_id value_type; +using Get_facet_patch_id_sm = Facet_patch_id_map; - typedef value_type& reference; - typedef typename MeshDomain::AABB_primitive key_type; - typedef boost::readable_property_map_tag category; -}; - -}} // end namespace CGAL::Mesh_3 - -namespace boost { - // specialization for using pointers as property maps - template - struct property_traits > - : public CGAL::Mesh_3::Get_facet_patch_id_sm_property_traits {}; -} - -namespace CGAL { namespace Mesh_3 { - -template -typename boost::property_traits< Get_facet_patch_id_sm >::value_type -get(const Get_facet_patch_id_sm, - const typename MeshDomain::AABB_primitive::Id& primitive_id) -{ - typedef typename boost::property_map< - typename MeshDomain::Polyhedron, - face_patch_id_t >::type Fpim; - Fpim fpim = get(face_patch_id_t(), - *(primitive_id.second)); - typename MeshDomain::Patch_id patch_index = get(fpim, - primitive_id.first); - return patch_index; -} }} // end namespace CGAL::Mesh_3 #endif // CGAL_MESH_3_GET_FACET_PATCH_ID_H diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h index 2288db7ef27..a0e2524dbb6 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include @@ -45,7 +45,7 @@ namespace Mesh_3 template @@ -77,12 +77,12 @@ public: typedef std::vector Patches_ids_map; typedef typename CGAL::Default::Get< - Get_facet_patch_id_, - CGAL::Mesh_3::Get_facet_patch_id - >::type Get_facet_patch_id; + Facet_patch_id_map_, + CGAL::Mesh_3::Facet_patch_id_map + >::type Facet_patch_id_map; typedef CGAL::Mesh_3::Filtered_projection_traits< - typename Tree::AABB_traits, Get_facet_patch_id> AABB_filtered_traits; + typename Tree::AABB_traits, Facet_patch_id_map> AABB_filtered_traits; private: typedef CGAL::Search_traits_3 KdTreeTraits; @@ -106,7 +106,7 @@ private: //help to accelerate aabb_tree queries in m_ptree boost::shared_ptr m_kd_tree; - Get_facet_patch_id m_get_facet_patch_id; + Facet_patch_id_map m_facet_patch_id_map; const Patches_ids_map& patches_ids_map; #endif @@ -136,7 +136,7 @@ public: , m_bbox(bbox) , m_domain_is_a_box(domain_is_a_box) #ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS - , m_get_facet_patch_id() + , m_facet_patch_id_map() , patches_ids_map(patches_ids_map) #endif { @@ -425,7 +425,7 @@ private: boundary_ids.begin(), boundary_ids.end(), m_ptree->traits(), - m_get_facet_patch_id); + m_facet_patch_id_map); kd_tree();//build it if needed Neighbor_search search(*m_kd_tree, p, 1); projection_traits.reset(search.begin()->first); 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 c27f99353ec..a2a67d32730 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 @@ -17,7 +17,7 @@ #include #include -#include "Get_facet_patch_id.h" +#include "Facet_patch_id_map.h" #include "Get_curve_index.h" #include // for weight_modifier @@ -32,7 +32,7 @@ template struct Sizing_field_with_aabb_tree { @@ -66,22 +66,23 @@ struct Sizing_field_with_aabb_tree CGAL::Mesh_3::Get_curve_index >::type Get_curve_index; typedef typename CGAL::Default::Get< - Get_facet_patch_id_, - CGAL::Mesh_3::Get_facet_patch_id - >::type Get_facet_patch_id; + Facet_patch_id_map_, + CGAL::Mesh_3::Facet_patch_id_map + >::type Facet_patch_id_map; Sizing_field_with_aabb_tree (typename Kernel_::FT d, const Input_facets_AABB_tree_& aabb_tree, const MeshDomain& domain, Get_curve_index get_curve_index = Get_curve_index(), - Get_facet_patch_id get_facet_patch_id = Get_facet_patch_id() + Facet_patch_id_map facet_patch_id_map = Facet_patch_id_map() ) : d_(d), aabb_tree(aabb_tree), domain(domain), dt(), get_curve_index(get_curve_index), - get_facet_patch_id(get_facet_patch_id) + facet_patch_id_map(facet_patch_id_map) { { Corner_index maximal_corner_index = 0; @@ -230,10 +231,10 @@ struct Sizing_field_with_aabb_tree CGAL::Mesh_3::Filtered_projection_traits< typename Input_facets_AABB_tree_::AABB_traits, - Get_facet_patch_id + Facet_patch_id_map > projection_traits(ids.begin(), ids.end(), aabb_tree.traits(), - get_facet_patch_id); + facet_patch_id_map); aabb_tree.traversal(p, projection_traits); @@ -257,7 +258,7 @@ struct Sizing_field_with_aabb_tree "Ids are { ") % group(setprecision(17),result) % group(setprecision(17),p) - % CGAL::oformat(get(get_facet_patch_id, + % CGAL::oformat(get(facet_patch_id_map, projection_traits.closest_point_and_primitive().second)) % group(setprecision(17), projection_traits.closest_point_and_primitive().first); @@ -293,10 +294,10 @@ struct Sizing_field_with_aabb_tree CGAL::Mesh_3::Filtered_projection_traits < typename Input_facets_AABB_tree_::AABB_traits - , Get_facet_patch_id + , Facet_patch_id_map > projection_traits(ids.begin(), ids.end(), aabb_tree.traits(), - get_facet_patch_id); + facet_patch_id_map); aabb_tree.traversal(p, projection_traits); @@ -307,7 +308,7 @@ struct Sizing_field_with_aabb_tree return result; } - CGAL_assertion(ids.count(get(get_facet_patch_id, + CGAL_assertion(ids.count(get(facet_patch_id_map, projection_traits.closest_point_and_primitive().second)) == 0); result = @@ -326,7 +327,7 @@ struct Sizing_field_with_aabb_tree "Closest face id: %4%\n" "Ids are { ") % result % p % curve_id - % CGAL::oformat(get(get_facet_patch_id, + % CGAL::oformat(get(facet_patch_id_map, projection_traits.closest_point_and_primitive().second)); for(Patch_index i : ids) { s << CGAL::oformat(i) << " "; @@ -345,7 +346,7 @@ struct Sizing_field_with_aabb_tree "Closest face id: %4%\n" "Ids are { ") % result % p % curve_id - % CGAL::oformat(get(get_facet_patch_id, + % CGAL::oformat(get(facet_patch_id_map, projection_traits.closest_point_and_primitive().second)); for(Patch_index i : ids) { s << CGAL::oformat(i) << " "; @@ -527,7 +528,7 @@ private: Corners_incident_patches corners_incident_patches; Corners_incident_curves corners_incident_curves; Get_curve_index get_curve_index; - Get_facet_patch_id get_facet_patch_id; + Facet_patch_id_map facet_patch_id_map; }; #endif // CGAL_MESH_3_SIZING_FIELD_WITH_AABB_TREE_H 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 ec867659a93..fad4622b24d 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 @@ -104,7 +104,7 @@ protected: if ( size > min_sq_length*sq_radius_edge_bound_ ) { #ifdef CGAL_MESH_3_DEBUG_CELL_CRITERIA - std::cerr << "bad cell (radius-edge bound): radius-edge[" + std::cerr << "bad cell " << (void*)(ch.operator->()) << " (radius-edge bound): radius-edge[" << size/min_sq_length << "] bound[" << sq_radius_edge_bound_ << "]\n" ; #endif @@ -185,7 +185,7 @@ protected: if ( size > sq_radius_bound_ ) { #ifdef CGAL_MESH_3_DEBUG_CELL_CRITERIA - std::cerr << "bad cell (radius bound): size[" << size + std::cerr << "bad cell " << (void*)(ch.operator->()) << " (radius bound): size[" << size << "] bound[" << sq_radius_bound_ << "]\n" ; #endif return Is_bad(Quality(sq_radius_bound_/size)); @@ -262,7 +262,7 @@ protected: if ( size > sq_bound ) { #ifdef CGAL_MESH_3_DEBUG_CELL_CRITERIA - std::cerr << "bad cell (radius bound): size[" << size + std::cerr << "bad cell " << (void*)(ch.operator->()) << " (radius bound): size[" << size << "] bound[" << sq_bound << "]\n" ; #endif return Is_bad(Quality(sq_bound/size)); diff --git a/Mesh_3/include/CGAL/Mesh_3/tet_soup_to_c3t3.h b/Mesh_3/include/CGAL/Mesh_3/tet_soup_to_c3t3.h index 677d37124fa..5c2f6d69a08 100644 --- a/Mesh_3/include/CGAL/Mesh_3/tet_soup_to_c3t3.h +++ b/Mesh_3/include/CGAL/Mesh_3/tet_soup_to_c3t3.h @@ -301,7 +301,7 @@ bool build_infinite_cells(Tr& tr, #endif // add the facets to the incident cells map - for (const Cell_handle c : infinite_cells) + for (const Cell_handle& c : infinite_cells) if(!add_infinite_facets_to_incident_cells_map(c, 0, incident_cells_map, verbose)) return false; diff --git a/Mesh_3/include/CGAL/internal/Mesh_3/helpers.h b/Mesh_3/include/CGAL/internal/Mesh_3/helpers.h index 4095bb37baf..f51af8cd0b3 100644 --- a/Mesh_3/include/CGAL/internal/Mesh_3/helpers.h +++ b/Mesh_3/include/CGAL/internal/Mesh_3/helpers.h @@ -45,7 +45,7 @@ void dump_graph_edges(std::ostream& out, const Graph& g) typedef typename boost::graph_traits::edge_descriptor edge_descriptor; out.precision(17); - for(edge_descriptor e : edges(g)) + for(edge_descriptor e : CGAL::make_range(edges(g))) { vertex_descriptor s = source(e, g); vertex_descriptor t = target(e, g); @@ -82,7 +82,7 @@ struct Angle_tester const typename Kernel::Point_3& p1 = g[v1]; const typename Kernel::Point_3& p2 = g[v2]; - return (CGAL::angle(p1, p, p2) == CGAL::ACUTE); + return (CGAL::angle(p1, p, p2) != CGAL::OBTUSE); } } }; diff --git a/Mesh_3/test/Mesh_3/CMakeLists.txt b/Mesh_3/test/Mesh_3/CMakeLists.txt index 6dd24aad08b..5b7ffa7210f 100644 --- a/Mesh_3/test/Mesh_3/CMakeLists.txt +++ b/Mesh_3/test/Mesh_3/CMakeLists.txt @@ -22,8 +22,8 @@ if ( CGAL_FOUND ) # Use Eigen find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) - include(CGAL_Eigen_support) - if (NOT TARGET CGAL::Eigen_support) + include(CGAL_Eigen3_support) + if (NOT TARGET CGAL::Eigen3_support) message(STATUS "This project requires the Eigen library, and will not be compiled.") return() endif() @@ -97,7 +97,7 @@ if ( CGAL_FOUND ) test_mesh_cell_base_3 test_meshing_with_one_step.cpp) if(TARGET ${target}) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endif() endforeach() @@ -121,6 +121,23 @@ if ( CGAL_FOUND ) target_link_libraries(${target} PUBLIC CGAL::TBB_support) endif() endforeach() + + if(BUILD_TESTING) + set_property(TEST + execution___of__test_meshing_verbose + execution___of__test_meshing_polyhedron_with_features + execution___of__test_meshing_implicit_function + execution___of__test_meshing_3D_image + execution___of__test_meshing_3D_gray_image + execution___of__test_meshing_unit_tetrahedron + execution___of__test_meshing_polyhedron + execution___of__test_meshing_polyhedral_complex + execution___of__test_mesh_capsule_var_distance_bound + execution___of__test_mesh_3_issue_1554 + execution___of__test_mesh_polyhedral_domain_with_features_deprecated + execution___of__test_mesh_cell_base_3 + PROPERTY RUN_SERIAL 1) + endif() endif() if(TARGET ITT::ITT) target_link_libraries(test_meshing_polyhedron_with_features PRIVATE ITT::ITT) diff --git a/Mesher_level/include/CGAL/Meshes/Double_map_container.h b/Mesher_level/include/CGAL/Meshes/Double_map_container.h index 074cd5f0091..cc4c7bbface 100644 --- a/Mesher_level/include/CGAL/Meshes/Double_map_container.h +++ b/Mesher_level/include/CGAL/Meshes/Double_map_container.h @@ -42,12 +42,25 @@ namespace CGAL { return m.empty(); } +#if CGAL_MESHES_DEBUG_DOUBLE_MAP + template + std::ostream& debug_element(std::ostream& os, const Element_type& e) { + return os << (void*)(e.operator->()); + } + + template + std::ostream& debug_element(std::ostream& os, const std::pair& e) { + return os << "Facet{" << (void*)(e.first.operator->()) << ", " << e.second << "}"; + } +#endif + Element get_next_element_impl() { CGAL_assertion(!m.empty()); #if CGAL_MESHES_DEBUG_DOUBLE_MAP - std::cerr << "get_next_element_impl(" << &*(m.front()->second) - << ")\n"; + std::cerr << "get_next_element_impl("; + debug_element(std::cerr, m.front()->second); + std::cerr << ")\n"; #endif return m.front()->second; @@ -56,7 +69,9 @@ namespace CGAL { void add_bad_element(const Element& e, const Quality& q) { #if CGAL_MESHES_DEBUG_DOUBLE_MAP - std::cerr << "add_bad_element(" << &*e << ")\n"; + std::cerr << "add_bad_element("; + debug_element(std::cerr, e); + std::cerr << ")\n"; #endif m.insert(e, q); } @@ -69,7 +84,9 @@ namespace CGAL { void remove_element(const Element& e) { #if CGAL_MESHES_DEBUG_DOUBLE_MAP - std::cerr << "remove_element(" << &*e << ")\n"; + std::cerr << "remove_element("; + debug_element(std::cerr, e); + std::cerr << ")\n"; #endif m.erase(e); } diff --git a/Minkowski_sum_2/examples/Minkowski_sum_2/approx_inset.cpp b/Minkowski_sum_2/examples/Minkowski_sum_2/approx_inset.cpp index 6d6fd9c7110..1a4b76e2f95 100644 --- a/Minkowski_sum_2/examples/Minkowski_sum_2/approx_inset.cpp +++ b/Minkowski_sum_2/examples/Minkowski_sum_2/approx_inset.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include @@ -33,9 +33,10 @@ int main(int argc, char* argv[]) // Approximate the offset polygon. std::list inset_polygons; - boost::timer timer; + CGAL::Timer timer; + timer.start(); approximated_inset_2(P, 1, 0.00001, std::back_inserter(inset_polygons)); - double secs = timer.elapsed(); + double secs = timer.time(); std::list::iterator it; std::cout << "The inset comprises " << inset_polygons.size() diff --git a/Minkowski_sum_2/examples/Minkowski_sum_2/approx_offset.cpp b/Minkowski_sum_2/examples/Minkowski_sum_2/approx_offset.cpp index e7a7169ae0a..5da48b1c819 100644 --- a/Minkowski_sum_2/examples/Minkowski_sum_2/approx_offset.cpp +++ b/Minkowski_sum_2/examples/Minkowski_sum_2/approx_offset.cpp @@ -2,7 +2,7 @@ // Computing the approximated offset of a polygon. #include -#include +#include #include @@ -26,9 +26,10 @@ int main(int argc, char* argv[]) << std::endl; // Approximate the offset polygon with radius 5 and error bound 0.00001. - boost::timer timer; + CGAL::Timer timer; + timer.start(); Polygon_with_holes_2 offset = CGAL::approximated_offset_2(P, 5, 0.00001); - double secs = timer.elapsed(); + double secs = timer.time(); std::cout << "The offset polygon has " << offset.outer_boundary().size() << " vertices, " << offset.number_of_holes() << " holes." diff --git a/Minkowski_sum_2/examples/Minkowski_sum_2/exact_inset.cpp b/Minkowski_sum_2/examples/Minkowski_sum_2/exact_inset.cpp index 4834e4f0d5e..5e83a313a07 100644 --- a/Minkowski_sum_2/examples/Minkowski_sum_2/exact_inset.cpp +++ b/Minkowski_sum_2/examples/Minkowski_sum_2/exact_inset.cpp @@ -14,7 +14,7 @@ int main() #else #include -#include +#include #include #include @@ -43,9 +43,10 @@ int main(int argc, char* argv[]) // Compute the inner offset of the polygon. Traits traits; std::list inset_polygons; - boost::timer timer; + CGAL::Timer timer; + timer.start(); inset_polygon_2(P, 1, traits, std::back_inserter(inset_polygons)); - double secs = timer.elapsed(); + double secs = timer.time(); std::list::iterator it; std::cout << "The inset comprises " diff --git a/Minkowski_sum_2/examples/Minkowski_sum_2/exact_offset.cpp b/Minkowski_sum_2/examples/Minkowski_sum_2/exact_offset.cpp index 5bc45a69f9c..46f9155e6c2 100644 --- a/Minkowski_sum_2/examples/Minkowski_sum_2/exact_offset.cpp +++ b/Minkowski_sum_2/examples/Minkowski_sum_2/exact_offset.cpp @@ -14,7 +14,7 @@ int main() #else #include -#include +#include #include #include @@ -42,9 +42,10 @@ int main(int argc, char* argv[]) // Compute the offset polygon. Traits traits; - boost::timer timer; + CGAL::Timer timer; + timer.start(); Offset_polygon_with_holes_2 offset = CGAL::offset_polygon_2(P, 5, traits); - double secs = timer.elapsed(); + double secs = timer.time(); std::cout << "The offset polygon has " << offset.outer_boundary().size() << " vertices, " << offset.number_of_holes() << " holes." diff --git a/Minkowski_sum_2/test/Minkowski_sum_2/CMakeLists.txt b/Minkowski_sum_2/test/Minkowski_sum_2/CMakeLists.txt index 831697fb97a..295d50fdbc2 100644 --- a/Minkowski_sum_2/test/Minkowski_sum_2/CMakeLists.txt +++ b/Minkowski_sum_2/test/Minkowski_sum_2/CMakeLists.txt @@ -11,10 +11,6 @@ project(Minkowski_sum_2_Tests) # return() # endif() -# # Use C++11 for this directory and its sub-directories. -# set(CMAKE_CXX_STANDARD 11) -# set(CMAKE_CXX_STANDARD_REQUIRED TRUE) - find_package(CGAL REQUIRED COMPONENTS Core) include(${CGAL_USE_FILE}) diff --git a/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cpp b/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cpp index 6a3fe2917b1..2e30822894f 100644 --- a/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cpp +++ b/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cpp @@ -8,7 +8,7 @@ #include #include -#include +#include typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; typedef CGAL::Polygon_2 Polygon_2; @@ -146,7 +146,8 @@ int main(int argc, char* argv[]) } Polygon_with_holes_2 p, q; - boost::timer timer; + CGAL::Timer timer; + timer.start(); std::list strategies; @@ -186,9 +187,9 @@ int main(int argc, char* argv[]) std::list::iterator it; for (it = strategies.begin(); it != strategies.end(); ++it) { std::cout << "Using " << strategy_names[*it] << ": "; - timer.restart(); + timer.reset(); Polygon_with_holes_2 result = compute_minkowski_sum_2(p, q, *it); - double secs = timer.elapsed(); + double secs = timer.time(); std::cout << secs << " s " << std::flush; if (compare) { diff --git a/Nef_2/include/CGAL/Nef_2/PM_io_parser.h b/Nef_2/include/CGAL/Nef_2/PM_io_parser.h index 85295f3d85a..39b99b37d7c 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_io_parser.h +++ b/Nef_2/include/CGAL/Nef_2/PM_io_parser.h @@ -200,6 +200,11 @@ bool PM_io_parser::read_vertex(Vertex_handle v) !(in >> p) || !check_sep("}") ) return false; + if(!(f >= 0 && ((iso && (std::size_t)f < fn) || (!iso && (std::size_t)f < en)))) + { + in.setstate(std::ios_base::badbit); + return false; + } if (iso) v->set_face(Face_of[f]); else v->set_halfedge(Halfedge_of[f]); mark(v) = m; point(v) = p; @@ -229,10 +234,14 @@ bool PM_io_parser::read_hedge(Halfedge_handle e) !(in >> f) || !check_sep(",") || !(in >> m) || !check_sep("}") ) return false; - CGAL_assertion_msg - (eo >= 0 || (std::size_t) eo < en || epr >= 0 || (std::size_t) epr < en || ene >= 0 || (std::size_t) ene < en || - v >= 0 || (std::size_t) v < vn || f >= 0 || (std::size_t) f < fn , - "wrong index in read_hedge"); + + if(!(eo >= 0 && (std::size_t) eo < en && epr >= 0 && (std::size_t) epr < en && ene >= 0 && (std::size_t) ene < en && + v >= 0 && (std::size_t) v < vn && f >= 0 && (std::size_t) f < fn )) + { + in.setstate(std::ios_base::badbit); + std::cerr<<"wrong index in read_hedge"<opposite()]); @@ -267,14 +276,28 @@ bool PM_io_parser::read_face(Face_handle f) int n, ei, vi; Mark m; if ( !(in >> n) || !check_sep("{") ) return false; if ( !(in >> ei) || !check_sep(",") ) return false; - if (ei >= 0) f->set_halfedge(Halfedge_of[ei]); + if (ei >= 0 && (std::size_t) ei < en) + { + f->set_halfedge(Halfedge_of[ei]); + } + while (in >> ei) { CGAL_assertion_msg(ei >= 0 && (std::size_t) ei < en, "wrong index in face cycle list."); + if (!(ei >= 0 && (std::size_t)ei < en)) + { + in.setstate(std::ios_base::badbit); + return false; + } f->store_fc(Halfedge_of[ei]); } in.clear(); if (!check_sep(",")) { return false; } while (in >> vi) { CGAL_assertion_msg(vi >= 0 && (std::size_t) vi < vn, "wrong index in iso vertex list."); + if (!(vi >= 0 && (std::size_t)vi < vn)) + { + in.setstate(std::ios_base::badbit); + return false; + } f->store_iv(Vertex_of[vi]); } in.clear(); if (!check_sep(",") || !(in >> m) || !check_sep("}") ) @@ -313,13 +336,26 @@ template void PM_io_parser::read() { if ( !check_sep("Plane_map_2") ) - CGAL_error_msg("PM_io_parser::read: no embedded_PM header."); + { + CGAL_warning_msg(false, "PM_io_parser::read: no embedded_PM header."); + return; + } if ( !(check_sep("vertices") && (in >> vn)) ) - CGAL_error_msg("PM_io_parser::read: wrong node line."); + { + CGAL_warning_msg(false, "PM_io_parser::read: wrong node line."); + return; + } + if ( !(check_sep("halfedges") && (in >> en) && (en%2==0)) ) - CGAL_error_msg("PM_io_parser::read: wrong edge line."); + { + CGAL_warning_msg(false, "PM_io_parser::read: wrong edge line."); + return; + } if ( !(check_sep("faces") && (in >> fn)) ) - CGAL_error_msg("PM_io_parser::read: wrong face line."); + { + CGAL_warning_msg(false, "PM_io_parser::read: wrong face line."); + return; + } Vertex_of.resize(vn); Halfedge_of.resize(en); @@ -333,16 +369,24 @@ void PM_io_parser::read() for(i=0; i #ifdef NDEBUG -#undef CGAL_NEF_DEBUG -#define CGAL_NEF_DEBUG 1 +#undef CGAL_USE_TRACE #endif #ifndef CGAL_NEF_DEBUG #define CGAL_NEF_DEBUG 1 #endif -#ifndef NDEBUG +#ifdef CGAL_USE_TRACE static int debugthread=1; #endif @@ -35,45 +34,43 @@ #undef CGAL_NEF_CTRACEN #undef CGAL_NEF_SETDTHREAD -#ifndef NDEBUG +#ifdef CGAL_USE_TRACE #define CGAL_NEF_SETDTHREAD(l) debugthread=l #else #define CGAL_NEF_SETDTHREAD(l) #endif -#ifndef NDEBUG +#ifdef CGAL_USE_TRACE #define CGAL_NEF_TRACE(t) if((debugthread%CGAL_NEF_DEBUG)==0) \ - std::cerr<<" "<(0)) #endif -#ifndef NDEBUG +#ifdef CGAL_USE_TRACE #define CGAL_NEF_TRACEV(t) if((debugthread%CGAL_NEF_DEBUG)==0) \ - std::cerr<<" "<<#t<<" = "<<(t)<(0)) #endif -#ifndef NDEBUG -#define CGAL_NEF_CTRACE(b,t) if(b) std::cerr<<" "<(0)) #endif -#ifndef NDEBUG -#define CGAL_NEF_CTRACEN(b,t) if(b) std::cerr<<" "<(0)) #endif #endif // CGAL_NEF_2_DEBUG_H diff --git a/Nef_2/include/CGAL/Nef_polyhedron_2.h b/Nef_2/include/CGAL/Nef_polyhedron_2.h index 92c54593386..62aad3e5649 100644 --- a/Nef_2/include/CGAL/Nef_polyhedron_2.h +++ b/Nef_2/include/CGAL/Nef_polyhedron_2.h @@ -1112,6 +1112,8 @@ std::istream& operator>> std::cerr << "Nef_polyhedron_2 input corrupted." << std::endl; NP = Nef_polyhedron_2(); } + if(!is) + return is; typename Nef_polyhedron_2::Topological_explorer D(NP.explorer()); D.check_integrity_and_topological_planarity(); return is; 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 ccd9e3fdb37..99b71db68a1 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 @@ -28,13 +28,16 @@ template struct Exact_intersect_xy_2; template struct Exact_intersect_xy_2 { - typedef typename R::Point_2 Point_2; - typedef typename R::Segment_2 Segment_2; + typedef typename R::Point_2 Point_2; + typedef typename R::Segment_2 Segment_2; - typedef typename R::Point_3 Point_3; - typedef typename R::Segment_3 Segment_3; + typedef typename R::Point_3 Point_3; + typedef typename R::Segment_3 Segment_3; - CGAL::Object operator() (Segment_3 s3, Segment_3 t3) + typedef boost::variant variant_type; + + boost::optional + operator() (const Segment_3& s3, const Segment_3& t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -50,17 +53,21 @@ struct Exact_intersect_xy_2 // convert intersection from Object_2 to Object_3 // Note: there is not necessarily a spartial intersection, // so all third components are faked! - CGAL::Object obj = intersection (s2,t2); - if ( CGAL::assign(p2, obj) ) - { obj = make_object (Point_3 (p2.x(),p2.y(),0)); + auto obj = intersection (s2,t2); + if(! obj){ + return boost::none; } - else if ( CGAL::assign(s2, obj) ) - { p2 = s2.source(); - q2 = s2.target(); - obj = make_object( Segment_3( - Point_3(p2.x(),p2.y(),0), Point_3(q2.x(),q2.y(),0) ) ); + if (const Point_2* pi = boost::get(&*obj)) + { + return boost::make_optional(variant_type(Point_3(p2.x(),p2.y(),0))); } - return obj; + + 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), + Point_3(q2.x(),q2.y(),0) ) )); } }; @@ -73,7 +80,9 @@ struct Exact_intersect_xy_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - CGAL::Object operator() (Segment_3 s3, Segment_3 t3) + typedef boost::variant variant_type; + + boost::optional operator() (Segment_3 s3, Segment_3 t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -91,18 +100,21 @@ struct Exact_intersect_xy_2 // convert intersection from Object_2 to Object_3 // Note: there is not necessarily a spartial intersection, // so all third components are faked! - CGAL::Object obj = intersection (s2,t2); - if ( CGAL::assign(p2, obj) ) - { obj = make_object (Point_3 (p2.hx(),p2.hy(),0,p2.hw())); + auto obj = intersection (s2,t2); + if(! obj){ + return boost::none; } - else if ( CGAL::assign(s2, obj) ) - { p2 = s2.source(); - q2 = s2.target(); - obj = make_object( Segment_3( - Point_3 (p2.hx(),p2.hy(),0,p2.hw()), - Point_3 (q2.hx(),q2.hy(),0,q2.hw()) ) ); + if (const Point_2* pi = boost::get(&*obj)) + { + return boost::make_optional(variant_type(Point_3(p2.hx(),p2.hy(),0,p2.hw()))); } - return obj; + + 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()), + 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 0e1ccf6864a..7d77eaae669 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,10 @@ struct Exact_intersect_xz_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - CGAL::Object operator() (Segment_3 s3, Segment_3 t3) + typedef boost::variant variant_type; + + boost::optional + operator() (const Segment_3& s3, const Segment_3& t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -48,18 +51,22 @@ struct Exact_intersect_xz_2 // convert intersection from Object_2 to Object_3 // Note: there is not necessarily a spartial intersection, - // so all second components are faked! - CGAL::Object obj = intersection (s2,t2); - if ( CGAL::assign(p2, obj) ) - { obj = make_object (Point_3 (p2.x(),0,p2.y())); + // so all third components are faked! + auto obj = intersection (s2,t2); + if(! obj){ + return boost::none; } - else if ( CGAL::assign(s2, obj) ) - { p2 = s2.source(); - q2 = s2.target(); - obj = make_object( Segment_3( - Point_3(p2.x(),0,p2.y()), Point_3(q2.x(),0,q2.y()) ) ); + if (const Point_2* pi = boost::get(&*obj)) + { + return boost::make_optional(variant_type(Point_3(p2.x(),0,p2.y()))); } - return obj; + + 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()), + Point_3(q2.x(),0,q2.y()) ) )); } }; @@ -72,7 +79,9 @@ struct Exact_intersect_xz_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - CGAL::Object operator() (Segment_3 s3, Segment_3 t3) + typedef boost::variant variant_type; + + boost::optional operator() (Segment_3 s3, Segment_3 t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -89,20 +98,24 @@ struct Exact_intersect_xz_2 // convert intersection from Object_2 to Object_3 // Note: there is not necessarily a spartial intersection, - // so all second components are faked! - CGAL::Object obj = intersection (s2,t2); - if ( CGAL::assign(p2, obj) ) - { obj = make_object (Point_3 (p2.hx(),0,p2.hy(),p2.hw())); + // so all third components are faked! + auto obj = intersection (s2,t2); + if(! obj){ + return boost::none; } - else if ( CGAL::assign(s2, obj) ) - { p2 = s2.source(); - q2 = s2.target(); - obj = make_object( Segment_3( - Point_3 (p2.hx(),0,p2.hy(),p2.hw()), - Point_3 (q2.hx(),0,q2.hy(),q2.hw()) ) ); + if (const Point_2* pi = boost::get(&*obj)) + { + return boost::make_optional(variant_type(Point_3(p2.hx(),0,p2.hy(),p2.hw()))); } - return obj; + + 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()), + Point_3 (q2.hx(),0,q2.hy(),q2.hw())) )); } + }; template 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 9779a836401..a98b74fd144 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,10 @@ struct Exact_intersect_yz_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - CGAL::Object operator() (Segment_3 s3, Segment_3 t3) + typedef boost::variant variant_type; + + boost::optional + operator() (const Segment_3& s3, const Segment_3& t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -49,18 +52,22 @@ struct Exact_intersect_yz_2 // convert intersection from Object_2 to Object_3 // Note: there is not necessarily a spartial intersection, - // so all first components are faked! - CGAL::Object obj = intersection (s2,t2); - if ( CGAL::assign(p2, obj) ) - { obj = make_object (Point_3 (0,p2.x(),p2.y())); + // so all third components are faked! + auto obj = intersection (s2,t2); + if(! obj){ + return boost::none; } - else if ( CGAL::assign(s2, obj) ) - { p2 = s2.source(); - q2 = s2.target(); - obj = make_object( Segment_3( - Point_3(0,p2.x(),p2.y()), Point_3(0,q2.x(),q2.y()) ) ); + if (const Point_2* pi = boost::get(&*obj)) + { + return boost::make_optional(variant_type(Point_3(0,p2.x(),p2.y()))); } - return obj; + + 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()), + Point_3(0,q2.x(),q2.y()) ) )); } }; @@ -73,7 +80,9 @@ struct Exact_intersect_yz_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - CGAL::Object operator() (Segment_3 s3, Segment_3 t3) + typedef boost::variant variant_type; + + boost::optional operator() (Segment_3 s3, Segment_3 t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -90,19 +99,22 @@ struct Exact_intersect_yz_2 // convert intersection from Object_2 to Object_3 // Note: there is not necessarily a spartial intersection, - // so all first components are faked! - CGAL::Object obj = intersection (s2,t2); - if ( CGAL::assign(p2, obj) ) - { obj = make_object (Point_3 (0,p2.hx(),p2.hy(),p2.hw())); + // so all third components are faked! + auto obj = intersection (s2,t2); + if(! obj){ + return boost::none; } - else if ( CGAL::assign(s2, obj) ) - { p2 = s2.source(); - q2 = s2.target(); - obj = make_object( Segment_3( - Point_3 (0,p2.hx(),p2.hy(),p2.hw()), - Point_3 (0,q2.hx(),q2.hy(),q2.hw()) ) ); + if (const Point_2* pi = boost::get(&*obj)) + { + return boost::make_optional(variant_type(Point_3(0,p2.hx(),p2.hy(),p2.hw()))); } - return obj; + + 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()), + Point_3 (0,q2.hx(),q2.hy(),q2.hw())) )); } }; diff --git a/Nef_3/include/CGAL/Nef_3/K3_tree.h b/Nef_3/include/CGAL/Nef_3/K3_tree.h index 6c4a3fa6f42..c3b8aaecffc 100644 --- a/Nef_3/include/CGAL/Nef_3/K3_tree.h +++ b/Nef_3/include/CGAL/Nef_3/K3_tree.h @@ -524,19 +524,18 @@ else { Segment_3 s = S.front().second; S.pop_front(); if( n->is_leaf()) { -#ifndef NDEBUG + CGAL_assertion_code( - if( first_segment) { - first_segment = false; - CGAL_NEF_TRACEN("operator++: prev_segment=(none), segment="<::Vector_3 get_vector(const CGAL::Vector_3& v){ ret template class moreLeft : public T { - typedef typename T::SM_decorator SM_decorator; typedef typename T::SHalfedge_handle SHalfedge_handle; typedef typename T::Vector_3 Vector_3; typedef typename T::FT FT; typedef typename T::RT RT; public: - moreLeft(T D) : T(D) {} + moreLeft(const T& D) : T(D) {} - int operator()(SHalfedge_handle se1, SHalfedge_handle se2) { + int operator()(SHalfedge_handle se1, SHalfedge_handle se2) const { CGAL_assertion(se1 != SHalfedge_handle()); if(se2 == SHalfedge_handle()) return -1; - SM_decorator SM(&*se1->source()->source()); Vector_3 vec1 = se1->circle().orthogonal_vector(); Vector_3 vec2 = se2->circle().orthogonal_vector(); @@ -181,15 +179,15 @@ class moreLeft : public T { }; template -class sort_vertices : public SNC_decorator { +class sort_vertices : public SNC_const_decorator { typedef T SNC_structure; - typedef CGAL::SNC_decorator Base; + typedef CGAL::SNC_const_decorator Base; typedef typename T::Vertex_handle Vertex_handle; typedef typename T::Point_3 Point_3; public: - sort_vertices(T& D) : Base(D) {} + sort_vertices(const T& D) : Base(D) {} bool operator() (Vertex_handle v1, Vertex_handle v2) const { return lexicographically_xyz_smaller(v1->point(), v2->point()); @@ -197,14 +195,14 @@ class sort_vertices : public SNC_decorator { }; template -class sort_edges : public SNC_decorator { +class sort_edges : public SNC_const_decorator { typedef T SNC_structure; - typedef CGAL::SNC_decorator Base; + typedef CGAL::SNC_const_decorator Base; typedef typename T::Halfedge_handle Halfedge_handle; public: - sort_edges(T& D) : Base(D) {} + sort_edges(const T& D) : Base(D) {} bool operator() (Halfedge_handle e1, Halfedge_handle e2) const { sort_vertices SORT(*this->sncp()); @@ -215,17 +213,17 @@ class sort_edges : public SNC_decorator { }; template -class sort_facets : public SNC_decorator { +class sort_facets : public SNC_const_decorator { typedef T SNC_structure; - typedef SNC_decorator Base; + typedef SNC_const_decorator Base; typedef typename T::Halffacet_handle Halffacet_handle; typedef typename T::SHalfedge_handle SHalfedge_handle; typedef typename T::Vector_3 Vector_3; typedef typename T::Plane_3 Plane_3; public: - sort_facets(T& D) : Base(D) {} + sort_facets(const T& D) : Base(D) {} bool operator() (Halffacet_handle f1, Halffacet_handle f2) const { @@ -259,17 +257,17 @@ class sort_facets : public SNC_decorator { }; template -class sort_sedges : public SNC_decorator { +class sort_sedges : public SNC_const_decorator { typedef T SNC_structure; - typedef CGAL::SNC_decorator Base; + typedef CGAL::SNC_const_decorator Base; typedef CGAL::SM_decorator SM_decorator; typedef typename T::Vertex_handle Vertex_handle; typedef typename T::SHalfedge_handle SHalfedge_handle; typedef typename T::Sphere_circle Sphere_circle; public: - sort_sedges(T& D) : Base(D) {} + sort_sedges(const T& D) : Base(D) {} bool operator() (SHalfedge_handle se1, SHalfedge_handle se2) const { CGAL_NEF_TRACEN("sort sedges"); @@ -322,14 +320,14 @@ class sort_sedges : public SNC_decorator { template -class sort_sloops : public SNC_decorator { +class sort_sloops : public SNC_const_decorator { typedef T SNC_structure; - typedef CGAL::SNC_decorator Base; + typedef CGAL::SNC_const_decorator Base; typedef typename T::SHalfloop_handle SHalfloop_handle; public: - sort_sloops(T& D) : Base(D) {} + sort_sloops(const T& D) : Base(D) {} bool operator() (SHalfloop_handle sl1, SHalfloop_handle sl2) const { if(sl1 == sl2) return false; @@ -342,10 +340,10 @@ class sort_sloops : public SNC_decorator { }; template -class sort_sface_cycle_entries : public SNC_decorator { +class sort_sface_cycle_entries : public SNC_const_decorator { typedef T SNC_structure; - typedef CGAL::SNC_decorator Base; + typedef CGAL::SNC_const_decorator Base; typedef typename T::SM_decorator SM_decorator; typedef typename T::Object_handle Object_handle; typedef typename T::SVertex_handle SVertex_handle; @@ -356,7 +354,7 @@ class sort_sface_cycle_entries : public SNC_decorator { typedef typename T::Vector_3 Vector_3; public: - sort_sface_cycle_entries(T D) : Base(D) {} + sort_sface_cycle_entries(const T& D) : Base(D) {} bool operator() (Object_handle o1, Object_handle o2) const { CGAL_NEF_TRACEN("sort sface cycles "); @@ -414,10 +412,10 @@ class sort_sface_cycle_entries : public SNC_decorator { }; template -class sort_sfaces : public SNC_decorator { +class sort_sfaces : public SNC_const_decorator { typedef T SNC_structure; - typedef CGAL::SNC_decorator Base; + typedef CGAL::SNC_const_decorator Base; typedef typename T::SM_decorator SM_decorator; typedef typename T::Point_3 Point_3; typedef typename T::Vector_3 Vector_3; @@ -430,7 +428,7 @@ class sort_sfaces : public SNC_decorator { SHalfedge_around_sface_circulator; public: - sort_sfaces(T& D) : Base(D) {} + sort_sfaces(const T& D) : Base(D) {} bool operator() (SFace_handle sf1, SFace_handle sf2) const { CGAL_NEF_TRACEN("sort sfaces"); @@ -442,11 +440,11 @@ class sort_sfaces : public SNC_decorator { if(sf1->center_vertex() != sf2->center_vertex()) return SORT(sf1->center_vertex(), sf2->center_vertex()); - // sort_sface_cycle_entries sort_cycles((Base) *this); + // sort_sface_cycle_entries sort_cycles(*this); // return sort_cycles(*sf1->sface_cycles_begin(), *sf2->sface_cycles_begin()); SM_decorator SD(&*sf1->center_vertex()); - moreLeft ml((Base) *this); + moreLeft ml(*this); Vector_3 plus(1,0,0); SFace_cycle_iterator fc; @@ -530,15 +528,15 @@ class sort_sfaces : public SNC_decorator { }; template -class sort_volumes : public SNC_decorator { +class sort_volumes : public SNC_const_decorator { typedef T SNC_structure; - typedef CGAL::SNC_decorator Base; + typedef CGAL::SNC_const_decorator Base; typedef typename T::Volume_handle Volume_handle; typedef typename T::SFace_handle SFace_handle; public: - sort_volumes(T& D) : Base(D) {} + sort_volumes(const T& D) : Base(D) {} bool operator() (Volume_handle c1, Volume_handle c2) const { CGAL_NEF_TRACEN("sort volumes"); @@ -563,7 +561,7 @@ class sort_facet_cycle_entries : public T { typedef typename T::Vector_3 Vector_3; public: - sort_facet_cycle_entries(T D) : T(D) {} + sort_facet_cycle_entries(const T& D) : T(D) {} bool operator() (Object_handle o1, Object_handle o2) const { @@ -611,7 +609,7 @@ class sort_shell_entries : public T { typedef typename T::Point_3 Point_3; public: - sort_shell_entries(T D) : T(D) {} + sort_shell_entries(const T& D) : T(D) {} bool operator() (Object_handle o1, Object_handle o2) const { SFace_handle sf1, sf2; @@ -627,10 +625,10 @@ class sort_shell_entries : public T { }; template -struct find_minimal_sface_of_shell : public SNC_decorator { +struct find_minimal_sface_of_shell : public SNC_const_decorator { typedef T SNC_structure; - typedef CGAL::SNC_decorator Base; + typedef CGAL::SNC_const_decorator Base; typedef typename T::Vertex_handle Vertex_handle; typedef typename T::Halfedge_handle Halfedge_handle; typedef typename T::Halffacet_handle Halffacet_handle; @@ -643,7 +641,7 @@ struct find_minimal_sface_of_shell : public SNC_decorator { SFace_handle sf_min; sort_sfaces SORT; - find_minimal_sface_of_shell(T& D, SFace_visited_hash& Vi) + find_minimal_sface_of_shell(const T& D, SFace_visited_hash& Vi) : Base(D), Done(Vi), SORT(D) {} void visit(SFace_handle h) { @@ -1076,7 +1074,7 @@ public: { Self O(os,W, sort); O.print(); } template - void output_sorted_indexes(Iter begin, Iter end, Index i) const { + void output_sorted_indexes(Iter begin, Iter end, const Index& i) const { int low = i[begin]; int high = low; for(Iter it=begin; it != end; it++) { @@ -1193,7 +1191,7 @@ SNC_io_parser::SNC_io_parser(std::ostream& os, SNC_structure& W, } } fi->plane() = normalized(fi->plane()); - fi->boundary_entry_objects().sort(sort_facet_cycle_entries((Base) *this)); + fi->boundary_entry_objects().sort(sort_facet_cycle_entries(*this)); } FL.push_back(fi); } @@ -1262,7 +1260,7 @@ SNC_io_parser::SNC_io_parser(std::ostream& os, SNC_structure& W, *fc = make_object(se); } } - sfi->boundary_entry_objects().sort(sort_sface_cycle_entries((Base) *this)); + sfi->boundary_entry_objects().sort(sort_sface_cycle_entries(*this)); } SFL.push_back(sfi); } @@ -1287,7 +1285,7 @@ SNC_io_parser::SNC_io_parser(std::ostream& os, SNC_structure& W, visit_shell_objects(SFace_handle(it),findMinSF); *it = make_object(findMinSF.minimal_sface()); } - ci->shell_entry_objects().sort(sort_shell_entries((Base)*this)); + ci->shell_entry_objects().sort(sort_shell_entries(*this)); } CL.push_back(ci); } @@ -1400,24 +1398,47 @@ template void SNC_io_parser::read() { if ( !check_sep("Selective Nef Complex") ) - CGAL_error_msg("SNC_io_parser::read: no SNC header."); + { + CGAL_warning_msg(false, "SNC_io_parser::read: no SNC header."); + return; + } std::string kernel_type; in >> kernel_type; CGAL_assertion(kernel_type == "standard" || kernel_type == "extended"); if ( !(check_sep("vertices") && (in >> vn)) ) - CGAL_error_msg("SNC_io_parser::read: wrong vertex line."); + { + CGAL_warning_msg(false, "SNC_io_parser::read: wrong vertex line."); + return; + } if ( !(check_sep("halfedges") && (in >> en) && (en%2==0)) ) - CGAL_error_msg("SNC_io_parser::read: wrong edge line."); + { + CGAL_warning_msg(false, "SNC_io_parser::read: wrong edge line."); + return; + } if ( !(check_sep("facets") && (in >> fn) && (fn%2==0)) ) - CGAL_error_msg("SNC_io_parser::read: wrong facet line."); + { + CGAL_warning_msg(false, "SNC_io_parser::read: wrong facet line."); + } if ( !(check_sep("volumes") && (in >> cn)) ) - CGAL_error_msg("SNC_io_parser::read: wrong volume line."); + { + CGAL_warning_msg(false, "SNC_io_parser::read: wrong volume line."); + return; + } if ( !(check_sep("shalfedges") && (in >> sen)) ) - CGAL_error_msg("SNC_io_parser::read: wrong sedge line."); + { + CGAL_warning_msg(false, "SNC_io_parser::read: wrong sedge line."); + return; + } if ( !(check_sep("shalfloops") && (in >> sln)) ) - CGAL_error_msg("SNC_io_parser::read: wrong sloop line."); + { + CGAL_warning_msg(false, "SNC_io_parser::read: wrong sloop line."); + return; + } if ( !(check_sep("sfaces") && (in >> sfn)) ) - CGAL_error_msg("SNC_io_parser::read: wrong sface line."); + { + CGAL_warning_msg(false, "SNC_io_parser::read: wrong sface line."); + return; + } addInfiBox = (kernel_type == "standard" && Infi_box::extended_kernel()); @@ -1444,40 +1465,61 @@ void SNC_io_parser::read_items(int plus01) { typename std::vector::iterator vi; for(vi=Vertex_of.begin(); vi!=Vertex_of.end(); ++vi) { if (!read_vertex(*vi)) - CGAL_error_msg("SNC_io_parser::read: error in node line"); + { + CGAL_warning_msg(false, "SNC_io_parser::read: error in node line"); + return; + } } typename std::vector::iterator ei; for(ei=Edge_of.begin(); ei!=Edge_of.end(); ++ei) { if (!read_edge(*ei)) - CGAL_error_msg("SNC_io_parser::read: error in edge line"); + { + CGAL_warning_msg(false, "SNC_io_parser::read: error in edge line"); + return; + } } typedef typename std::vector::iterator vhf_iterator; vhf_iterator fi; for(fi=Halffacet_of.begin(); fi!=Halffacet_of.end(); ++fi) { if (!read_facet(*fi)) - CGAL_error_msg("SNC_io_parser::read: error in facet line"); + { + CGAL_warning_msg(false, "SNC_io_parser::read: error in facet line"); + return; + } } typename std::vector::iterator ci; for(ci=Volume_of.begin()+plus01; ci!=Volume_of.end(); ++ci) { if (!read_volume(*ci)) - CGAL_error_msg("SNC_io_parser::read: error in volume line"); + { + CGAL_warning_msg(false, "SNC_io_parser::read: error in volume line"); + return; + } } typename std::vector::iterator sei; for(sei=SEdge_of.begin(); sei!=SEdge_of.end(); ++sei) { if (!read_sedge(*sei)) - CGAL_error_msg("SNC_io_parser::read: error in sedge line"); + { + CGAL_warning_msg(false, "SNC_io_parser::read: error in sedge line"); + return; + } } typename std::vector::iterator sli; for(sli=SLoop_of.begin(); sli!=SLoop_of.end(); ++sli) { if (!read_sloop(*sli)) - CGAL_error_msg("SNC_io_parser::read: error in sloop line"); + { + CGAL_warning_msg(false, "SNC_io_parser::read: error in sloop line"); + return; + } } typename std::vector::iterator sfi; for(sfi=SFace_of.begin(); sfi!=SFace_of.end(); ++sfi) { if (!read_sface(*sfi)) - CGAL_error_msg("SNC_io_parser::read: error in sface line"); + { + CGAL_warning_msg(false, "SNC_io_parser::read: error in sface line"); + return; + } } SNC_constructor C(*this->sncp()); @@ -1535,21 +1577,56 @@ read_vertex(Vertex_handle vh) { vh->sncp() = this->sncp(); in >> index; + if(index >= (int)en) + { + in.setstate(std::ios_base::badbit); + return false; + } vh->svertices_begin() = (index >= 0 ? Edge_of[index] : this->svertices_end()); in >> index; + if(index >= int(en)) + { + in.setstate(std::ios_base::badbit); + return false; + } vh->svertices_last() = index >= 0 ? Edge_of[index] : this->svertices_end(); OK = OK && test_string(","); in >> index; + if(index >= int(sen)) + { + in.setstate(std::ios_base::badbit); + return false; + } vh->shalfedges_begin() = index >= 0 ? SEdge_of[index] : this->shalfedges_end(); in >> index; + if(index >= int(sen)) + { + in.setstate(std::ios_base::badbit); + return false; + } vh->shalfedges_last() = index >= 0 ? SEdge_of[index] : this->shalfedges_end(); OK = OK && test_string(","); in >> index; + if(index >= int(sfn)) + { + in.setstate(std::ios_base::badbit); + return false; + } vh->sfaces_begin() = index >= 0 ? SFace_of[index] : this->sfaces_end(); in >> index; + if(index >= int(sfn)) + { + in.setstate(std::ios_base::badbit); + return false; + } vh->sfaces_last() = index >= 0 ? SFace_of[index] : this->sfaces_end(); OK = OK && test_string(","); in >> index; + if(index >= int(sln)) + { + in.setstate(std::ios_base::badbit); + return false; + } vh->shalfloop() = index >= 0 ? SLoop_of[index] : this->shalfloops_end(); OK = OK && test_string("|"); #ifdef CGAL_NEF_NATURAL_COORDINATE_INPUT @@ -1604,17 +1681,37 @@ read_edge(Halfedge_handle eh) { OK = OK && test_string("{"); in >> index; + if(index < 0 || index >= int(en)) + { + in.setstate(std::ios_base::badbit); + return false; + } eh->twin() = Edge_of[index]; OK = OK && test_string(","); in >> index; + if(index < 0 || index >= int(vn)) + { + in.setstate(std::ios_base::badbit); + return false; + } eh->center_vertex() = Vertex_of[index]; OK = OK && test_string(","); in >> index; if(index == 0) { in >> index; + if(index < 0 || index >= int(sen)) + { + in.setstate(std::ios_base::badbit); + return false; + } eh->out_sedge() = SEdge_of[index]; } else { in >> index; + if(index < 0 || index >= int(sfn)) + { + in.setstate(std::ios_base::badbit); + return false; + } eh->incident_sface() = SFace_of[index]; } OK = OK && test_string("|"); @@ -1669,6 +1766,11 @@ read_facet(Halffacet_handle fh) { OK = OK && test_string("{"); in >> index; + if(index < 0 || index >= int(fn)) + { + in.setstate(std::ios_base::badbit); + return false; + } fh->twin() = Halffacet_of[index]; OK = OK && test_string(","); @@ -1676,6 +1778,11 @@ read_facet(Halffacet_handle fh) { while(isdigit(cc)) { in.putback(cc); in >> index; + if(index < 0 || index >= int(sen)) + { + in.setstate(std::ios_base::badbit); + return false; + } fh->boundary_entry_objects().push_back(make_object(SEdge_of[index])); in >> cc; } @@ -1684,11 +1791,21 @@ read_facet(Halffacet_handle fh) { while(isdigit(cc)) { in.putback(cc); in >> index; + if(index < 0 || index >= int(sln)) + { + in.setstate(std::ios_base::badbit); + return false; + } fh->boundary_entry_objects().push_back(make_object(SLoop_of[index])); in >> cc; } in >> index; + if(index < 0 || index >= int(cn)) + { + in.setstate(std::ios_base::badbit); + return false; + } fh->incident_volume() = Volume_of[index+addInfiBox]; OK = OK && test_string("|"); #ifdef CGAL_NEF_NATURAL_COORDINATE_INPUT @@ -1731,6 +1848,11 @@ read_volume(Volume_handle ch) { while(isdigit(cc)) { in.putback(cc); in >> index; + if(index < 0 || index >= int(sfn)) + { + in.setstate(std::ios_base::badbit); + return false; + } ch->shell_entry_objects().push_back(make_object(SFace_of[index])); in >> cc; } @@ -1781,27 +1903,67 @@ read_sedge(SHalfedge_handle seh) { OK = OK && test_string("{"); in >> index; + if(index < 0 || index >= int(sen)) + { + in.setstate(std::ios_base::badbit); + return false; + } seh->twin() = SEdge_of[index]; OK = OK && test_string(","); in >> index; + if(index < 0 || index >= int(sen)) + { + in.setstate(std::ios_base::badbit); + return false; + } seh->sprev() = SEdge_of[index]; OK = OK && test_string(","); in >> index; + if(index < 0 || index >= int(sen)) + { + in.setstate(std::ios_base::badbit); + return false; + } seh->snext() = SEdge_of[index]; OK = OK && test_string(","); in >> index; + if(index < 0 || index >= int(en)) + { + in.setstate(std::ios_base::badbit); + return false; + } seh->source() = Edge_of[index]; OK = OK && test_string(","); in >> index; + if(index < 0 || index >= int(sfn)) + { + in.setstate(std::ios_base::badbit); + return false; + } seh->incident_sface() = SFace_of[index]; OK = OK && test_string(","); in >> index; + if(index < 0 || index >= int(sen)) + { + in.setstate(std::ios_base::badbit); + return false; + } seh->prev() = SEdge_of[index]; OK = OK && test_string(","); in >> index; + if(index < 0 || index >= int(sen)) + { + in.setstate(std::ios_base::badbit); + return false; + } seh->next() = SEdge_of[index]; OK = OK && test_string(","); in >> index; + if(index < 0 || index >= int(fn)) + { + in.setstate(std::ios_base::badbit); + return false; + } seh->facet() = Halffacet_of[index]; OK = OK && test_string("|"); #ifdef CGAL_NEF_NATURAL_COORDINATE_INPUT @@ -1852,12 +2014,27 @@ read_sloop(SHalfloop_handle slh) { OK = OK && test_string("{"); in >> index; + if(index < 0 || index >= (int)(sln)) + { + in.setstate(std::ios_base::badbit); + return false; + } slh->twin() = SLoop_of[index]; OK = OK && test_string(","); in >> index; + if(index < 0 || index >= (int)(sfn)) + { + in.setstate(std::ios_base::badbit); + return false; + } slh->incident_sface() = SFace_of[index]; OK = OK && test_string(","); in >> index; + if(index < 0 || index >= (int)(fn)) + { + in.setstate(std::ios_base::badbit); + return false; + } slh->facet() = Halffacet_of[index]; OK = OK && test_string("|"); #ifdef CGAL_NEF_NATURAL_COORDINATE_INPUT @@ -1904,6 +2081,11 @@ read_sface(SFace_handle sfh) { OK = OK && test_string("{"); in >> index; + if(index < 0 || index >= (int)(vn)) + { + in.setstate(std::ios_base::badbit); + return false; + } sfh->center_vertex() = Vertex_of[index]; OK = OK && test_string(","); @@ -1913,6 +2095,11 @@ read_sface(SFace_handle sfh) { in >> index; // sfh->boundary_entry_objects().push_back(SEdge_of[index]); SM_decorator SD(&*sfh->center_vertex()); + if(index < 0 || index >= (int)(sen)) + { + in.setstate(std::ios_base::badbit); + return false; + } SD.link_as_face_cycle(SEdge_of[index],sfh); in >> cc; } @@ -1921,6 +2108,11 @@ read_sface(SFace_handle sfh) { while(isdigit(cc)) { in.putback(cc); in >> index; + if(index < 0 || index >= (int)(en)) + { + in.setstate(std::ios_base::badbit); + return false; + } sfh->boundary_entry_objects().push_back(make_object(Edge_of[index])); this->sncp()->store_sm_boundary_item(Edge_of[index], --(sfh->sface_cycles_end())); in >> cc; @@ -1930,12 +2122,22 @@ read_sface(SFace_handle sfh) { while(isdigit(cc)) { in.putback(cc); in >> index; + if(index < 0 || index >= (int)(sln)) + { + in.setstate(std::ios_base::badbit); + return false; + } sfh->boundary_entry_objects().push_back(make_object(SLoop_of[index])); this->sncp()->store_sm_boundary_item(SLoop_of[index], --(sfh->sface_cycles_end())); in >> cc; } in >> index; + if(index < 0 || index >= (int)(cn)) + { + in.setstate(std::ios_base::badbit); + return false; + } sfh->volume() = Volume_of[index+addInfiBox]; OK = OK && test_string("}"); in >> sfh->mark(); diff --git a/Nef_3/include/CGAL/Nef_3/SNC_simplify.h b/Nef_3/include/CGAL/Nef_3/SNC_simplify.h index f786b3f2b34..23f87181b54 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_simplify.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_simplify.h @@ -191,16 +191,6 @@ class SNC_simplify_base : public SNC_decorator { return (sp1 == sp2.antipode()); } - bool simplify_redundant_box_vertex(Vertex_handle v, bool snc_computed) { - //CGAL_warning("altered code"); - return false; - if(snc_computed) return false; - if(!Infi_box::is_redundant_box_vertex(*v)) return false; - this->sncp()->delete_vertex(v); - simplified = true; - return true; - } - bool simplify_redundant_vertex_in_volume(Vertex_handle v) { if(is_part_of_volume(v)) { // CGAL_NEF_TRACEN("mark("<index(v)<<")="<mark()<<", "<< @@ -295,7 +285,6 @@ class SNC_simplify_base : public SNC_decorator { while( v != (*this->sncp()).vertices_end()) { Vertex_iterator v_next(v); ++v_next; - if(!simplify_redundant_box_vertex(v, snc_computed)) if(!simplify_redundant_vertex_in_volume(v)) if(!simplify_redundant_vertex_on_facet(v)) simplify_redundant_vertex_on_edge(v, snc_computed); diff --git a/Nef_3/include/CGAL/Nef_3/polygon_mesh_to_nef_3.h b/Nef_3/include/CGAL/Nef_3/polygon_mesh_to_nef_3.h index f7d33128ad2..69a1ad95ebf 100644 --- a/Nef_3/include/CGAL/Nef_3/polygon_mesh_to_nef_3.h +++ b/Nef_3/include/CGAL/Nef_3/polygon_mesh_to_nef_3.h @@ -192,16 +192,18 @@ void polygon_mesh_to_nef_3(PolygonMesh& P, SNC_structure& S, FaceIndexMap fimap, typedef Halfedge_around_target_circulator Halfedge_around_vertex_const_circulator; - PMap pmap = get(CGAL::vertex_point,P); std::vector normals(num_faces(P)); + CGAL_assertion_code(std::vector num_edges(num_faces(P));) for(face_descriptor f : faces(P)){ Vertex_around_face_circulator vafc(halfedge(f,P),P), done(vafc); Vector_3 v; normal_vector_newell_3(vafc, done, pmap, v); - normals[get(fimap,f)] = - v; + std::size_t i = get(fimap,f); + normals[i] = -v; + CGAL_assertion_code(num_edges[i] = circulator_size(vafc)); } Face_graph_index_adder::reference npv = get(pmap,pv); Vertex_handle nv = S.new_vertex(); - nv->point() = get(pmap,pv); + nv->point() = npv; nv->mark() = true; - CGAL_NEF_TRACEN("v "<< get(pmap,pv)); + CGAL_NEF_TRACEN("v "<< npv); SM_decorator SM(&*nv); Halfedge_around_vertex_const_circulator pec(pv,P), pec_prev(pec), done(pec); @@ -221,7 +225,7 @@ void polygon_mesh_to_nef_3(PolygonMesh& P, SNC_structure& S, FaceIndexMap fimap, // CGAL_assertion( pe != 0 ); Point_3 pe_target_0(get(pmap,target(opposite(pe,P),P))); - Point_3 sp_point_0(CGAL::ORIGIN+(pe_target_0 - get(pmap,pv))); + Point_3 sp_point_0(CGAL::ORIGIN+(pe_target_0 - npv)); Sphere_point sp_0(sp_point_0); SVertex_handle sv_0 = SM.new_svertex(sp_0); sv_0->mark() = true; @@ -234,11 +238,11 @@ void polygon_mesh_to_nef_3(PolygonMesh& P, SNC_structure& S, FaceIndexMap fimap, bool with_border = false; do { CGAL_assertion(face(pe_prev,P) == face(opposite(pe,P),P)); - CGAL_assertion(get(pmap,target(pe_prev,P)) == get(pmap,pv)); - CGAL_assertion(get(pmap,target(pe,P)) == get(pmap,pv)); + CGAL_assertion(get(pmap,target(pe_prev,P)) == npv); + CGAL_assertion(get(pmap,target(pe,P)) == npv); Point_3 pe_target = get(pmap,target(opposite(pe,P),P)); - Point_3 sp_point = CGAL::ORIGIN+(pe_target - get(pmap,pv)); + Point_3 sp_point = CGAL::ORIGIN+(pe_target - npv); Sphere_point sp(sp_point); SVertex_handle sv = SM.new_svertex(sp); sv->mark() = true; @@ -249,11 +253,13 @@ void polygon_mesh_to_nef_3(PolygonMesh& P, SNC_structure& S, FaceIndexMap fimap, if(is_border(pe_prev,P)) with_border = true; else { - Plane ss_plane( CGAL::ORIGIN, normals[get(fimap,face(pe_prev,P))] ); + std::size_t i = get(fimap,face(pe_prev,P)); + Plane ss_plane( CGAL::ORIGIN, normals[i]); Sphere_circle ss_circle(ss_plane); - - CGAL_assertion(ss_circle.has_on(sp)); - CGAL_assertion(ss_circle.has_on(sv_prev->point())); + CGAL_assertion_code(if(num_edges[i] > 3) { + CGAL_assertion(ss_circle.has_on(sp)); + CGAL_assertion(ss_circle.has_on(sv_prev->point())); + };) SHalfedge_handle e = SM.new_shalfedge_pair(sv_prev, sv); e->circle() = ss_circle; @@ -272,20 +278,22 @@ void polygon_mesh_to_nef_3(PolygonMesh& P, SNC_structure& S, FaceIndexMap fimap, while( pec != done ); CGAL_assertion(face(pe_prev,P) == face(opposite(*pe_0,P),P)); - CGAL_assertion(get(pmap,target(pe_prev,P)) == get(pmap,pv)); - CGAL_assertion(get(pmap,target(*pe_0,P)) == get(pmap,pv)); + CGAL_assertion(get(pmap,target(pe_prev,P)) == npv); + CGAL_assertion(get(pmap,target(*pe_0,P)) == npv); SHalfedge_handle e; if(is_border(pe_prev,P)) { with_border = true; e = sv_prev->out_sedge(); } else { - Plane ss_plane( CGAL::ORIGIN, normals[get(fimap,face(pe_prev,P))] ); + std::size_t i = get(fimap,face(pe_prev,P)); + Plane ss_plane( CGAL::ORIGIN, normals[i]); Sphere_circle ss_circle(ss_plane); - CGAL_assertion(ss_plane.has_on(sv_prev->point())); - CGAL_assertion(ss_circle.has_on(sp_0)); - CGAL_assertion(ss_circle.has_on(sv_prev->point())); + CGAL_assertion_code(if(num_edges[i] > 3) { + CGAL_assertion(ss_circle.has_on(sp_0)); + CGAL_assertion(ss_circle.has_on(sv_prev->point())); + };) e = SM.new_shalfedge_pair(sv_prev, sv_0); e->circle() = ss_circle; diff --git a/Nef_3/include/CGAL/Nef_polyhedron_3.h b/Nef_3/include/CGAL/Nef_polyhedron_3.h index 3eb723d37b7..525bc7d1d0a 100644 --- a/Nef_3/include/CGAL/Nef_polyhedron_3.h +++ b/Nef_3/include/CGAL/Nef_polyhedron_3.h @@ -349,6 +349,12 @@ protected: es.build_external_structure(); } + private: + void mark_bounded_volumes() { + CGAL::Mark_bounded_volumes mbv(true); + delegate(mbv, /*compute_external*/ false, /*simplify*/ false); + } + public: /*{\Mcreation 3}*/ @@ -602,9 +608,8 @@ protected: polyhedron_3_to_nef_3 , SNC_structure>( P, snc()); build_external_structure(); + mark_bounded_volumes(); simplify(); - CGAL::Mark_bounded_volumes mbv(true); - delegate(mbv); set_snc(snc()); } @@ -616,9 +621,8 @@ protected: initialize_infibox_vertices(EMPTY); polygon_mesh_to_nef_3(const_cast(pm), snc()); build_external_structure(); + mark_bounded_volumes(); simplify(); - CGAL::Mark_bounded_volumes mbv(true); - delegate(mbv); set_snc(snc()); } @@ -637,9 +641,8 @@ protected: initialize_infibox_vertices(EMPTY); polygon_mesh_to_nef_3(const_cast(pm), snc(), fim, him); build_external_structure(); + mark_bounded_volumes(); simplify(); - CGAL::Mark_bounded_volumes mbv(true); - delegate(mbv); set_snc(snc()); } @@ -651,9 +654,8 @@ protected: initialize_infibox_vertices(EMPTY); shell_to_nef_3(N, sf, snc()); build_external_structure(); + mark_bounded_volumes(); simplify(); - CGAL::Mark_bounded_volumes mbv(true); - delegate(mbv); set_snc(snc()); } diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index da8e01bacc8..bcdb6c61ae3 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -18,6 +18,7 @@ #ifdef CGAL_USE_BASIC_VIEWER +#include #include #include #include @@ -253,6 +254,7 @@ void draw(const CGAL_NEF3_TYPE &anef, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc = 1; const char *argv[2] = {"nef_polyhedron_viewer", "\0"}; QApplication app(argc, const_cast(argv)); diff --git a/Nef_3/include/CGAL/normal_vector_newell_3.h b/Nef_3/include/CGAL/normal_vector_newell_3.h index 282f8e5b5cb..80874a1efa1 100644 --- a/Nef_3/include/CGAL/normal_vector_newell_3.h +++ b/Nef_3/include/CGAL/normal_vector_newell_3.h @@ -23,6 +23,8 @@ #undef CGAL_NEF_DEBUG #define CGAL_NEF_DEBUG 79 #include +#include +#include namespace CGAL { @@ -30,32 +32,72 @@ namespace internal_nef { template CGAL_MEDIUM_INLINE -void newell_single_step_3( const Handle& p, const Handle& q, Vector& n ) +void newell_single_step_3( const Handle& p, const Handle& q, Vector& n, const Homogeneous_tag&) { + typedef typename Kernel_traits::Kernel::RT RT; + const RT& phw = p.hw(); + const RT& qhw = q.hw(); + const RT& nhw = n.hw(); + const RT& sq = square(phw) * square(qhw); + const RT& phyqhw = p.hy() * qhw; + const RT& qhyphw = q.hy() * phw; + const RT& phxqhw = p.hx() * qhw; + const RT& qhxphw = q.hx() * phw; + const RT& phzqhw = p.hz() * qhw; + const RT& qhzphw = q.hz() * phw; + n = Vector( n.hx() - * p.hw() * p.hw() - * q.hw() * q.hw() - + n.hw() - * ( p.hy() * q.hw() - q.hy() * p.hw()) - * ( p.hz() * q.hw() + q.hz() * p.hw()), + * sq + + nhw + * ( phyqhw - qhyphw ) + * ( phzqhw + qhzphw ), n.hy() - * p.hw() * p.hw() - * q.hw() * q.hw() - + n.hw() - * ( p.hz() * q.hw() - q.hz() * p.hw()) - * ( p.hx() * q.hw() + q.hx() * p.hw()), + * sq + + nhw + * ( phzqhw - qhzphw ) + * ( phxqhw + qhxphw ), n.hz() - * p.hw() * p.hw() - * q.hw() * q.hw() - + n.hw() - * ( p.hx() * q.hw() - q.hx() * p.hw()) - * ( p.hy() * q.hw() + q.hy() * p.hw()), + * sq + + nhw + * ( phxqhw - qhxphw ) + * ( phyqhw + qhyphw ), n.hw() - * p.hw() * p.hw() - * q.hw() * q.hw() + * sq ); } + +template +CGAL_MEDIUM_INLINE +void newell_single_step_3( const Handle& p, const Handle& q, Vector& n, const Cartesian_tag&) +{ + typedef typename Kernel_traits::Kernel::FT FT; + const FT& py = p.y(); + const FT& qy = q.y(); + const FT& px = p.x(); + const FT& qx = q.x(); + const FT& pz = p.z(); + const FT& qz = q.z(); + + n = Vector( + n.x() + + ( py - qy ) + * ( pz + qz ), + n.y() + + ( pz - qz ) + * ( px + qx ), + n.z() + + ( px - qx ) + * ( py + qy ) + ); +} + +template +bool is_triangle_3( const IC& first ) +{ + return std::next(first,3) == first; +} + } template @@ -70,6 +112,14 @@ void normal_vector_newell_3( IC first, IC last, Vector& n ) // three. { CGAL_assertion( !CGAL::is_empty_range( first, last)); + + if(internal_nef::is_triangle_3(first)) { + n = orthogonal_vector(*first,*(std::next(first)),*(std::next(first,2))); + return; + } + + + typedef typename Kernel_traits::Kernel R; // Compute facet normals via the Newell-method as described in // Filippo Tampieri: Newell's Method for Computing the Plane // Equation of a Polygon. Graphics Gems III, David Kirk, @@ -80,11 +130,11 @@ void normal_vector_newell_3( IC first, IC last, Vector& n ) IC prev = first; ++first; while( first != last) { - internal_nef::newell_single_step_3( *prev, *first, n); + internal_nef::newell_single_step_3( *prev, *first, n, typename R::Kernel_tag()); prev = first; ++first; } - internal_nef::newell_single_step_3( *prev, *start_point, n); + internal_nef::newell_single_step_3( *prev, *start_point, n, typename R::Kernel_tag()); CGAL_NEF_TRACEN("newell normal vector "< void normal_vector_newell_3( IC first, IC last, VertexPointMap vpm, Vector& n ) { CGAL_assertion( !CGAL::is_empty_range( first, last)); + + if(internal_nef::is_triangle_3(first)) { + + n = orthogonal_vector(get(vpm,*first),get(vpm,*(std::next(first))),get(vpm,*(std::next(first,2)))); + return; + } + + + typedef typename Kernel_traits::Kernel R; // Compute facet normals via the Newell-method as described in // Filippo Tampieri: Newell's Method for Computing the Plane // Equation of a Polygon. Graphics Gems III, David Kirk, @@ -102,11 +161,11 @@ void normal_vector_newell_3( IC first, IC last, VertexPointMap vpm, Vector& n ) IC prev = first; ++first; while( first != last) { - internal_nef::newell_single_step_3( get(vpm,*prev), get(vpm,*first), n); + internal_nef::newell_single_step_3( get(vpm,*prev), get(vpm,*first), n, typename R::Kernel_tag()); prev = first; ++first; } - internal_nef::newell_single_step_3( get(vpm,*prev), get(vpm,*start_point), n); + internal_nef::newell_single_step_3( get(vpm,*prev), get(vpm,*start_point), n, typename R::Kernel_tag()); CGAL_NEF_TRACEN("newell normal vector "<::read_vertex(SVertex_handle v) !(in >> p) || !check_sep("}") ) return false; - if (iso) set_face(v,SFace_of[f]); - else set_first_out_edge(v,Edge_of[f]); + if(f<0 || (iso && f > fn) || (!iso && f > en)) + { + in.setstate(std::ios_base::badbit); + return false; + } + + if (iso) this->set_face(v,SFace_of[f]); + else this->set_first_out_edge(v,Edge_of[f]); v->mark() = m; v->point() = p; return true; } @@ -235,17 +241,21 @@ bool SM_io_parser::read_edge(SHalfedge_handle e) !(in >> m) || !check_sep(",") || !(in >> k) || !check_sep("}") ) return false; - CGAL_assertion_msg + if (! (eo >= 0 && eo < en && epr >= 0 && epr < en && ene >= 0 && ene < en && - v >= 0 && v < vn && f >= 0 && f < fn , - "wrong index in read_edge"); + v >= 0 && v < vn && f >= 0 && f < fn )) + { + std::cerr<<"wrong index in read_edge"<twin()]); - set_prev(e,Edge_of[epr]); - set_next(e,Edge_of[ene]); - set_source(e,SVertex_of[v]); - set_face(e,SFace_of[f]); + this->set_prev(e,Edge_of[epr]); + this->set_next(e,Edge_of[ene]); + this->set_source(e,SVertex_of[v]); + this->set_face(e,SFace_of[f]); e->mark() = m; e->circle() = k; return true; @@ -274,7 +284,7 @@ bool SM_io_parser::read_loop(SHalfloop_handle l) CGAL_assertion_msg( (lo >= 0 && lo < 2 && f >= 0 && f < fn),"wrong index in read_edge"); - set_face(l,SFace_of[f]); + this->set_face(l,SFace_of[f]); l->mark() = m; l->circle() = k; return true; @@ -303,21 +313,33 @@ bool SM_io_parser::read_face(SFace_handle f) int n, ei, vi, li; Mark m; if ( !(in >> n) || !check_sep("{") ) return false; while (in >> ei) { - CGAL_assertion_msg(ei >= 0 && ei < en, - "wrong index in face cycle list."); - store_sm_boundary_object(Edge_of[ei],f); + if(!(ei >= 0 && ei < en)) + { + std::cerr<<"wrong index in face cycle list."<store_sm_boundary_object(Edge_of[ei],f); } in.clear(); if (!check_sep(",")) { return false; } while (in >> vi) { - CGAL_assertion_msg(vi >= 0 && vi < vn, - "wrong index in iso vertex list."); - store_sm_boundary_object(SVertex_of[vi],f); + if(!(vi >= 0 && vi < vn)) + { + std::cerr<<"wrong index in iso vertex list."<store_sm_boundary_object(SVertex_of[vi],f); } in.clear(); if (!check_sep(",")) { return false; } while (in >> li) { - CGAL_assertion_msg(li >= 0 && li < 2, - "wrong index in iso vertex list."); - store_sm_boundary_object(Loop_of[li],f); + if(!(li >= 0 && li < 2)) + { + std::cerr<<"wrong index in iso vertex list."<store_sm_boundary_object(Loop_of[li],f); } in.clear(); if (!check_sep(",") || !(in >> m) || !check_sep("}") ) return false; @@ -357,16 +379,36 @@ void SM_io_parser::print() const template void SM_io_parser::read() { + if ( !check_sep("Nef_polyhedron_S2") ) + { + CGAL_warning_msg(false, "Missing line in header"); + return; + } if ( !check_sep("Sphere_map_2") ) - CGAL_error_msg("SM_io_parser::read: no embedded_PM header."); + { + CGAL_warning_msg(false, "SM_io_parser::read: no embedded_PM header."); + return; + } if ( !(check_sep("vertices") && (in >> vn)) ) - CGAL_error_msg("SM_io_parser::read: wrong vertex line."); + { + CGAL_warning_msg(false, "SM_io_parser::read: wrong vertex line."); + return; + } if ( !(check_sep("edges") && (in >> en) && (en%2==0)) ) - CGAL_error_msg("SM_io_parser::read: wrong edge line."); + { + CGAL_warning_msg(false, "SM_io_parser::read: wrong edge line."); + return; + } if ( !(check_sep("loops") && (in >> ln)) ) - CGAL_error_msg("SM_io_parser::read: wrong loop line."); + { + CGAL_warning_msg(false, "SM_io_parser::read: wrong loop line."); + return; + } if ( !(check_sep("faces") && (in >> fn)) ) - CGAL_error_msg("SM_io_parser::read: wrong face line."); + { + CGAL_warning_msg(false, "SM_io_parser::read: wrong face line."); + return; + } SVertex_of.resize(vn); Edge_of.resize(en); @@ -383,18 +425,28 @@ void SM_io_parser::read() for(i=0; i& p1, const Sphere_point& p2, int axis, int pos) { - Sphere_point pS, pN; - CGAL_assertion(axis>=0 && axis<=2); - switch(axis) { - case 0: - pS=Sphere_point(0,-1,0); - // pN=Sphere_point(0,1,0); - break; - case 1: - pS=Sphere_point(0,0,1); - // pN=Sphere_point(0,0,-1); - break; - case 2: - pS=Sphere_point(0,-1,0); - // pN=Sphere_point(0,1,0); - break; - } typename R::Direction_3 d1(p1-CGAL::ORIGIN), d2(p2-CGAL::ORIGIN); if (d1 == d2) return 0; + + CGAL_assertion(axis>=0 && axis<=2); if(is_south(p1,axis) || is_north(p2,axis)) return -1; if(is_south(p2,axis) || is_north(p1,axis)) return 1; - // if (d1 == dS || d2 == dN) return -1; - // if (d1 == dN || d2 == dS) return 1; + // now no more special cases if (axis==0 && (p1.hx()==static_cast(0) && p2.hx()==static_cast(0))) { @@ -133,7 +118,11 @@ int spherical_compare(const Sphere_point& p1, // now s1 == s2 return s1 * CGAL::spherical_orientation(p1,Sphere_point(0,0,1),p2); } - int sor = CGAL::spherical_orientation(pS,p1,p2); + int sor; + if(axis==1) + sor = CGAL::spherical_orientation(Sphere_point(0, 0, 1),p1,p2); + else + sor = CGAL::spherical_orientation(Sphere_point(0,-1, 0),p1,p2); if ( sor ) return sor; if(axis==0) return CGAL::spherical_orientation(Sphere_point(0,0,pos),p2,p1); @@ -208,98 +197,6 @@ $h^{0+}$ then we return a trivial segment. */ -/* -template -int Sphere_segment:: -intersection(const CGAL::Sphere_circle& c, std::vector >& s) const { - - CGAL_NEF_TRACEN(" intersection "<<*this<<" "< i1 = CGAL::intersection(ptr()->c_,c); - if ( !has_on(i1) ) - i1 = i1.antipode(); - s.push_back(Sphere_segment(source(),i1,sphere_circle())); - s.push_back(Sphere_segment(i1,target(),sphere_circle())); - return 2; - } - else if ( or1 == CGAL::ON_ORIENTED_BOUNDARY && - or2 == CGAL::ON_ORIENTED_BOUNDARY ) { - // if both ends of $s$ are part of $h$ then $s$ is a halfcircle or - // $s$ is fully part of $h$. In this case we have to check if the - // halfcircle is not part of $h^-$. This can be formulated by an - // orientation test of the point $p$ at the tip of the normal of - // |s.sphere_circle()| with respect to the plane through the - // endpoints of $s$ and the tip of the normal of $h$. - CGAL_NEF_TRACEN(" both in plane"); - s.push_back(*this); - return 1; - } - else if ( or1 != CGAL::ON_NEGATIVE_SIDE && - or2 != CGAL::ON_NEGATIVE_SIDE ) { - // this case covers the endpoints of $s$ as part of the closed - // oriented halfspace $h^{0+}$. At least one is part of - // $h^{+}$. If $s$ is not long then the segment must be fully part - // of $h^{0+}$. Otherwise if $s$ is long, then we at both ends - // there are subsegments as part of $h^{0+}$ (one might be - // degenerate). - if ( is_long() ) { - Sphere_point i1 = CGAL::intersection(ptr()->c_,c); - Sphere_point i2 = i1.antipode(); - Sphere_segment so(i1,i2,sphere_circle()); - if ( so.has_on(source()) && so.has_on(target()) ) - std::swap(i1,i2); - // now source(),i1,i2,target() are circularly ordered - s.push_back(Sphere_segment(source(),i1,sphere_circle())); - s.push_back(Sphere_segment(i1,i2,sphere_circle())); - s.push_back(Sphere_segment(i2,target(),sphere_circle())); - // CGAL_NEF_TRACEN(" both >= plane, long "<= plane, short "); - s.push_back(*this); - return 1; - } - else if ( or1 != CGAL::ON_POSITIVE_SIDE && - or2 != CGAL::ON_POSITIVE_SIDE ) { - // either both endpoints of $s$ are in $h^-$ or one is in $h^-$ - // and one on $h^0$. - if ( is_long() ) { - Sphere_point i1 = CGAL::intersection(ptr()->c_,c); - Sphere_point i2 = i1.antipode(); - Sphere_segment so(i1,i2,sphere_circle()); - // CGAL_NEF_TRACEN(" both <= plane, long"< int Sphere_segment:: intersection(const CGAL::Sphere_circle& c, 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 180101e7867..b5de315b902 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_LA_base.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_LA_base.h @@ -34,16 +34,18 @@ namespace CGAL { template < typename FT_, typename Dim_, -#if 1 +#ifndef CGAL_NEWKERNEL_D_USE_EIGEN_VECTOR +# if 1 typename Vec_=Mix_vector, Vector_vector, FT_, Dim_>, -#elif 0 +# elif 0 typename Vec_=Array_vector, -#elif 0 +# else typename Vec_=Vector_vector, +# endif #else - // Dangerous because of alignment. Ok on x86_64 without AVX. + // Dangerous before C++17 because of alignment. Ok on x86_64 without AVX. typename Vec_=LA_eigen, #endif typename LA_=LA_eigen > diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_LA_functors.h b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_LA_functors.h index b717a80bac4..9523d816fbb 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_LA_functors.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_LA_functors.h @@ -50,7 +50,7 @@ template struct Construct_LA_vector // Makes no sense for an unknown dimension. return typename Constructor::Dimension()(this->kernel().dimension()); } - result_type operator()(result_type const& v)const{ + result_type const& operator()(result_type const& v)const{ return v; } result_type operator()(result_type&& v)const{ @@ -137,7 +137,7 @@ template struct Compute_cartesian_coordinate { typedef typename Get_type::type RT; typedef typename R::Vector_ first_argument_type; typedef int second_argument_type; - typedef Tag_true Is_exact; + typedef Tag_true Uses_no_arithmetic; typedef decltype(std::declval()[0]) result_type; template @@ -153,7 +153,7 @@ template struct Construct_cartesian_const_iterator { typedef typename R::LA_vector S_; typedef typename R::Point_cartesian_const_iterator result_type; // same as Vector - typedef Tag_true Is_exact; + typedef Tag_true Uses_no_arithmetic; result_type operator()(argument_type const& v,Begin_tag)const{ return S_::vector_begin(v); @@ -282,7 +282,7 @@ template struct PV_dimension { typedef typename R::Vector_ argument_type; typedef int result_type; typedef typename R::LA_vector LA; - typedef Tag_true Is_exact; + typedef Tag_true Uses_no_arithmetic; template result_type operator()(T const& v) const { 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 ed164e844da..c02efa6dcc6 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_filter_K.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_filter_K.h @@ -42,7 +42,7 @@ template<> struct Functors_without_division > { }; // FIXME: -// - Is_exact (which should be renamed to Uses_no_arithmetic) predicates should not be filtered +// - Uses_no_arithmetic predicates should not be filtered // - Functors_without_division should be defined near/in the actual functors template < typename Base_, typename AK_, typename EK_, typename Pred_list = typeset_all > @@ -78,18 +78,24 @@ struct Cartesian_filter_K : public Base_ // TODO: only fix some types, based on some criterion? template struct Type : Get_type {}; - template::type, bool=Pred_list::template contains::value> struct Functor : - Inherit_functor {}; - template struct Functor { + template::type>::value> struct Pred_helper { typedef typename Get_functor::type AP; typedef typename Get_functor::type EP; typedef Filtered_predicate2 type; }; + // Less_cartesian_coordinate doesn't usually need filtering + // This fixes the predicate, as opposed to Inherit_functor which would leave it open (is that good?) + template struct Pred_helper : + Get_functor {}; + + template::type, bool=Pred_list::template contains::value> struct Functor : + Inherit_functor {}; + template struct Functor : + Pred_helper {}; + // TODO: // template struct Functor : // Kernel_base::template Functor {}; -// TODO: -// detect when Less_cartesian_coordinate doesn't need filtering }; } //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 507e4144694..24b35fb4969 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_static_filters.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_static_filters.h @@ -15,37 +15,46 @@ #include #include // bug, should be included by the next one #include +#include #include namespace CGAL { namespace SFA { // static filter adapter // Note that this would be quite a bit simpler without stateful kernels +template struct Adapter_2 { + typedef typename Get_type::type Point; + typedef typename Get_functor::type CC; + typedef typename Get_functor::type Orientation_base; + typedef typename Get_functor::type Side_of_oriented_circle_base; + struct Point_2 { + R_ const&r; CC const&c; Point const& p; + Point_2(R_ const&r_, CC const&c_, Point const&p_):r(r_),c(c_),p(p_){} + decltype(auto) x()const{return c(p,0);} + decltype(auto) y()const{return c(p,1);} + }; + struct Vector_2 {}; + struct Circle_2 {}; + struct Orientation_2 { + typedef typename Get_type::type result_type; + auto operator()(Point_2 const&A, Point_2 const&B, Point_2 const&C)const{ + Point const* t[3]={&A.p,&B.p,&C.p}; + return Orientation_base(A.r)(make_transforming_iterator(t+0),make_transforming_iterator(t+3)); + } + }; + struct Side_of_oriented_circle_2 { + typedef typename Get_type::type result_type; + auto operator()(Point_2 const&A, Point_2 const&B, Point_2 const&C, Point_2 const&D)const{ + Point const* t[3]={&A.p,&B.p,&C.p}; + return Side_of_oriented_circle_base(A.r)(make_transforming_iterator(t+0),make_transforming_iterator(t+3),D.p); + } + }; +}; template struct Orientation_of_points_2 : private Store_kernel { CGAL_FUNCTOR_INIT_STORE(Orientation_of_points_2) typedef typename Get_type::type Point; typedef typename Get_type::type result_type; - typedef typename Get_type::type FT; typedef typename Get_functor::type CC; - typedef typename Get_functor::type Orientation_base; - // TODO: Move this out for easy reuse - struct Adapter { - struct Point_2 { - R_ const&r; CC const&c; Point const& p; - Point_2(R_ const&r_, CC const&c_, Point const&p_):r(r_),c(c_),p(p_){} - // use result_of instead? - typename CC::result_type x()const{return c(p,0);} - typename CC::result_type y()const{return c(p,1);} - }; - struct Vector_2 {}; - struct Circle_2 {}; - struct Orientation_2 { - typedef typename Orientation_of_points_2::result_type result_type; - result_type operator()(Point_2 const&A, Point_2 const&B, Point_2 const&C)const{ - Point const* t[3]={&A.p,&B.p,&C.p}; - return Orientation_base(A.r)(make_transforming_iterator(t+0),make_transforming_iterator(t+3)); - } - }; - }; + typedef Adapter_2 Adapter; template result_type operator()(Iter f, Iter CGAL_assertion_code(e))const{ CC c(this->kernel()); Point const& A=*f; @@ -56,6 +65,22 @@ template struct Orientation_of_points_2 : private Store_k return typename internal::Static_filters_predicates::Orientation_2()(P(this->kernel(),c,A),P(this->kernel(),c,B),P(this->kernel(),c,C)); } }; +template struct Side_of_oriented_sphere_2 : private Store_kernel { + CGAL_FUNCTOR_INIT_STORE(Side_of_oriented_sphere_2) + typedef typename Get_type::type Point; + typedef typename Get_type::type result_type; + typedef typename Get_functor::type CC; + typedef Adapter_2 Adapter; + template result_type operator()(Iter f, Iter CGAL_assertion_code(e), Point const& D)const{ + CC c(this->kernel()); + Point const& A=*f; + Point const& B=*++f; + Point const& C=*++f; + CGAL_assertion(++f==e); + typedef typename Adapter::Point_2 P; + return typename internal::Static_filters_predicates::Side_of_oriented_circle_2()(P(this->kernel(),c,A),P(this->kernel(),c,B),P(this->kernel(),c,C),P(this->kernel(),c,D)); + } +}; } template @@ -80,6 +105,9 @@ struct Cartesian_static_filters, R_, Derived_> : public R_ { // >::type type; }; + template struct Functor { + typedef SFA::Side_of_oriented_sphere_2 type; + }; }; } diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Filtered_predicate2.h b/NewKernel_d/include/CGAL/NewKernel_d/Filtered_predicate2.h index c3d2281ad96..2064af0b986 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Filtered_predicate2.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Filtered_predicate2.h @@ -39,6 +39,11 @@ namespace CGAL { // not, or we let all this up to the compiler optimizer to figure out ? // - Some caching could be done at the Point_2 level. +// Protection has a different meaning than in Filtered_predicate, it says +// whether we need to set the rounding mode: some predicates only do +// comparisons and don't need it. Probably this should be done inside this +// class, based on Uses_no_arithmetic, but I have some doubts about C2A, +// converting a long long to Interval_nt requires protection. template class Filtered_predicate2 @@ -87,7 +92,6 @@ public: catch (Uncertain_conversion_exception&) {} } CGAL_BRANCH_PROFILER_BRANCH(tmp); - Protect_FPU_rounding p(CGAL_FE_TONEAREST); return ep(c2e(std::forward(args))...); } }; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Kernel_2_interface.h b/NewKernel_d/include/CGAL/NewKernel_d/Kernel_2_interface.h index d1515d152fc..3d6d588b142 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Kernel_2_interface.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Kernel_2_interface.h @@ -79,10 +79,11 @@ template struct Kernel_2_interface : public Base_ { Side_of_oriented_circle_2(Kernel const&k):sos(k){} result_type operator()(Point_2 const&a, Point_2 const&b, Point_2 const&c, Point_2 const&d) { //return sos(a,b,c,d); - Point_2 const* t[4]={&a,&b,&c,&d}; - return sos(make_transforming_iterator(t+0),make_transforming_iterator(t+4)); + Point_2 const* t[4]={&a,&b,&c}; + return sos(make_transforming_iterator(t+0),make_transforming_iterator(t+3), d); } }; + typedef typename Get_functor >::type Construct_point_2; Less_x_2 less_x_2_object()const{ return Less_x_2(*this); } Less_y_2 less_y_2_object()const{ return Less_y_2(*this); } Compare_x_2 compare_x_2_object()const{ return Compare_x_2(*this); } @@ -90,6 +91,7 @@ template struct Kernel_2_interface : public Base_ { Compare_distance_2 compare_distance_2_object()const{ return Compare_distance_2(*this); } Orientation_2 orientation_2_object()const{ return Orientation_2(*this); } Side_of_oriented_circle_2 side_of_oriented_circle_2_object()const{ return Side_of_oriented_circle_2(*this); } + Construct_point_2 construct_point_2_object()const{ return Construct_point_2(*this); } }; } diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Kernel_3_interface.h b/NewKernel_d/include/CGAL/NewKernel_d/Kernel_3_interface.h index 6c85a4161b9..de0258ea492 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Kernel_3_interface.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Kernel_3_interface.h @@ -76,10 +76,11 @@ template struct Kernel_3_interface : public Base_ { Side_of_oriented_sphere_3(Kernel const&k):sos(k){} result_type operator()(Point_3 const&a, Point_3 const&b, Point_3 const&c, Point_3 const&d, Point_3 const&e) { //return sos(a,b,c,d); - Point_3 const* t[5]={&a,&b,&c,&d,&e}; - return sos(make_transforming_iterator(t+0),make_transforming_iterator(t+5)); + Point_3 const* t[5]={&a,&b,&c,&d}; + return sos(make_transforming_iterator(t+0),make_transforming_iterator(t+4),e); } }; + typedef typename Get_functor >::type Construct_point_3; // I don't have the Coplanar predicates (yet) @@ -88,6 +89,7 @@ template struct Kernel_3_interface : public Base_ { Compare_distance_3 compare_distance_3_object()const{ return Compare_distance_3(*this); } Orientation_3 orientation_3_object()const{ return Orientation_3(*this); } Side_of_oriented_sphere_3 side_of_oriented_sphere_3_object()const{ return Side_of_oriented_sphere_3(*this); } + Construct_point_3 construct_point_3_object()const{ return Construct_point_3(*this); } }; } diff --git a/NewKernel_d/include/CGAL/NewKernel_d/LA_eigen/constructors.h b/NewKernel_d/include/CGAL/NewKernel_d/LA_eigen/constructors.h index 9fb8ef02107..1bb4b2a33ef 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/LA_eigen/constructors.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/LA_eigen/constructors.h @@ -91,11 +91,9 @@ namespace CGAL { }; struct Initializer_list { - // Fix T==NT? - template - result_type operator()(std::initializer_list l) const { - return Iterator()(l.size(),l.begin(),l.end()); - } + result_type operator()(std::initializer_list l) const { + return Iterator()(l.size(),l.begin(),l.end()); + } }; struct Values { diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h b/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h index 56ecd5df953..2045f8c87c3 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include namespace CGAL { @@ -294,7 +294,9 @@ struct Lazy_cartesian : template struct Functor { typedef typename Get_functor::type FA; typedef typename Get_functor::type FE; - typedef Filtered_predicate2 type; + // Careful if operator< for Interval_nt ever starts using arithmetic... + // Not done directly in Filtered_predicate2 because of C2A + typedef Filtered_predicate2::value> type; }; template struct Functor { typedef Lazy_construction2 type; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Types/Hyperplane.h b/NewKernel_d/include/CGAL/NewKernel_d/Types/Hyperplane.h index c3c1de8adb9..7cf4f2189ed 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Types/Hyperplane.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Types/Hyperplane.h @@ -127,7 +127,7 @@ template struct Hyperplane_translation { CGAL_FUNCTOR_INIT_IGNORE(Hyperplane_translation) typedef typename Get_type::type Hyperplane; typedef typename Get_type::type result_type; - // TODO: Is_exact? + // TODO: Uses_no_arithmetic? result_type operator()(Hyperplane const&s)const{ return s.translation(); } diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Types/Sphere.h b/NewKernel_d/include/CGAL/NewKernel_d/Types/Sphere.h index 92a5aa65c0b..19d601c6b6d 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Types/Sphere.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Types/Sphere.h @@ -83,7 +83,7 @@ template struct Squared_radius { CGAL_FUNCTOR_INIT_IGNORE(Squared_radius) typedef typename Get_type::type Sphere; typedef typename Get_type::type const& result_type; - // TODO: Is_exact? + // TODO: Uses_no_arithmetic? result_type operator()(Sphere const&s)const{ return s.squared_radius(); } diff --git a/NewKernel_d/include/CGAL/NewKernel_d/function_objects_cartesian.h b/NewKernel_d/include/CGAL/NewKernel_d/function_objects_cartesian.h index 3ab117131dc..605db974423 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/function_objects_cartesian.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/function_objects_cartesian.h @@ -1108,7 +1108,7 @@ template struct Less_point_cartesian_coordinate : private Store_kernel typedef typename Get_functor::type Cc; // TODO: This is_exact thing should be reengineered. // the goal is to have a way to tell: don't filter this - typedef typename CGAL::Is_exact Is_exact; + typedef typename CGAL::Uses_no_arithmetic Uses_no_arithmetic; template result_type operator()(V const&a, W const&b, I i)const{ @@ -1128,7 +1128,7 @@ template struct Compare_point_cartesian_coordinate : private Store_ker typedef typename Get_functor::type Cc; // TODO: This is_exact thing should be reengineered. // the goal is to have a way to tell: don't filter this - typedef typename CGAL::Is_exact Is_exact; + typedef typename CGAL::Uses_no_arithmetic Uses_no_arithmetic; template result_type operator()(V const&a, W const&b, I i)const{ @@ -1148,7 +1148,7 @@ template struct Compare_lexicographically : private Store_kernel { typedef typename Get_functor >::type CI; // TODO: This is_exact thing should be reengineered. // the goal is to have a way to tell: don't filter this - typedef typename CGAL::Is_exact Is_exact; + typedef typename CGAL::Uses_no_arithmetic Uses_no_arithmetic; template result_type operator()(V const&a, W const&b)const{ @@ -1176,7 +1176,7 @@ template struct Less_lexicographically : private Store_kernel { typedef R_ R; typedef typename Get_type::type result_type; typedef typename Get_functor::type CL; - typedef typename CGAL::Is_exact Is_exact; + typedef typename CGAL::Uses_no_arithmetic Uses_no_arithmetic; template result_type operator() (V const&a, W const&b) const { @@ -1194,7 +1194,7 @@ template struct Less_or_equal_lexicographically : private Store_kernel typedef R_ R; typedef typename Get_type::type result_type; typedef typename Get_functor::type CL; - typedef typename CGAL::Is_exact Is_exact; + typedef typename CGAL::Uses_no_arithmetic Uses_no_arithmetic; template result_type operator() (V const&a, W const&b) const { @@ -1214,7 +1214,7 @@ template struct Equal_points : private Store_kernel { typedef typename Get_functor >::type CI; // TODO: This is_exact thing should be reengineered. // the goal is to have a way to tell: don't filter this - typedef typename CGAL::Is_exact Is_exact; + typedef typename CGAL::Uses_no_arithmetic Uses_no_arithmetic; template result_type operator()(V const&a, W const&b)const{ diff --git a/NewKernel_d/include/CGAL/NewKernel_d/functor_properties.h b/NewKernel_d/include/CGAL/NewKernel_d/functor_properties.h index eb2f767c7a2..f8608d9fd4d 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/functor_properties.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/functor_properties.h @@ -24,7 +24,7 @@ namespace CGAL { template \ struct Is_pretty : T::Is_pretty {} -CGAL_STRAWBERRY(Is_exact); +CGAL_STRAWBERRY(Uses_no_arithmetic); CGAL_STRAWBERRY(Is_fast); CGAL_STRAWBERRY(Is_stored); #undef CGAL_STRAWBERRY diff --git a/NewKernel_d/test/NewKernel_d/CMakeLists.txt b/NewKernel_d/test/NewKernel_d/CMakeLists.txt index fc1b4ecd97e..931c38db9a0 100644 --- a/NewKernel_d/test/NewKernel_d/CMakeLists.txt +++ b/NewKernel_d/test/NewKernel_d/CMakeLists.txt @@ -16,15 +16,22 @@ endif() find_package(CGAL REQUIRED) find_package(Eigen3) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) - create_single_source_cgal_program("Epick_d.cpp") - target_link_libraries(Epick_d PUBLIC CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) + file( + GLOB cppfiles + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + foreach(cppfile ${cppfiles}) + get_filename_component(target ${cppfile} NAME_WE) + create_single_source_cgal_program("${cppfile}") + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + endforeach() else() message( STATUS - "NOTICE: This program requires the Eigen3 library, and will not be compiled." + "NOTICE: These programs require the Eigen3 library, and will not be compiled." ) endif() diff --git a/NewKernel_d/test/NewKernel_d/Epick_d_eigen.cpp b/NewKernel_d/test/NewKernel_d/Epick_d_eigen.cpp new file mode 100644 index 00000000000..ad71d0ba46b --- /dev/null +++ b/NewKernel_d/test/NewKernel_d/Epick_d_eigen.cpp @@ -0,0 +1,6 @@ +#if __cpp_aligned_new >= 201606L +# define CGAL_NEWKERNEL_D_USE_EIGEN_VECTOR 1 +# include "Epick_d.cpp" +#else +int main(){} +#endif diff --git a/NewKernel_d/test/NewKernel_d/tri2.cpp b/NewKernel_d/test/NewKernel_d/tri2.cpp new file mode 100644 index 00000000000..eab4e5d2d62 --- /dev/null +++ b/NewKernel_d/test/NewKernel_d/tri2.cpp @@ -0,0 +1,77 @@ +// Benchmark on the construction of Delaunay 2D with Epick (Kernel_23) vs +// something based on NewKernel_d that uses Eigen::Vector2d as Point_2. +#if __cpp_aligned_new >= 201606L +#if 1 +#define CGAL_NEWKERNEL_D_USE_EIGEN_VECTOR 1 +#include +#include +#include + +namespace CGAL { +struct Epick_2_help1 +: Cartesian_filter_K< + Cartesian_base_d>, + Cartesian_base_d>, + Cartesian_base_d::Type, CGAL::Dimension_tag<2>> + > +{ +}; +struct Epick_2_help2 +: Cartesian_filter_K< + Epick_2_help1, + Cartesian_base_d>, + Cartesian_base_d::Type, CGAL::Dimension_tag<2>>, + Functors_without_division>::type + > +{ }; +struct Epick_2 +: Kernel_2_interface,Epick_2_help2>> +{ }; +template <> +struct Triangulation_structural_filtering_traits { + typedef Tag_true Use_structural_filtering_tag; +}; +} +typedef CGAL::Epick_2 K; +static_assert(std::is_same::value, ""); +#else +#include +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +#endif + +#include +#include +#include +#include +#include + +typedef CGAL::Delaunay_triangulation_2 DT; +typedef DT::Point Point_2; + +int main(int argc,char** argv) +{ + int n = (argc > 1) ? atoi(argv[1]) : 100000; + std::vector points; + points.reserve( n ); + + std::mt19937 gen(1234); + std::uniform_real_distribution<> dis(1.0, 2.0); + for(int i=0;i +int main(){ + std::cerr << "This program requires C++17 or later.\n"; +} +#endif diff --git a/Number_types/doc/Number_types/CGAL/Gmpfr.h b/Number_types/doc/Number_types/CGAL/Gmpfr.h index e3785df15f2..ae7ce118966 100644 --- a/Number_types/doc/Number_types/CGAL/Gmpfr.h +++ b/Number_types/doc/Number_types/CGAL/Gmpfr.h @@ -189,7 +189,7 @@ static std::float_round_style set_default_rndmode(std::float_round_style r); /*! \name Flags -\sc{Mpfr} provides some flags to know whether +\mpfr provides some flags to know whether performed operations were exact or not, or they incurred in overflow or underflow, if the exponent is out of range, or the result was `NaN` (not-a-number). One can clear the flags before a set of operations and diff --git a/Number_types/include/CGAL/Interval_nt.h b/Number_types/include/CGAL/Interval_nt.h index ec9f7288966..8a51e7cd860 100644 --- a/Number_types/include/CGAL/Interval_nt.h +++ b/Number_types/include/CGAL/Interval_nt.h @@ -1594,6 +1594,16 @@ namespace Eigen { }; }; + templatestruct ScalarBinaryOpTraits; + template + struct ScalarBinaryOpTraits, double, BinaryOp> { + typedef CGAL::Interval_nt ReturnType; + }; + template + struct ScalarBinaryOpTraits, BinaryOp> { + typedef CGAL::Interval_nt ReturnType; + }; + namespace internal { template struct significant_decimals_impl; template diff --git a/Number_types/include/CGAL/NT_converter.h b/Number_types/include/CGAL/NT_converter.h index 1d7c4a8d639..ac225f1e0cb 100644 --- a/Number_types/include/CGAL/NT_converter.h +++ b/Number_types/include/CGAL/NT_converter.h @@ -61,6 +61,17 @@ struct NT_converter < NT1, double > } }; +template < class NT1 > +struct NT_converter < NT1, float > + : public CGAL::cpp98::unary_function< NT1, float > +{ + float + operator()(const NT1 &a) const + { + return static_cast(to_double(a)); + } +}; + template <> struct NT_converter < double, double > : public CGAL::cpp98::unary_function< double, double > @@ -72,6 +83,17 @@ struct NT_converter < double, double > } }; +template <> +struct NT_converter < float, float > + : public CGAL::cpp98::unary_function< float, float > +{ + const float & + operator()(const float &a) const + { + return a; + } +}; + template < class NT1, bool b > struct NT_converter < NT1, Interval_nt > : public CGAL::cpp98::unary_function< NT1, Interval_nt > diff --git a/Number_types/src/CGAL/Interval_arithmetic.cpp b/Number_types/src/CGAL/Interval_arithmetic.cpp deleted file mode 100644 index c64a80f7923..00000000000 --- a/Number_types/src/CGAL/Interval_arithmetic.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 1999-2004 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Sylvain Pion - -#ifndef CGAL_HEADER_ONLY - -#include -#include -#include - -#endif diff --git a/Number_types/src/CGAL/test_FPU_rounding_mode.cpp b/Number_types/src/CGAL/test_FPU_rounding_mode.cpp deleted file mode 100644 index c551abeba99..00000000000 --- a/Number_types/src/CGAL/test_FPU_rounding_mode.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2008 GeometryFactory (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) : Laurent Rineau - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif diff --git a/Number_types/test/Number_types/CMakeLists.txt b/Number_types/test/Number_types/CMakeLists.txt index e6bd7db16aa..0ac30ad1e78 100644 --- a/Number_types/test/Number_types/CMakeLists.txt +++ b/Number_types/test/Number_types/CMakeLists.txt @@ -64,23 +64,26 @@ 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") -find_package(GMP) -if(GMP_FOUND) - create_single_source_cgal_program("CORE_Expr_ticket_4296.cpp") - find_package(MPFI) - if(MPFI_FOUND) - include(${MPFI_USE_FILE}) - endif(MPFI_FOUND) -endif(GMP_FOUND) +find_package( GMP ) +if( GMP_FOUND AND NOT CGAL_DISABLE_GMP ) + create_single_source_cgal_program( "CORE_Expr_ticket_4296.cpp" ) + find_package( MPFI ) + if( MPFI_FOUND ) + include( ${MPFI_USE_FILE} ) + endif() #MPFI_FOUND +endif() #GMP_FOUND AND NOT CGAL_DISABLE_GMP +if(NOT CGAL_DISABLE_GMP) + create_single_source_cgal_program( "Gmpfi.cpp" ) + create_single_source_cgal_program( "Gmpfr_bug.cpp" ) + create_single_source_cgal_program( "eigen.cpp" ) + find_package(Eigen3 3.2.0) #(requires 3.2.0 or greater) + include(CGAL_Eigen3_support) + if (TARGET CGAL::Eigen3_support) + target_link_libraries(eigen PUBLIC CGAL::Eigen3_support) + endif() +else()#NOT CGAL_DISABLE_GMP + message(STATUS "NOTICE: Some tests require the CGAL_Core library, and will not be compiled.") +endif()#NOT CGAL_DISABLE_GMP # all the programs below will be linked against MPFI in case it is present -create_single_source_cgal_program("Gmpfi.cpp") -create_single_source_cgal_program("Gmpfr_bug.cpp") create_single_source_cgal_program("Quotient_new.cpp") create_single_source_cgal_program("test_nt_Coercion_traits.cpp") - -create_single_source_cgal_program("eigen.cpp") -find_package(Eigen3 3.2.0) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) - target_link_libraries(eigen PUBLIC CGAL::Eigen_support) -endif() diff --git a/Optimal_bounding_box/benchmark/Optimal_bounding_box/CMakeLists.txt b/Optimal_bounding_box/benchmark/Optimal_bounding_box/CMakeLists.txt index 4049c0d61f8..bc54c44a641 100644 --- a/Optimal_bounding_box/benchmark/Optimal_bounding_box/CMakeLists.txt +++ b/Optimal_bounding_box/benchmark/Optimal_bounding_box/CMakeLists.txt @@ -11,12 +11,12 @@ find_package(CGAL REQUIRED) include(${CGAL_USE_FILE}) find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library, and will not be compiled.") return() endif() create_single_source_cgal_program("bench_obb.cpp") -target_link_libraries(bench_obb PUBLIC CGAL::Eigen_support) +target_link_libraries(bench_obb PUBLIC CGAL::Eigen3_support) diff --git a/Optimal_bounding_box/examples/Optimal_bounding_box/CMakeLists.txt b/Optimal_bounding_box/examples/Optimal_bounding_box/CMakeLists.txt index 9fdfcadbd14..5cf3ccd5bc7 100644 --- a/Optimal_bounding_box/examples/Optimal_bounding_box/CMakeLists.txt +++ b/Optimal_bounding_box/examples/Optimal_bounding_box/CMakeLists.txt @@ -9,8 +9,8 @@ find_package(CGAL REQUIRED) include(${CGAL_USE_FILE}) find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library, and will not be compiled.") return() @@ -22,5 +22,5 @@ create_single_source_cgal_program("rotated_aabb_tree_example.cpp") foreach(target obb_example obb_with_point_maps_example rotated_aabb_tree_example) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() diff --git a/Optimal_bounding_box/examples/Optimal_bounding_box/obb_with_point_maps_example.cpp b/Optimal_bounding_box/examples/Optimal_bounding_box/obb_with_point_maps_example.cpp index 4b8210a813d..dd20c5e2095 100644 --- a/Optimal_bounding_box/examples/Optimal_bounding_box/obb_with_point_maps_example.cpp +++ b/Optimal_bounding_box/examples/Optimal_bounding_box/obb_with_point_maps_example.cpp @@ -36,7 +36,7 @@ int main(int argc, char** argv) // one can associate positions to the vertices of the mesh without changing the mesh std::unordered_map translated_positions; - for(const vertex_descriptor v : vertices(sm)) + for(const vertex_descriptor& v : vertices(sm)) translated_positions[v] = sm.point(v) + Vector(1, 2, 3); CGAL::oriented_bounding_box(sm, obb_points, @@ -44,7 +44,7 @@ int main(int argc, char** argv) // using a range of points std::vector points; - for(const vertex_descriptor v : vertices(sm)) + for(const vertex_descriptor& v : vertices(sm)) points.push_back(sm.point(v)); CGAL::oriented_bounding_box(points, obb_points); diff --git a/Optimal_bounding_box/test/Optimal_bounding_box/CMakeLists.txt b/Optimal_bounding_box/test/Optimal_bounding_box/CMakeLists.txt index 28101edbef2..d8b1257e2ee 100644 --- a/Optimal_bounding_box/test/Optimal_bounding_box/CMakeLists.txt +++ b/Optimal_bounding_box/test/Optimal_bounding_box/CMakeLists.txt @@ -9,8 +9,8 @@ find_package(CGAL REQUIRED) include(${CGAL_USE_FILE}) find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library, and will not be compiled.") return() @@ -21,5 +21,5 @@ create_single_source_cgal_program("test_nelder_mead.cpp") create_single_source_cgal_program("test_optimization_algorithms.cpp") foreach(target test_OBB_traits test_nelder_mead test_optimization_algorithms) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() diff --git a/Optimal_bounding_box/test/Optimal_bounding_box/test_optimization_algorithms.cpp b/Optimal_bounding_box/test/Optimal_bounding_box/test_optimization_algorithms.cpp index eee97967b5b..a7b330b09e6 100644 --- a/Optimal_bounding_box/test/Optimal_bounding_box/test_optimization_algorithms.cpp +++ b/Optimal_bounding_box/test/Optimal_bounding_box/test_optimization_algorithms.cpp @@ -91,7 +91,7 @@ void test_OBB_of_mesh(const std::string fname, } std::vector points; - for(const auto v : vertices(mesh)) + for(const auto& v : vertices(mesh)) points.push_back(v->point()); test_OBB_data(points, expected_vol); diff --git a/Optimisation_basic/package_info/Optimisation_basic/dependencies b/Optimisation_basic/package_info/Optimisation_basic/dependencies index e69de29bb2d..4b1b3cb93f3 100644 --- a/Optimisation_basic/package_info/Optimisation_basic/dependencies +++ b/Optimisation_basic/package_info/Optimisation_basic/dependencies @@ -0,0 +1,4 @@ +Installation +Kernel_23 +Profiling_tools +STL_Extension diff --git a/Partition_2/include/CGAL/Partition_2/Rotation_tree_2.h b/Partition_2/include/CGAL/Partition_2/Rotation_tree_2.h index 07fb9bb3bb4..fa78978a4dd 100644 --- a/Partition_2/include/CGAL/Partition_2/Rotation_tree_2.h +++ b/Partition_2/include/CGAL/Partition_2/Rotation_tree_2.h @@ -34,7 +34,6 @@ #include #include -#include namespace CGAL { 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 9bf894ca0d7..b95c3c7f607 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 @@ -16,12 +16,14 @@ The class `Periodic_2_Delaunay_triangulation_2` has two template parameters. The \tparam Traits is the geometric traits, it is to be instantiated by a model of the concept `Periodic_2DelaunayTriangulationTraits_2`. -The second parameter is the triangulation data structure, it has to be -instantiated by a model of the concept -`TriangulationDataStructure_2` with some additional functionality -in faces. By default, the triangulation data structure is instantiated -by -`CGAL::Triangulation_data_structure_2 < CGAL::Triangulation_vertex_base_2, CGAL::Periodic_2_triangulation_face_base_2 > >`. +\tparam Tds is the triangulation data data structure and must be a model of `TriangulationDataStructure_2` +whose vertex and face are models of `Periodic_2TriangulationVertexBase_2` and `Periodic_2TriangulationFaceBase_2`. +It defaults to: +\code +CGAL::Triangulation_data_structure_2< + CGAL::Periodic_2_triangulation_vertex_base_2, + CGAL::Periodic_2_triangulation_face_base_2 > > +\endcode \cgalHeading{Implementation} @@ -42,11 +44,8 @@ After a point location step, the nearest neighbor is found in time vertices distributed uniformly at random and any query point. \sa `CGAL::Periodic_2_triangulation_2` -\sa `CGAL::Delaunay_triangulation_2` -\sa `TriangulationDataStructure_2` -\sa `Periodic_2DelaunayTriangulationTraits_2` \sa `CGAL::Periodic_2_triangulation_hierarchy_2` - +\sa `CGAL::Delaunay_triangulation_2` */ template< typename Traits, typename Tds > class Periodic_2_Delaunay_triangulation_2 : public 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 f68062261eb..21dc5d73b09 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 @@ -11,15 +11,17 @@ The class `Periodic_2_triangulation_2` represents a 2-dimensional triangulation of a point set in \f$ \mathbb T_c^2\f$. \tparam Traits is the geometric traits, it -is to be instantiated by a model of the concept +has to be instantiated by a model of the concept `Periodic_2TriangulationTraits_2`. -\tparam TDS is the triangulation data structure, -it has to be instantiated by a model of the concept -`TriangulationDataStructure_2` with some additional -functionality in faces. -By default, the triangulation data structure is instantiated by -`CGAL::Triangulation_data_structure_2 < CGAL::Triangulation_vertex_base_2, CGAL::Periodic_2_triangulation_face_base_2 > >`. +\tparam Tds is the triangulation data data structure and must be a model of `TriangulationDataStructure_2` +whose vertex and face are models of `Periodic_2TriangulationVertexBase_2` and `Periodic_2TriangulationFaceBase_2`. +It defaults to: +\code +CGAL::Triangulation_data_structure_2< + CGAL::Periodic_2_triangulation_vertex_base_2, + CGAL::Periodic_2_triangulation_face_base_2 > > +\endcode \cgalHeading{Traversal of the Triangulation} @@ -67,14 +69,9 @@ their counterparts visiting all (non-virtual and virtual) features which are themselves derived from the corresponding iterators of the triangulation data structure. -\sa `Triangulation_2` -\sa `Periodic_2TriangulationTraits_2` -\sa `TriangulationDataStructure_2` -\sa `TriangulationDataStructure_2::Face` -\sa `TriangulationDataStructure_2::Vertex` -\sa `CGAL::Triangulation_data_structure_2` -\sa `CGAL::Periodic_2_triangulation_face_base_2` - +\sa `CGAL::Periodic_2_triangulation_2` +\sa `CGAL::Periodic_2_triangulation_hierarchy_2` +\sa `CGAL::Triangulation_2` */ template< typename Traits, typename Tds > class Periodic_2_triangulation_2 : public Triangulation_cw_ccw_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 726d2f5af83..e14eab6d490 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 @@ -8,12 +8,11 @@ namespace CGAL \ingroup PkgPeriodic2Triangulation2TraitsClasses The class `Periodic_2_triangulation_traits_2` is designed as a default -traits class for the class -`Periodic_2_triangulation_2`. +traits class for the class `CGAL::Periodic_2_triangulation_2`. \tparam Traits must be a model of the `TriangulationTraits_2` concept. \tparam Periodic_2Offset_2 must be a model of the concept -`Periodic_2Offset_2` and defaults to `Periodic_2_offset_2`. +`Periodic_2Offset_2` and defaults to `CGAL::Periodic_2_offset_2`. If `Traits` is a `CGAL::Filtered_kernel` (detected when `Traits::Has_filtered_predicates` exists and is `true`), this class automatically provides filtered predicates. Similarly, statically filtered predicates diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Periodic_2_triangulation_2.txt b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Periodic_2_triangulation_2.txt index 0db671e9a6f..93c54224799 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Periodic_2_triangulation_2.txt +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Periodic_2_triangulation_2.txt @@ -256,18 +256,19 @@ The second parameter `Periodic_2Offset_2` defaults to The second template parameter of the main classes `Periodic_2_triangulation_2` and `Periodic_2_Delaunay_triangulation_2` is a -triangulation data structure class. This class can be seen as a container for +triangulation data structure class. This class must be a model of the concept +`TriangulationDataStructure_2`, which describes requirements for the class to be a container for the faces and vertices maintaining incidence and adjacency relations (see -Chapter \ref Chapter_2D_Triangulation_Data_Structure). A model of this triangulation data structure is -`Triangulation_data_structure_2`, and it is described by the -`TriangulationDataStructure_2` concept. This model is itself +Chapter \ref Chapter_2D_Triangulation_Data_Structure). In addition, the concepts +`TriangulationDataStructure_2::Vertex` and `TriangulationDataStructure_2::Face` are extended +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 structure, and hence by the geometric triangulation using it. -To represent periodic triangulations the cell base and vertex base -classes need to meet the concepts -`Periodic_2TriangulationFaceBase_2` and -`Periodic_2TriangulationVertexBase_2`. +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`. 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 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 a85f7239e69..ef8a5d063f9 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 @@ -292,12 +292,12 @@ public: { return _gt; } - /// Returns the datastructure storing the triangulation. + /// Returns the data structure storing the triangulation. const Triangulation_data_structure & tds() const { return _tds; } - /// Returns the datastructure storing the triangulation. + /// Returns the data structure storing the triangulation. Triangulation_data_structure & tds() { return _tds; @@ -357,17 +357,17 @@ public: else return _tds.number_of_faces() / 9; } - /// Returns the number of vertices stored in the datastructure. + /// Returns the number of vertices stored in the data structure. size_type number_of_stored_vertices() const { return _tds.number_of_vertices(); } - /// Returns the number of edges stored in the datastructure. + /// Returns the number of edges stored in the data structure. size_type number_of_stored_edges() const { return _tds.number_of_edges(); } - /// Returns the number of faces stored in the datastructure. + /// Returns the number of faces stored in the data structure. size_type number_of_stored_faces() const { return _tds.number_of_faces(); @@ -1812,7 +1812,7 @@ bool Periodic_2_triangulation_2::is_valid_too_long_edges(bool verbose, { if (too_long) { - if (verbose) std::cout << "1. Too long edge not in the datastructure" << std::endl; + if (verbose) std::cout << "1. Too long edge not in the data structure" << std::endl; result = false; } result &= !too_long; @@ -1826,7 +1826,7 @@ bool Periodic_2_triangulation_2::is_valid_too_long_edges(bool verbose, too_long_edges++; if (it2 == it->second.end()) { - if (verbose) std::cout << "2. Too long edge not in the datastructure" << std::endl; + if (verbose) std::cout << "2. Too long edge not in the data structure" << std::endl; result = false; } CGAL_triangulation_assertion(result); @@ -1835,7 +1835,7 @@ bool Periodic_2_triangulation_2::is_valid_too_long_edges(bool verbose, { if (it2 != it->second.end()) { - if (verbose) std::cout << "Edge is not too long, but contained in the datastructure" << std::endl; + if (verbose) std::cout << "Edge is not too long, but contained in the data structure" << std::endl; result = false; } CGAL_triangulation_assertion(result); diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 909b38c0675..e4859ea033f 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -17,6 +17,7 @@ #ifdef CGAL_USE_BASIC_VIEWER +#include #include #include @@ -260,6 +261,7 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc=1; const char* argv[2]={"p2t2_viewer","\0"}; QApplication app(argc,const_cast(argv)); diff --git a/Periodic_3_mesh_3/examples/Periodic_3_mesh_3/CMakeLists.txt b/Periodic_3_mesh_3/examples/Periodic_3_mesh_3/CMakeLists.txt index 373da679ef9..176dd1bb67f 100644 --- a/Periodic_3_mesh_3/examples/Periodic_3_mesh_3/CMakeLists.txt +++ b/Periodic_3_mesh_3/examples/Periodic_3_mesh_3/CMakeLists.txt @@ -17,8 +17,8 @@ include(${CGAL_USE_FILE}) # Use Eigen find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library, and will not be compiled.") return() @@ -47,5 +47,5 @@ foreach( mesh_implicit_shape mesh_implicit_multi_domain mesh_implicit_shape_with_subdomains mesh_implicit_shape_with_optimizers mesh_implicit_shape_with_features) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() 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 e27c762ed34..8b0f3b1fb6c 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 @@ -49,8 +49,7 @@ #include -#include -#include +#include #ifndef CGAL_NO_ASSERTIONS # include // for float_prior #endif @@ -2892,7 +2891,7 @@ next_vertex_along_curve(const Vertex_handle& start, adjacent_vertices.erase (std::remove_if(adjacent_vertices.begin(), adjacent_vertices.end(), - boost::bind(&Adjacent_vertices::value_type::second, _1) != curve_index), + [curve_index](const auto& p){ return p.second != curve_index;}), adjacent_vertices.end()); // typename Adjacent_vertices::const_iterator iv = adjacent_vertices.begin(); diff --git a/Periodic_3_mesh_3/test/Periodic_3_mesh_3/CMakeLists.txt b/Periodic_3_mesh_3/test/Periodic_3_mesh_3/CMakeLists.txt index 8dfc601878a..aeb5f547de9 100644 --- a/Periodic_3_mesh_3/test/Periodic_3_mesh_3/CMakeLists.txt +++ b/Periodic_3_mesh_3/test/Periodic_3_mesh_3/CMakeLists.txt @@ -14,18 +14,18 @@ include(${CGAL_USE_FILE}) # Use Eigen find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library, and will not be compiled.") return() endif() create_single_source_cgal_program("test_implicit_shapes_bunch.cpp") -target_link_libraries(test_implicit_shapes_bunch PUBLIC CGAL::Eigen_support) +target_link_libraries(test_implicit_shapes_bunch PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("test_implicit_shapes_with_features.cpp") target_link_libraries(test_implicit_shapes_with_features - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("test_triply_periodic_minimal_surfaces.cpp") target_link_libraries(test_triply_periodic_minimal_surfaces - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) 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 bbbeecc0371..811619b9522 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 @@ -17,7 +17,7 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) # Find Qt5 itself -find_package(Qt5 QUIET COMPONENTS Xml OpenGL Help Core) +find_package(Qt5 QUIET COMPONENTS OpenGL Help Core) if(Qt5_FOUND) add_definitions(-DQT_NO_KEYWORDS) diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/Scene.h b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/Scene.h index 41d4311ebe8..32f3926c802 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/Scene.h +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/Scene.h @@ -76,6 +76,7 @@ public: } ~Scene() { + ui->viewer->makeCurrent(); for(int i=0; i<24; i++) buffers[i].destroy(); for(int i=0; i<12; i++) diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/periodic_3_triangulation_3_demo.cpp b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/periodic_3_triangulation_3_demo.cpp index c93f4155487..d58698f0883 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/periodic_3_triangulation_3_demo.cpp +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/periodic_3_triangulation_3_demo.cpp @@ -1,13 +1,13 @@ #include "MainWindow.h" #include +#include int main(int argc, char *argv[]) { + CGAL::Qt::init_ogl_context(2,1); QApplication a(argc, argv); MainWindow w; - //w.ui->setupUi(w); - w.ui->viewer->restoreStateFromFile(); w.show(); 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 ee10c5ac9ca..4f73377504b 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt @@ -19,7 +19,7 @@ set(CMAKE_AUTOMOC ON) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Xml Script Help OpenGL Svg) +find_package(Qt5 QUIET COMPONENTS Script Help OpenGL Svg) if(Qt5Help_VERSION VERSION_LESS 5.12) set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt5::qcollectiongenerator) 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 75f1f8ee396..ae0074e0bcc 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 @@ -1,18 +1,17 @@ #include "MainWindow.h" #include #include +#include int main(int argc, char** argv) { - QApplication application(argc,argv); + CGAL::Qt::init_ogl_context(2, 1); + + QApplication application(argc,argv); application.setOrganizationDomain("inria.fr"); application.setOrganizationName("INRIA"); application.setApplicationName("3D Periodic Lloyd"); - //for windows -#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) - application.setAttribute(Qt::AA_UseDesktopOpenGL); -#endif // Import resources from libCGAL (QT5). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE diff --git a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/Viewer.h b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/Viewer.h index 1ea4397cf4c..7ba3534a6d2 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/Viewer.h +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/Viewer.h @@ -27,6 +27,7 @@ public: {} ~Viewer() { + makeCurrent(); for(int i=0; i<4; i++) { buffers[i].destroy(); diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_Delaunay_triangulation_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_Delaunay_triangulation_3.h index 784f44ff1c7..6a1e4c5d911 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_Delaunay_triangulation_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_Delaunay_triangulation_3.h @@ -9,8 +9,15 @@ Delaunay triangulation in three-dimensional periodic space. \tparam PT must be a model of the concept `Periodic_3DelaunayTriangulationTraits_3`. -\tparam TDS must be a model of the concept `TriangulationDataStructure_3`. Its default value -is `Triangulation_data_structure_3>,Triangulation_cell_base_3>>`. +\tparam TDS must be a model of the concept `TriangulationDataStructure_3` whose +vertex and cell are models of `Periodic_3TriangulationDSVertexBase_3` and `Periodic_3TriangulationDSCellBase_3`, +respectively. +It defaults to: +\code +CGAL::Triangulation_data_structure_3< + CGAL::Triangulation_vertex_base_3 >, + CGAL::Triangulation_cell_base_3 > > +\endcode */ template< typename PT, typename TDS > 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 770ac8e656c..d5c6de09876 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 @@ -8,7 +8,7 @@ The class `Periodic_3_Delaunay_triangulation_traits_3` is designed as a default class `Periodic_3_Delaunay_triangulation_3`. \tparam Traits must be a model of the `DelaunayTriangulationTraits_3` concept. -\tparam Offset must be a model of the concept `Periodic_3Offset_3` and defaults to `Periodic_3_offset_3`. +\tparam Offset must be a model of the concept `Periodic_3Offset_3` and defaults to `CGAL::Periodic_3_offset_3`. If `Traits` is a `CGAL::Filtered_kernel` (detected when `Traits::Has_filtered_predicates` exists and is `true`), this class automatically provides filtered predicates. Similarly, statically filtered predicates diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_regular_triangulation_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_regular_triangulation_3.h index b15ac483eb2..5e8938db6c0 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_regular_triangulation_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_regular_triangulation_3.h @@ -9,11 +9,18 @@ weighted Delaunay triangulation in three-dimensional periodic space. \tparam PT must be a model of the concept `Periodic_3RegularTriangulationTraits_3`. -\tparam TDS must be a model of the concept `TriangulationDataStructure_3`. -Its default value is -`Triangulation_data_structure_3 >, - Regular_triangulation_cell_base_3>>`. +\tparam TDS must be a model of the concept `TriangulationDataStructure_3` whose +vertex and cell are models of `Periodic_3RegularTriangulationDSVertexBase_3` +and `Periodic_3RegularTriangulationDSCellBase_3`, respectively. +Its default value is: +\code +CGAL::Triangulation_data_structure_3< + CGAL::Regular_triangulation_vertex_base_3 >, + CGAL::Regular_triangulation_cell_base_3 > > +\endcode +\sa `CGAL::Periodic_3_triangulation_3` +\sa `CGAL::Periodic_3_Delaunay_triangulation_3` */ template< typename PT, typename TDS > class Periodic_3_regular_triangulation_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 8a4ec39a0cf..acfe43f7c32 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 @@ -8,7 +8,7 @@ The class `Periodic_3_regular_triangulation_traits_3` is designed as a default t class `Periodic_3_regular_triangulation_3`. \tparam Traits must be a model of the `RegularTriangulationTraits_3` concept. -\tparam Offset must be a model of the concept `Periodic_3Offset_3` and defaults to `Periodic_3_offset_3`. +\tparam Offset must be a model of the concept `Periodic_3Offset_3` and defaults to `CGAL::Periodic_3_offset_3`. If `Traits` is a `CGAL::Filtered_kernel` (detected when `Traits::Has_filtered_predicates` exists and is `true`), this class automatically provides filtered predicates. diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_3.h index 3bb1bb28506..10569a5784c 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_3.h @@ -9,13 +9,17 @@ triangulation of a point set in \f$ \mathbb T_c^3\f$. \tparam Traits must be a model of the concept `Periodic_3TriangulationTraits_3`. -\tparam TDS must be a model of the concept `TriangulationDataStructure_3` -with some additional functionality in cells and vertices. -Its default value is -`Triangulation_data_structure_3>,Triangulation_cell_base_3>>`. +\tparam TDS must be a model of the concept `TriangulationDataStructure_3` with +vertex and cell are models of `Periodic_3TriangulationDSVertexBase_3` and `Periodic_3TriangulationDSCellBase_3`, +Its default value is: +\code +CGAL::Triangulation_data_structure_3< + CGAL::Triangulation_vertex_base_3 >, + CGAL::Triangulation_cell_base_3 > > +\endcode -\sa `Periodic_3_Delaunay_triangulation_3` -\sa `Periodic_3_regular_triangulation_3` +\sa `CGAL::Periodic_3_Delaunay_triangulation_3` +\sa `CGAL::Periodic_3_regular_triangulation_3` */ template< typename Traits, typename TDS > class Periodic_3_triangulation_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 98b07f6d6b7..59afc1e24c3 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 @@ -7,9 +7,9 @@ \cgalRefines `Periodic_3TriangulationDSCellBase_3` \cgalHasModel `CGAL::Regular_triangulation_cell_base_3 >` + Periodic_3_triangulation_ds_cell_base_3< > >` \cgalHasModel `CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3 >` + Periodic_3_triangulation_ds_cell_base_3< > >` 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 1d2a7bec41c..43ff786e30a 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 @@ -7,7 +7,7 @@ \cgalRefines `Periodic_3TriangulationDSVertexBase_3` \cgalHasModel `CGAL::Regular_triangulation_vertex_base_3 >` + Periodic_3_triangulation_ds_vertex_base_3< > >` 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/Periodic_3_triangulation_3.txt b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Periodic_3_triangulation_3.txt index a1998b9165b..92eb9015cef 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Periodic_3_triangulation_3.txt +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Periodic_3_triangulation_3.txt @@ -219,17 +219,17 @@ The first template parameter of the triangulation class `Periodic_3_triangulation_3` is the geometric traits class, described by the concept `Periodic_3TriangulationTraits_3`. It is different to the -TriangulationTraits_3 (see +`TriangulationTraits_3` (see chapter \ref Triangulation3secTraits "3D Triangulations") in that it implements all objects, predicates and constructions using offsets. -The class `Periodic_3_triangulation_traits_3` +The class `CGAL::Periodic_3_triangulation_traits_3` provides the required functionality. It expects two template parameters: a model of the concept `TriangulationTraits_3` and a model of the concept `Periodic_3Offset_3`. The second parameter `Periodic_3Offset_3` defaults to -`Periodic_3_offset_3`. +`CGAL::Periodic_3_offset_3`. \subsubsection P3Triangulation3secTraitsP3DT3 Traits for Periodic Delaunay Triangulations @@ -237,7 +237,7 @@ The first template parameter of the Delaunay triangulation class `Periodic_3_Delaunay_triangulation_3` is the geometric traits class, described by the concept `Periodic_3DelaunayTriangulationTraits_3`. It is different to the -DelaunayTriangulationTraits_3 (see +`DelaunayTriangulationTraits_3` (see chapter \ref Triangulation3secTraits "3D Triangulations") in that it implements all objects, predicates and constructions using offsets. @@ -246,9 +246,7 @@ provides the required functionality. It expects two template parameters: a model of the concept `DelaunayTriangulationTraits_3` and a model of the concept `Periodic_3Offset_3`. -The second parameter `Periodic_3Offset_3` defaults to -`Periodic_3_offset_3`. - +The second parameter `Periodic_3Offset_3` defaults to `CGAL::Periodic_3_offset_3`. \subsubsection P3Triangulation3secTraitsP3regularT3 Traits for Periodic Regular Triangulations @@ -290,18 +288,14 @@ triangles, and tetrahedra are used. \subsection P3Triangulation3sectds The Triangulation Data Structure Parameter The second template parameter of the periodic triangulation classes is a -triangulation data structure class. This class can be seen as a container for -the cells and vertices maintaining incidence and adjacency relations (see -Chapter \ref chapterTDS3 "3D Triangulation Data Structure"). A model of this triangulation data structure is -`Triangulation_data_structure_3`, and it is described by the -`TriangulationDataStructure_3` concept. This model is itself -parameterized by a vertex base class and a cell base class, which gives the -possibility to customize the vertices and cells used by the triangulation data -structure, and hence by the geometric triangulation using it. -To represent periodic triangulations the cell base and vertex base -classes need to meet the concepts -`Periodic_3TriangulationDSCellBase_3` and -`Periodic_3TriangulationDSVertexBase_3`. +triangulation data structure class. +This parameter must meet the requirements described in the concept `TriangulationDataStructure_3`, +for which \cgal offers the model `CGAL::Triangulation_data_structure_3`. +To represent periodic triangulations, +the face and vertex of the triangulation data structure must be also be models of extended concepts. +The model `CGAL::Triangulation_data_structure_3` is parameterized by a vertex +base class and a face base class, which gives the possibility to customize the vertices and +faces used by the triangulation data structure. 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 diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h index 514460645ab..aa67d8eee10 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h @@ -21,10 +21,12 @@ The class expects two template parameters. and faces, following the concepts `Periodic_4HyperbolicTriangulationVertexBase_2` and `Periodic_4HyperbolicTriangulationFaceBase_2`, respectively. The default value for this parameter is - `Triangulation_data_structure_2< Periodic_4_hyperbolic_triangulation_vertex_base_2, Periodic_4_hyperbolic_triangulation_face_base_2 >` - + \code + CGAL::Triangulation_data_structure_2< + CGAL::Periodic_4_hyperbolic_triangulation_vertex_base_2, + CGAL::Periodic_4_hyperbolic_triangulation_face_base_2 > + \endcode */ - template < class GT, class TDS > class Periodic_4_hyperbolic_Delaunay_triangulation_2: public Periodic_4_hyperbolic_triangulation_2 { diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_2.h index 6c71eb1993f..08ea200278e 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_2.h @@ -21,11 +21,12 @@ The class expects two template parameters. and faces, following the concepts `Periodic_4HyperbolicTriangulationVertexBase_2` and `Periodic_4HyperbolicTriangulationFaceBase_2`, respectively. The default value for this parameter is - `Triangulation_data_structure_2< Periodic_4_hyperbolic_triangulation_vertex_base_2, Periodic_4_hyperbolic_triangulation_face_base_2 >` - + \code + CGAL::Triangulation_data_structure_2< + CGAL::Periodic_4_hyperbolic_triangulation_vertex_base_2, + CGAL::Periodic_4_hyperbolic_triangulation_face_base_2 > + \endcode */ - - template < class GT, class TDS > class Periodic_4_hyperbolic_triangulation_2 { diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_triangulation_2.txt b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_triangulation_2.txt index 586d94b3143..f5bdc8e3990 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_triangulation_2.txt +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_triangulation_2.txt @@ -289,12 +289,13 @@ The triangulation data structure is a container for the faces and vertices and m incidence and adjacency relations. This parameter must meet the requirements described in the concept `TriangulationDataStructure_2`, for which \cgal offers the model `Triangulation_data_structure_2`. -This model is itself parameterized by a vertex -base class and a face base class, which gives the possibility to customize the vertices and -faces used by the triangulation data structure. To represent periodic hyperbolic triangulations, -the face base and vertex base classes must be models of the concepts +To represent periodic hyperbolic triangulations, +the face and vertex of the triangulation data structure must be models of the concepts `Periodic_4HyperbolicTriangulationFaceBase_2` and `Periodic_4HyperbolicTriangulationVertexBase_2`, respectively. +The model `CGAL::Triangulation_data_structure_2` is parameterized by a vertex +base class and a face base class, which gives the possibility to customize the vertices and +faces used by the triangulation data structure. The default value for the triangulation data structure parameter is `Triangulation_data_structure_2< Periodic_4_hyperbolic_triangulation_vertex_base_2, Periodic_4_hyperbolic_triangulation_face_base_2 >`, diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h index cd4166330cd..0c74a7a8be4 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h @@ -27,8 +27,6 @@ #include #include -#include - #include #include #include diff --git a/Point_set_3/examples/Point_set_3/CMakeLists.txt b/Point_set_3/examples/Point_set_3/CMakeLists.txt index e09a0d2188f..3f256c5047f 100644 --- a/Point_set_3/examples/Point_set_3/CMakeLists.txt +++ b/Point_set_3/examples/Point_set_3/CMakeLists.txt @@ -36,10 +36,10 @@ create_single_source_cgal_program("point_set_read_ply.cpp" CXX_FEATURES ${needed_cxx_features}) find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) if(EIGEN3_FOUND) create_single_source_cgal_program("point_set_algo.cpp") - target_link_libraries(point_set_algo PUBLIC CGAL::Eigen_support) + target_link_libraries(point_set_algo PUBLIC CGAL::Eigen3_support) endif() create_single_source_cgal_program("draw_point_set_3.cpp") diff --git a/Point_set_3/include/CGAL/Point_set_3.h b/Point_set_3/include/CGAL/Point_set_3.h index 569da854beb..817ee67fd9d 100644 --- a/Point_set_3/include/CGAL/Point_set_3.h +++ b/Point_set_3/include/CGAL/Point_set_3.h @@ -15,6 +15,8 @@ #include +#include + #include #include @@ -935,15 +937,15 @@ public: /*! \brief returns a vector of pairs that describe properties and associated types. */ - std::vector > properties_and_types() const + std::vector > properties_and_types() const { std::vector prop = m_base.properties(); prop.erase (prop.begin()); // remove "index" prop.erase (prop.begin()); // remove "point" - std::vector > out; out.reserve (prop.size()); + std::vector > out; out.reserve (prop.size()); for (std::size_t i = 0; i < prop.size(); ++ i) - out.push_back (std::make_pair (prop[i], m_base.get_type(prop[i]))); + out.push_back (std::make_pair (prop[i], std::type_index(m_base.get_type(prop[i])))); return out; } diff --git a/Point_set_3/include/CGAL/Point_set_3/IO/OFF.h b/Point_set_3/include/CGAL/Point_set_3/IO/OFF.h index 5425fbfa4b9..b8882c97fdc 100644 --- a/Point_set_3/include/CGAL/Point_set_3/IO/OFF.h +++ b/Point_set_3/include/CGAL/Point_set_3/IO/OFF.h @@ -134,7 +134,7 @@ CGAL_DEPRECATED bool read_off_point_set(std::istream& is, ///< input stream. \cgalParamNBegin{stream_precision} \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} \cgalParamType{int} - \cgalParamDefault{`6`} + \cgalParamDefault{`the precision of the stream `os``} \cgalParamNEnd \cgalNamedParamsEnd 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 1e60eac251f..4646ffbd974 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 @@ -456,7 +456,7 @@ CGAL_DEPRECATED bool read_ply_point_set(std::istream& is, ///< input stream. \cgalParamNBegin{stream_precision} \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} \cgalParamType{int} - \cgalParamDefault{`6`} + \cgalParamDefault{`the precision of the stream `os``} \cgalParamExtra{This parameter is only meaningful while using ASCII encoding.} \cgalParamNEnd \cgalNamedParamsEnd @@ -493,8 +493,7 @@ bool write_PLY(std::ostream& os, return false; } - const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6); - os.precision(precision); + set_stream_precision_from_NP(os, np); os << "ply" << std::endl << ((get_mode(os) == IO::BINARY) ? "format binary_little_endian 1.0" : "format ascii 1.0") << std::endl diff --git a/Point_set_3/include/CGAL/Point_set_3/IO/XYZ.h b/Point_set_3/include/CGAL/Point_set_3/IO/XYZ.h index 4f5ba04a550..a7b243fc192 100644 --- a/Point_set_3/include/CGAL/Point_set_3/IO/XYZ.h +++ b/Point_set_3/include/CGAL/Point_set_3/IO/XYZ.h @@ -132,7 +132,7 @@ CGAL_DEPRECATED bool read_xyz_point_set(std::istream& is, CGAL::Point_set_3 #include #include @@ -100,6 +101,7 @@ void draw(const Point_set_3& apointset, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc=1; const char* argv[2]={"point_set_viewer","\0"}; QApplication app(argc,const_cast(argv)); diff --git a/Point_set_3/test/Point_set_3/CMakeLists.txt b/Point_set_3/test/Point_set_3/CMakeLists.txt index 3fb6595dcea..d6b434e3b60 100644 --- a/Point_set_3/test/Point_set_3/CMakeLists.txt +++ b/Point_set_3/test/Point_set_3/CMakeLists.txt @@ -28,3 +28,18 @@ endif() create_single_source_cgal_program("point_set_test.cpp") create_single_source_cgal_program("point_set_test_join.cpp") +create_single_source_cgal_program("test_deprecated_io_ps.cpp") + +#Use LAS +#disable if MSVC 2017 +if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1910)) + find_package(LASLIB) + include(CGAL_LASLIB_support) + if (TARGET CGAL::LASLIB_support) + target_link_libraries(test_deprecated_io_ps PUBLIC CGAL::LASLIB_support) + else() + message(STATUS "NOTICE : the LAS reader test requires LASlib and will not be compiled.") + endif() +else() + message(STATUS "NOTICE : the LAS reader does not work with Visual Studio 2017.") +endif() diff --git a/Point_set_3/test/Point_set_3/point_set_test.cpp b/Point_set_3/test/Point_set_3/point_set_test.cpp index 24f87c6b13e..1e03a609caf 100644 --- a/Point_set_3/test/Point_set_3/point_set_test.cpp +++ b/Point_set_3/test/Point_set_3/point_set_test.cpp @@ -107,6 +107,11 @@ int main (int, char**) point_set.add_property_map ("label", 0); point_set.add_property_map ("intensity", 0.0); + auto pnt = point_set.properties_and_types(); + std::cerr << "Properties = " << std::endl; + for (const auto& p : pnt) + std::cerr << " * " << p.first << " with type " << p.second.name() << std::endl; + test (point_set.base().n_properties() == 4, "point set should have 4 properties."); Point p_before = *(point_set.points().begin()); diff --git a/Point_set_3/test/Point_set_3/test_deprecated_io_ps.cpp b/Point_set_3/test/Point_set_3/test_deprecated_io_ps.cpp new file mode 100644 index 00000000000..8876da2d1aa --- /dev/null +++ b/Point_set_3/test/Point_set_3/test_deprecated_io_ps.cpp @@ -0,0 +1,82 @@ +#include + +#include + +#include +#include +#include +#include + +#include +#include + + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef Kernel::Vector_3 Vector_3; + +int main() +{ + CGAL::Point_set_3 ps, ps2; + std::ifstream is("data/oni.pwn"); + std::ofstream os; + + if(!CGAL::read_xyz_point_set(is, ps)) + { + std::cerr<<"Error while reading input."< -#include +#include namespace CGAL { namespace Point_set_processing_3 { diff --git a/Point_set_processing_3/include/CGAL/compute_average_spacing.h b/Point_set_processing_3/include/CGAL/compute_average_spacing.h index d9fdd38f040..0f98e72c863 100644 --- a/Point_set_processing_3/include/CGAL/compute_average_spacing.h +++ b/Point_set_processing_3/include/CGAL/compute_average_spacing.h @@ -81,7 +81,7 @@ compute_average_spacing(const typename NeighborQuery::Kernel::Point_3& query, // boost::make_function_output_iterator ([&](const Point& p) { - sum_distances += std::sqrt(CGAL::squared_distance (query,p)); + sum_distances += CGAL::approximate_sqrt(CGAL::squared_distance (query,p)); ++ i; })); diff --git a/Point_set_processing_3/include/CGAL/edge_aware_upsample_point_set.h b/Point_set_processing_3/include/CGAL/edge_aware_upsample_point_set.h index 255bc3501bd..153159fffd8 100644 --- a/Point_set_processing_3/include/CGAL/edge_aware_upsample_point_set.h +++ b/Point_set_processing_3/include/CGAL/edge_aware_upsample_point_set.h @@ -212,8 +212,8 @@ update_new_point( for (unsigned int j = 0; j < candidate_num; j++) { - FT psi = std::exp(-std::pow(1 - normal_cadidate[j] * t.normal, 2) - / sharpness_bandwidth); + FT psi = std::exp(-std::pow(FT(1) - normal_cadidate[j] * t.normal, FT(2)) + / sharpness_bandwidth); FT project_diff_t_v = (t.pt - new_v.pt) * t.normal; FT weight = psi * theta; @@ -381,8 +381,6 @@ edge_aware_upsample_point_set( double neighbor_radius = choose_parameter(get_parameter(np, internal_np::neighbor_radius), -1); std::size_t number_of_output_points = choose_parameter(get_parameter(np, internal_np::number_of_output_points), 1000); - std::cerr << sharpness_angle << " " << edge_sensitivity << " " << neighbor_radius - << " " << number_of_output_points << std::endl; // trick in case the output iterator add points to the input container typename PointRange::const_iterator begin = points.begin(); typename PointRange::const_iterator end = points.end(); @@ -435,7 +433,8 @@ edge_aware_upsample_point_set( FT(neighbor_radius)); // - FT cos_sigma = static_cast(std::cos(CGAL::to_double(sharpness_angle) / 180.0 * CGAL_PI)); + FT cos_sigma = static_cast(std::cos(FT(CGAL::to_double(sharpness_angle)) + / FT(180) * FT(CGAL_PI))); FT sharpness_bandwidth = std::pow((CGAL::max)((FT)1e-8, (FT)1.0 - cos_sigma), 2); FT sum_density = 0.0; diff --git a/Point_set_processing_3/include/CGAL/hierarchy_simplify_point_set.h b/Point_set_processing_3/include/CGAL/hierarchy_simplify_point_set.h index 1ddf0068651..5a115be66c8 100644 --- a/Point_set_processing_3/include/CGAL/hierarchy_simplify_point_set.h +++ b/Point_set_processing_3/include/CGAL/hierarchy_simplify_point_set.h @@ -109,7 +109,7 @@ namespace CGAL { \ingroup PkgPointSetProcessing3Algorithms Recursively split the point set in smaller clusters until the - clusters have less than `size` elements and until their variation + clusters have fewer than `size` elements and until their variation factor is below `var_max`. This method modifies the order of input points so as to pack all remaining points first, 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 f845be04e53..ac02dcc3ffd 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 @@ -10,7 +10,7 @@ find_package(CGAL REQUIRED) if (MSVC) if ( CMAKE_SIZEOF_VOID_P EQUAL 4 ) # Allow Windows 32bit applications to use up to 3GB of RAM - SET (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE") endif() # Prints new compilation options message( STATUS "USING DEBUG CXXFLAGS = '${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}'" ) @@ -28,6 +28,7 @@ include(CGAL_TBB_support) # Executables that do *not* require Eigen create_single_source_cgal_program( "read_test.cpp" ) create_single_source_cgal_program( "test_read_write_point_set.cpp" ) +create_single_source_cgal_program( "test_deprecated_io_point_set.cpp" ) create_single_source_cgal_program( "read_test_with_different_pmaps.cpp" ) create_single_source_cgal_program( "analysis_test.cpp" ) create_single_source_cgal_program( "remove_outliers_test.cpp" ) @@ -43,6 +44,7 @@ if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1 include(CGAL_LASLIB_support) if (TARGET CGAL::LASLIB_support) target_link_libraries(test_read_write_point_set PUBLIC ${CGAL_libs} CGAL::LASLIB_support) + target_link_libraries(test_deprecated_io_point_set PUBLIC ${CGAL_libs} CGAL::LASLIB_support) else() message(STATUS "NOTICE : the LAS reader test requires LASlib and will not be compiled.") endif() @@ -52,27 +54,27 @@ endif() # Use Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) if (EIGEN3_FOUND) # Executables that require Eigen create_single_source_cgal_program( "normal_estimation_test.cpp" ) - target_link_libraries(normal_estimation_test PUBLIC CGAL::Eigen_support) + target_link_libraries(normal_estimation_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("hierarchy_simplification_test.cpp") target_link_libraries(hierarchy_simplification_test - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("smoothing_test.cpp") - target_link_libraries(smoothing_test PUBLIC CGAL::Eigen_support) + target_link_libraries(smoothing_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vcm_plane_test.cpp") - target_link_libraries(vcm_plane_test PUBLIC CGAL::Eigen_support) + target_link_libraries(vcm_plane_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vcm_all_test.cpp") - target_link_libraries(vcm_all_test PUBLIC CGAL::Eigen_support) + target_link_libraries(vcm_all_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("jet_pointer_as_property_map.cpp") - target_link_libraries(jet_pointer_as_property_map PUBLIC CGAL::Eigen_support) + target_link_libraries(jet_pointer_as_property_map PUBLIC CGAL::Eigen3_support) else() message( STATUS diff --git a/Point_set_processing_3/test/Point_set_processing_3/remove_outliers_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/remove_outliers_test.cpp index b1f4e52f69f..4f2966d2717 100644 --- a/Point_set_processing_3/test/Point_set_processing_3/remove_outliers_test.cpp +++ b/Point_set_processing_3/test/Point_set_processing_3/remove_outliers_test.cpp @@ -135,7 +135,7 @@ int main(int argc, char * argv[]) struct A{}; std::vector< std::pair > points_bis; points_bis.reserve(points.size()); - for (const Point p : points) + for (const Point& p : points) points_bis.push_back( std::make_pair(p, A()) ); test_avg_knn_sq_distance(points_bis, nb_neighbors_remove_outliers, removed_percentage, CGAL::First_of_pair_property_map>()); diff --git a/Point_set_processing_3/test/Point_set_processing_3/test_deprecated_io_point_set.cpp b/Point_set_processing_3/test/Point_set_processing_3/test_deprecated_io_point_set.cpp new file mode 100644 index 00000000000..6c1be92bcc1 --- /dev/null +++ b/Point_set_processing_3/test/Point_set_processing_3/test_deprecated_io_point_set.cpp @@ -0,0 +1,192 @@ +#include + +#include + +#include +#include +#include + +// Just to try and create ambiguities +#include +#include + +#include + +#include +#include +#include +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef Kernel::Vector_3 Vector_3; +typedef std::array Color; +typedef std::pair PointWithColor; +typedef CGAL::Nth_of_tuple_property_map<1, PointWithColor> Color_map; + +struct GetRedMap{ + typedef PointWithColor key_type; + typedef unsigned short value_type; + typedef const value_type& reference; + typedef boost::lvalue_property_map_tag category; +}; +unsigned short get(const GetRedMap&, const PointWithColor& p) +{ + return p.second[0]; +} + +struct GetGreenMap{ + typedef PointWithColor key_type; + typedef unsigned short value_type; + typedef const value_type& reference; + typedef boost::lvalue_property_map_tag category; +}; +unsigned short get(const GetGreenMap&, const PointWithColor& p) +{ + return p.second[1]; +} + +struct GetBlueMap{ + typedef PointWithColor key_type; + typedef unsigned short value_type; + typedef const value_type& reference; + typedef boost::lvalue_property_map_tag category; +}; +unsigned short get(const GetBlueMap&, const PointWithColor& p) +{ + return p.second[2]; +} + +struct GetAlphaMap{ + typedef PointWithColor key_type; + typedef unsigned short value_type; + typedef const value_type& reference; + typedef boost::lvalue_property_map_tag category; +}; +unsigned short get(const GetAlphaMap&, const PointWithColor& p) +{ + return p.second[3]; +} + +int main() +{ + +std::vector points(3); +points[0] = std::make_pair(Point_3(1,0,0), Color{255,0,0,255}); +points[1] = std::make_pair(Point_3(0,1,0), Color{0,255,0,255}); +points[2] = std::make_pair(Point_3(0,0,1), Color{0,0,255,255}); + + +std::ofstream os; +std::ifstream is; +bool ok; +std::vector ps; +ps.push_back(Point_3(1,0,0)); +ps.push_back(Point_3(0,1,0)); +ps.push_back(Point_3(0,0,1)); +//LAS +#ifdef CGAL_LINKED_WITH_LASLIB +os.open("tmp.las", std::ios::binary); +ok = CGAL::write_las_points_with_properties(os, points, + CGAL::make_las_point_writer(CGAL::First_of_pair_property_map()), + std::make_pair(GetRedMap(),CGAL::LAS_property::R()), + std::make_pair(GetGreenMap(), CGAL::LAS_property::G()), + std::make_pair(GetBlueMap(), CGAL::LAS_property::B()), + std::make_pair(GetAlphaMap(), CGAL::LAS_property::I()) + ); +os.close(); +assert(ok); +points.clear(); +is.open("tmp.las", std::ios::binary); +ok = CGAL::read_las_points_with_properties(is, std::back_inserter (points), + CGAL::make_las_point_reader(CGAL::First_of_pair_property_map()), + std::make_tuple(CGAL::Second_of_pair_property_map(), + CGAL::Construct_array(), + CGAL::LAS_property::R(), + CGAL::LAS_property::G(), + CGAL::LAS_property::B(), + CGAL::LAS_property::I())); +is.close(); +assert(ok); +assert(points.size() == 3); +assert(points[1].second[1] == 255); + +os.open("tmp.las", std::ios_base::binary); +CGAL::write_las_points(os, ps, CGAL::parameters::all_default()); +os.close(); +assert(ok); +ps.clear(); +is.open("tmp.las", std::ios::binary); +ok = CGAL::read_las_points(is, std::back_inserter (ps),CGAL::parameters::all_default()); +is.close(); +assert(ok); +assert(ps.size() == 3); +#endif +//PLY +os.open("tmp.ply"); +ok = CGAL::write_ply_points_with_properties(os, points, + CGAL::make_ply_point_writer (CGAL::First_of_pair_property_map()), + std::make_pair(GetRedMap(),CGAL::PLY_property("red")), + std::make_pair(GetGreenMap(), CGAL::PLY_property("green")), + std::make_pair(GetBlueMap(), CGAL::PLY_property("blue")), + std::make_pair(GetAlphaMap(), CGAL::PLY_property("alpha")) + ); +os.close(); +assert(ok); + +is.open("tmp.ply"); +points.clear(); +ok = CGAL::read_ply_points_with_properties(is, std::back_inserter (points), + CGAL::make_ply_point_reader(CGAL::First_of_pair_property_map()), + std::make_tuple(CGAL::Second_of_pair_property_map(), + CGAL::Construct_array(), + CGAL::PLY_property("red"), + CGAL::PLY_property("green"), + CGAL::PLY_property("blue"), + CGAL::PLY_property("alpha"))); +is.close(); +assert(ok); +assert(points.size() == 3); +assert(points[1].second[1] == 255); + +os.open("tmp.ply"); +ok = CGAL::write_ply_points(os, ps, CGAL::parameters::all_default()); +os.close(); +assert(ok); + +is.open("tmp.ply"); +ps.clear(); +ok = CGAL::read_ply_points(is, std::back_inserter (ps), + CGAL::parameters::all_default()); +is.close(); +assert(ok); +assert(ps.size() == 3); + +//OFF +os.open("tmp.off"); +ok = CGAL::write_off_points(os, ps, CGAL::parameters::all_default()); +os.close(); +assert(ok); + +is.open("tmp.off"); +ps.clear(); +ok = CGAL::read_off_points(is, std::back_inserter (ps), + CGAL::parameters::all_default()); +is.close(); +assert(ok); +assert(ps.size() == 3); + +//XYZ +os.open("tmp.xyz"); +ok = CGAL::write_xyz_points(os, ps, CGAL::parameters::all_default()); +os.close(); +assert(ok); + +is.open("tmp.xyz"); +ps.clear(); +ok = CGAL::read_xyz_points(is, std::back_inserter (ps), + CGAL::parameters::all_default()); +is.close(); +assert(ok); +assert(ps.size() == 3); +} diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt index a2170d5334a..3dc8fba7c0c 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt @@ -31,19 +31,19 @@ endif() # Find Eigen3 (requires 3.1.0 or greater) find_package(Eigen3 3.1.0) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) # Executables that require Eigen 3 create_single_source_cgal_program("poisson_reconstruction_example.cpp") target_link_libraries(poisson_reconstruction_example - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("poisson_reconstruction.cpp") - target_link_libraries(poisson_reconstruction PUBLIC CGAL::Eigen_support) + target_link_libraries(poisson_reconstruction PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("poisson_reconstruction_function.cpp") target_link_libraries(poisson_reconstruction_function - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("tutorial_example.cpp") - target_link_libraries(tutorial_example PUBLIC CGAL::Eigen_support) + target_link_libraries(tutorial_example PUBLIC CGAL::Eigen3_support) else() message( STATUS diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_mesh_cell_criteria_3.h b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_mesh_cell_criteria_3.h index 74d507927ea..4c78d772ce5 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_mesh_cell_criteria_3.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_mesh_cell_criteria_3.h @@ -27,15 +27,16 @@ namespace Poisson { template class Constant_sizing_field { - double sq_radius_bound; + typedef typename Tr::FT FT; + FT sq_radius_bound; public: - double cell_radius_bound() const { return CGAL::sqrt(sq_radius_bound); } + FT cell_radius_bound() const { return CGAL::approximate_sqrt(sq_radius_bound); } - Constant_sizing_field(double sq_radius_bound = 0.) + Constant_sizing_field(FT sq_radius_bound = 0.) : sq_radius_bound(sq_radius_bound) {} template - double operator()(const Point&) const { return sq_radius_bound; } + FT operator()(const Point&) const { return sq_radius_bound; } }; // end class Constant_sizing_field } // end namespace Poisson 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 80e3a9d10ff..7fb5c3e68f3 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h @@ -110,18 +110,19 @@ struct Poisson_visitor { // The wrapper stores only pointers to the two functors. template struct Special_wrapper_of_two_functions_keep_pointers { + typedef typename F2::FT FT; F1 *f1; F2 *f2; Special_wrapper_of_two_functions_keep_pointers(F1* f1, F2* f2) : f1(f1), f2(f2) {} template - double operator()(const X& x) const { + FT operator()(const X& x) const { return (std::max)((*f1)(x), CGAL::square((*f2)(x))); } template - double operator()(const X& x) { + FT operator()(const X& x) { return (std::max)((*f1)(x), CGAL::square((*f2)(x))); } }; // end struct Special_wrapper_of_two_functions_keep_pointers @@ -211,7 +212,7 @@ private: { private: std::atomic m_state; - std::array m_bary; + std::array m_bary; public: Cached_bary_coord() : m_state (UNINITIALIZED) { } @@ -242,8 +243,8 @@ private: void set_initialized() { m_state = INITIALIZED; } - const double& operator[] (const std::size_t& idx) const { return m_bary[idx]; } - double& operator[] (const std::size_t& idx) { return m_bary[idx]; } + const FT& operator[] (const std::size_t& idx) const { return m_bary[idx]; } + FT& operator[] (const std::size_t& idx) { return m_bary[idx]; } }; // Wrapper for thread safety of maintained cell hint for fast diff --git a/Poisson_surface_reconstruction_3/include/CGAL/poisson_surface_reconstruction.h b/Poisson_surface_reconstruction_3/include/CGAL/poisson_surface_reconstruction.h index dddb6759fe7..3a79d458803 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/poisson_surface_reconstruction.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/poisson_surface_reconstruction.h @@ -94,9 +94,10 @@ namespace CGAL { typedef typename boost::property_traits::value_type Point; typedef typename Kernel_traits::Kernel Kernel; typedef typename Kernel::Sphere_3 Sphere; + typedef typename Kernel::FT FT; typedef CGAL::Poisson_reconstruction_function Poisson_reconstruction_function; - typedef CGAL::Surface_mesh_default_triangulation_3 STr; + typedef typename CGAL::Surface_mesher::Surface_mesh_default_triangulation_3_generator::Type STr; typedef CGAL::Surface_mesh_complex_2_in_triangulation_3 C2t3; typedef CGAL::Implicit_surface_3 Surface_3; @@ -106,10 +107,10 @@ namespace CGAL { Point inner_point = function.get_inner_point(); Sphere bsphere = function.bounding_sphere(); - double radius = std::sqrt(bsphere.squared_radius()); + FT radius = CGAL::approximate_sqrt(bsphere.squared_radius()); - double sm_sphere_radius = 5.0 * radius; - double sm_dichotomy_error = sm_distance * spacing / 1000.0; + FT sm_sphere_radius = 5.0 * radius; + FT sm_dichotomy_error = sm_distance * spacing / 1000.0; Surface_3 surface(function, Sphere (inner_point, sm_sphere_radius * sm_sphere_radius), diff --git a/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt b/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt index d65ecb7d1f0..6391989b028 100644 --- a/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt +++ b/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt @@ -30,16 +30,16 @@ if(MSVC) endif() # Temporary debugging stuff find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) - include(CGAL_Eigen_support) - if(TARGET CGAL::Eigen_support) + include(CGAL_Eigen3_support) + if(TARGET CGAL::Eigen3_support) # Executables that require Eigen 3.1 create_single_source_cgal_program("poisson_reconstruction_test.cpp") - target_link_libraries(poisson_reconstruction_test PUBLIC CGAL::Eigen_support) + target_link_libraries(poisson_reconstruction_test PUBLIC CGAL::Eigen3_support) find_package(TBB) include(CGAL_TBB_support) if (TBB_FOUND) create_single_source_cgal_program( "poisson_and_parallel_mesh_3.cpp" ) - target_link_libraries(poisson_and_parallel_mesh_3 PUBLIC CGAL::Eigen_support CGAL::TBB_support) + target_link_libraries(poisson_and_parallel_mesh_3 PUBLIC CGAL::Eigen3_support CGAL::TBB_support) else() message(STATUS "NOTICE: test with parallel Mesh_3 needs TBB and will not be compiled.") endif() diff --git a/Polygon/include/CGAL/Polygon_2/Polygon_2_algorithms_impl.h b/Polygon/include/CGAL/Polygon_2/Polygon_2_algorithms_impl.h index 431fa2effa0..8338ce335a2 100644 --- a/Polygon/include/CGAL/Polygon_2/Polygon_2_algorithms_impl.h +++ b/Polygon/include/CGAL/Polygon_2/Polygon_2_algorithms_impl.h @@ -519,7 +519,7 @@ Orientation orientation_2(ForwardIterator first, if (next == last) next = first; - // if the range [first,last) contains less than three points, then some + // if the range [first,last) contains fewer than three points, then some // of the points (prev,i,next) will coincide // return the orientation of the triple (prev,i,next) diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 0f75db09b7c..60522c9263d 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -38,7 +38,7 @@ void draw(const P& ap); #endif #ifdef CGAL_USE_BASIC_VIEWER - +#include #include #include @@ -122,6 +122,7 @@ void draw(const CGAL::Polygon_2& ap2, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc=1; const char* argv[2]={"t2_viewer","\0"}; QApplication app(argc,const_cast(argv)); diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 35f98928c7e..0781eb883f7 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -37,7 +37,7 @@ void draw(const PH& aph); #endif #ifdef CGAL_USE_BASIC_VIEWER - +#include #include #include @@ -138,6 +138,7 @@ void draw(const CGAL::Polygon_with_holes_2& ap2, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc=1; const char* argv[2]={"t2_viewer","\0"}; QApplication app(argc,const_cast(argv)); diff --git a/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt index 53d53411877..14e0810f8f8 100644 --- a/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt @@ -23,7 +23,7 @@ endif() # include for local package find_package(Eigen3 REQUIRED 3.2.0) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) # Creating entries for all .cpp/.C files with "main" routine # ########################################################## @@ -43,7 +43,7 @@ if (FAST_ENVELOPE_BUILD_DIR) endif() create_single_source_cgal_program( "fastE.cpp" ) - target_link_libraries( fastE PUBLIC CGAL::Eigen_support) + target_link_libraries( fastE PUBLIC CGAL::Eigen3_support) target_link_libraries( fastE PUBLIC FastEnvelope IndirectPredicates geogram) else() @@ -54,6 +54,6 @@ create_single_source_cgal_program( "fast.cpp" ) create_single_source_cgal_program("polygon_mesh_slicer.cpp") -if(TARGET CGAL::Eigen_support) - target_link_libraries(polygon_mesh_slicer PUBLIC CGAL::Eigen_support) +if(TARGET CGAL::Eigen3_support) + target_link_libraries(polygon_mesh_slicer PUBLIC CGAL::Eigen3_support) endif() 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 7d95997ff80..cd2e6ebf2eb 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h @@ -3,20 +3,21 @@ /// /// The concept `PMPCorefinementVisitor` defines the requirements for the visitor /// used in \link PMP_corefinement_grp corefinement-related functions \endlink to track -/// the creation of new faces. +/// the creation of new faces and new edges. /// /// \cgalRefines `CopyConstructible` /// \cgalHasModel `CGAL::Polygon_mesh_processing::Corefinement::Default_visitor`. - class PMPCorefinementVisitor{ public: /// Mesh type typedef unspecified_type Triangle_mesh; -/// Face decriptor type +/// Face descriptor type typedef unspecified_type face_descriptor; +/// Halfedge descriptor type +typedef unspecified_type halfedge_descriptor; -/// @name Functions used by corefine() +/// @name Functions used by corefine() when faces are split /// @{ /// called before the triangulation of `f_split` in `tm`. Note that `f_split` /// will be one of the faces of the triangulation. Each subsequent call to @@ -32,6 +33,20 @@ typedef unspecified_type face_descriptor; void after_subface_created(face_descriptor f_new, Triangle_mesh& tm); /// @} +/// @name Functions used by corefine() when edges are split +/// @{ + /// called before the edge of `h` in `tm` is split. Each subsequent call to + /// `edge_split()` until the call to `after_edge_split()` will correspond to + /// the split of that edge. If `edge_split(h_i, tm)` is called for `i=1` to `n`, + /// `h_1`, `h_2`, ... ,`h_n`, `h` is the sequence of halfedges representing the + /// edge split (with the same initial orientation) + void before_edge_split(halfedge_descriptor h, TriangleMesh& tm); + /// called when a new split is done. The target of `hnew` is a new split vertex. + void edge_split(halfedge_descriptor hnew, TriangleMesh& tm); + /// called when the split of the halfedge `h` passed at the later call to `before_edge_split()` is finished. + void after_edge_split(); +/// @} + /// @name Functions used by Boolean operations functions using corefinement. /// These functions are not needed if you only call `corefine()`. /// @{ diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt index 6c19cbdbb15..699614c41d0 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt @@ -22,6 +22,7 @@ \example Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp \example Polygon_mesh_processing/corefinement_difference_remeshed.cpp \example Polygon_mesh_processing/corefinement_mesh_union.cpp +\example Polygon_mesh_processing/corefinement_OM_union.cpp \example Polygon_mesh_processing/corefinement_mesh_union_and_intersection.cpp \example Polygon_mesh_processing/corefinement_consecutive_bool_op.cpp \example Polygon_mesh_processing/detect_features_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 5601ede5b0a..f979cf8cad3 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -31,26 +31,26 @@ endif() # include for local package find_package(Eigen3 3.2.0) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) # Creating entries for all .cpp/.C files with "main" routine # ########################################################## create_single_source_cgal_program("hausdorff_distance_remeshing_example.cpp") -if(TARGET CGAL::Eigen_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("hole_filling_example.cpp") - target_link_libraries(hole_filling_example PUBLIC CGAL::Eigen_support) + target_link_libraries(hole_filling_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("hole_filling_example_SM.cpp") - target_link_libraries(hole_filling_example_SM PUBLIC CGAL::Eigen_support) + target_link_libraries(hole_filling_example_SM PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("refine_fair_example.cpp") - target_link_libraries(refine_fair_example PUBLIC CGAL::Eigen_support) + target_link_libraries(refine_fair_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("shape_smoothing_example.cpp") - target_link_libraries(shape_smoothing_example PUBLIC CGAL::Eigen_support) + target_link_libraries(shape_smoothing_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("hole_filling_example_LCC.cpp") - target_link_libraries(hole_filling_example_LCC PUBLIC CGAL::Eigen_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::Eigen_support) + target_link_libraries(mesh_smoothing_example PUBLIC CGAL::Eigen3_support) endif() create_single_source_cgal_program( "polyhedral_envelope.cpp" ) @@ -97,9 +97,13 @@ if(OpenMesh_FOUND) target_link_libraries(compute_normals_example_OM PRIVATE ${OPENMESH_LIBRARIES}) - if(TARGET CGAL::Eigen_support) + create_single_source_cgal_program("corefinement_OM_union.cpp") + target_link_libraries(corefinement_OM_union + PRIVATE ${OPENMESH_LIBRARIES}) + + if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("hole_filling_example_OM.cpp") - target_link_libraries(hole_filling_example_OM PRIVATE CGAL::Eigen_support + target_link_libraries(hole_filling_example_OM PRIVATE CGAL::Eigen3_support ${OPENMESH_LIBRARIES}) endif() @@ -123,6 +127,9 @@ 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) + + create_single_source_cgal_program("corefinement_parallel_union_meshes.cpp") + target_link_libraries(corefinement_parallel_union_meshes PUBLIC CGAL::TBB_support) else() message( STATUS "NOTICE: Intel TBB was not found. Sequential code will be used.") diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/connected_components_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/connected_components_example.cpp index a415c924f76..b0dd145c427 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/connected_components_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/connected_components_example.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_OM_union.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_OM_union.cpp new file mode 100644 index 00000000000..fd858fd1341 --- /dev/null +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_OM_union.cpp @@ -0,0 +1,102 @@ +#include +#include +#include +#include + +#include + +#include + +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; // default kernel for OpenMesh point type +typedef CGAL::Exact_predicates_exact_constructions_kernel EK; // alternatice kernel we want to use +typedef OpenMesh::PolyMesh_ArrayKernelT< > Mesh; + + +typedef boost::property_map >::type Exact_point_map; + +struct Exact_vertex_point_map +{ + // typedef for the property map + typedef boost::property_traits::value_type value_type; + typedef boost::property_traits::reference reference; + typedef boost::property_traits::category category; + typedef boost::property_traits::key_type key_type; + + // exterior references + Exact_point_map exact_point_map; + Mesh* tm_ptr; + + // Converters + CGAL::Cartesian_converter to_exact; + CGAL::Cartesian_converter to_input; + + Exact_vertex_point_map() + : tm_ptr(nullptr) + {} + + Exact_vertex_point_map(const Exact_point_map& ep, Mesh& tm) + : exact_point_map(ep) + , tm_ptr(&tm) + { + for (key_type v : vertices(tm)) + put(exact_point_map, v, to_exact(get(boost::vertex_point, tm, v))); + } + + friend + reference get(const Exact_vertex_point_map& map, key_type k) + { + CGAL_precondition(map.tm_ptr!=nullptr); + return get(map.exact_point_map, k); + } + + friend + void put(const Exact_vertex_point_map& map, key_type k, const EK::Point_3& p) + { + CGAL_precondition(map.tm_ptr!=nullptr); + put(map.exact_point_map, k, p); + // create the input point from the exact one + put(boost::vertex_point, *map.tm_ptr, k, map.to_input(p)); + } +}; + +namespace PMP = CGAL::Polygon_mesh_processing; + +int main(int argc, char* argv[]) +{ + const char* filename1 = (argc > 1) ? argv[1] : "data/blobby.off"; + const char* filename2 = (argc > 2) ? argv[2] : "data/eight.off"; + + Mesh mesh1, mesh2; + + OpenMesh::IO::read_mesh(mesh1, filename1); + OpenMesh::IO::read_mesh(mesh2, filename2); + + Mesh out; + + // Create exact map properties + Exact_point_map pm_1 = get(CGAL::dynamic_vertex_property_t(), mesh1); + Exact_point_map pm_2 = get(CGAL::dynamic_vertex_property_t(), mesh2); + Exact_point_map pm_out = get(CGAL::dynamic_vertex_property_t(), out); + + // Create exact vertex point map that will provide the point to another kernel and fill the default map + Exact_vertex_point_map vpm_1(pm_1, mesh1); + Exact_vertex_point_map vpm_2(pm_2, mesh2); + Exact_vertex_point_map vpm_out(pm_out, out); + + bool valid_union = PMP::corefine_and_compute_union(mesh1, mesh2, out, + CGAL::parameters::vertex_point_map(vpm_1), + CGAL::parameters::vertex_point_map(vpm_2), + CGAL::parameters::vertex_point_map(vpm_out)); + + if (valid_union) + { + std::cout << "Union was successfully computed\n"; + OpenMesh::IO::write_mesh(out, "union.off"); + return 0; + } + std::cout << "Union could not be computed\n"; + return 1; +} diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_consecutive_bool_op.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_consecutive_bool_op.cpp index ebd86cda4ac..5c70a466b34 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_consecutive_bool_op.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_consecutive_bool_op.cpp @@ -8,14 +8,11 @@ #include #include -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; -typedef CGAL::Exact_predicates_exact_constructions_kernel EK; - -typedef CGAL::Surface_mesh Mesh; -typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - -typedef Mesh::Property_map Exact_point_map; -typedef Mesh::Property_map Exact_point_computed; +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Exact_predicates_exact_constructions_kernel EK; +typedef CGAL::Surface_mesh Mesh; +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef Mesh::Property_map Exact_point_map; namespace PMP = CGAL::Polygon_mesh_processing; namespace params = PMP::parameters; diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_parallel_union_meshes.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_parallel_union_meshes.cpp new file mode 100644 index 00000000000..0e5c68282da --- /dev/null +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_parallel_union_meshes.cpp @@ -0,0 +1,53 @@ +#include +#include +#include + +#include +#include + +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh Mesh; + +namespace PMP = CGAL::Polygon_mesh_processing; + +int main(int argc, char** argv) +{ + std::ifstream in(argc>1?argv[1]:"data/eight.off"); + int nb_copies = argc > 2 ? atoi(argv[2]) : 100; + if (nb_copies<=0) return 1; + std::vector meshes(nb_copies); + in >> meshes[0]; + for (int i=1; i trans(CGAL::Translation(), Kernel::Vector_3(i*0.2, 0, 0)); + meshes[i]=meshes[0]; + PMP::transform(trans, meshes[i]); + } + + // lambda function used to do the union of two meshes: + // we join the left part of the mesh vector with the right part + // as the right part will be discarded by the resize in the while loop + auto f = [&meshes](const tbb::blocked_range& range) + { + for( std::size_t k = range.begin(); k != range.end(); ++k) + { + PMP::corefine_and_compute_union(meshes[k], meshes[meshes.size() - k - 1], meshes[k]); + } + }; + + // do the union of meshes in parallel + while (meshes.size()>1) + { + tbb::parallel_for(tbb::blocked_range(0, meshes.size()/2), f); + meshes.resize((meshes.size() + 1) / 2); + } + + std::ofstream out("multiple_union.off"); + out << std::setprecision(17) << meshes[0]; + + return 0; +} diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_example.cpp index de6491e0cbc..c5811a87d2b 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_example.cpp @@ -5,7 +5,7 @@ #include #include -#include +#include #include #include diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_of_patch_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_of_patch_example.cpp index b3a1395b2f7..fa67dc57d25 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_of_patch_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_of_patch_example.cpp @@ -5,7 +5,7 @@ #include #include -#include +#include #include #include 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 new file mode 100644 index 00000000000..419e330011e --- /dev/null +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Non_manifold_feature_map.h @@ -0,0 +1,104 @@ +// Copyright (c) 2019 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_NON_MANIFOLD_FEATURE_MAP +#define CGAL_POLYGON_MESH_PROCESSING_NON_MANIFOLD_FEATURE_MAP + +namespace CGAL { +namespace Polygon_mesh_processing { + +//TODO: right now the base name parameter mechanism will make a deep copy, we probably want to avoid that +template +struct Non_manifold_feature_map +{ + typedef boost::graph_traits Graph_traits; + typedef typename Graph_traits::vertex_descriptor vertex_descriptor; + typedef typename Graph_traits::edge_descriptor edge_descriptor; + typedef typename Graph_traits::halfedge_descriptor halfedge_descriptor; + typedef 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; + Edge_to_nm_id e_nm_id; + Vertex_to_nm_id v_nm_id; + std::vector< std::vector > non_manifold_edges; + std::vector< std::vector > non_manifold_vertices; + + Non_manifold_feature_map() + {} + + template + Non_manifold_feature_map(PolygonMesh& pm, Vpm vpm) + : e_nm_id(get(Edge_to_id_tag(), pm)) + , v_nm_id(get(Vertex_to_id_tag(), pm)) + { + typedef typename boost::property_traits::value_type Point_3; + + // detect non-manifold vertices + std::map > vertex_map; + for(vertex_descriptor vd : vertices(pm)) + { + put(v_nm_id, vd, std::size_t(-1)); // init map + vertex_map[get(vpm, vd)].push_back(vd); + } + + for(std::pair< const Point_3, + std::vector >& p : vertex_map) + { + if (p.second.size()!=1) + { + for (vertex_descriptor vd : p.second) + put(v_nm_id, vd, non_manifold_vertices.size()); + non_manifold_vertices.resize(non_manifold_vertices.size()+1); + // we steal the vertor from the map + p.second.swap(non_manifold_vertices.back()); + } + } + + // detect non-manifold edges + std::map< std::pair, std::vector > edge_map; + for(edge_descriptor ed : edges(pm)) + { + put(e_nm_id, ed, std::size_t(-1)); // init map + + halfedge_descriptor hd = halfedge(ed, pm); + + // an edge can be non-manifold only if both its vertices are non-manifold + if ( get(v_nm_id, source(hd, pm))==std::size_t(-1) || + get(v_nm_id, target(hd, pm))==std::size_t(-1) ) continue; + + const Point_3& src = get(vpm, source(ed, pm)); + const Point_3& tgt = get(vpm, target(ed, pm)); + // TODO: what to do with null edges? + if (src > tgt) + hd = opposite(hd, pm); + edge_map[ make_sorted_pair(src, tgt) ].push_back(edge(hd,pm)); + } + + for(std::pair< const std::pair, + std::vector >& p : edge_map) + { + if (p.second.size()!=1) + { + for (edge_descriptor ed : p.second) + put(e_nm_id, ed, non_manifold_edges.size()); + non_manifold_edges.resize(non_manifold_edges.size()+1); + // we steal the vertor from the map + p.second.swap(non_manifold_edges.back()); + } + } + } +}; + +} } // end of CGAL::Polygon_mesh_processing + +#endif 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 4b43e6f3bbf..5fd919df74d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h @@ -41,6 +41,7 @@ #include #include #include +#include namespace CGAL{ namespace Polygon_mesh_processing { @@ -48,24 +49,6 @@ namespace Polygon_mesh_processing { namespace internal { -template -int -inter_pt_index(int i, int j, - const Plane_3& plane, - std::vector& points, - std::map, int>& id_map) -{ - std::pair, int>::iterator, bool> res = - id_map.insert(std::make_pair(make_sorted_pair(i,j), - static_cast (points.size()))); - if(res.second) - points.push_back( - typename Geom_traits::Construct_plane_line_intersection_point_3() - (plane, points[i], points[j])); - - return res.first->second; -} - template @@ -106,19 +89,42 @@ clip_to_bbox(const Plane_3& plane, }}; // description of faces of the bbox - std::array face_indices = - {{ 0, 1, 2, 3, - 2, 1, 5, 6, - 3, 2, 6, 7, - 1, 0, 4, 5, - 4, 0, 3, 7, - 6, 5, 4, 7 }}; + constexpr std::array face_indices + { { 0, 1, 2, 3, + 2, 1, 5, 6, + 3, 2, 6, 7, + 1, 0, 4, 5, + 4, 0, 3, 7, + 6, 5, 4, 7 } }; + + constexpr std::array edge_indices + { { 0, 1, 2, 3, + 1, 4, 5, 6, + 2, 6, 7, 8, + 0, 9, 10, 4, + 9, 3, 8, 11, + 5, 10, 11, 7 } }; + + std::array edge_ipt_id; + edge_ipt_id.fill(-1); + + auto inter_pt_index = + [&plane, &corners, &edge_ipt_id](int i, int j, int edge_id) + { + if (edge_ipt_id[edge_id]==-1) + { + edge_ipt_id[edge_id] = static_cast (corners.size()); + corners.push_back(typename Geom_traits::Construct_plane_line_intersection_point_3() + (plane, corners[i], corners[j])); + } + + return edge_ipt_id[edge_id]; + }; - std::map, int> id_map; std::vector< std::vector > output_faces(6); bool all_in = true; bool all_out = true; - std::set in_point_ids; // to collect the set of points in the clipped bbox + std::bitset<14> in_point_bits; // to collect the set of points in the clipped bbox // for each face of the bbox, we look for intersection of the plane with its edges for(int i=0; i<6; ++i) @@ -127,6 +133,7 @@ clip_to_bbox(const Plane_3& plane, { int current_id = face_indices[4*i + k]; int next_id = face_indices[4*i + (k+1)%4]; + int edge_id = edge_indices[4 * i + k]; switch(orientations[ current_id ]) { @@ -135,13 +142,13 @@ clip_to_bbox(const Plane_3& plane, all_out=false; // point on or on the negative side output_faces[i].push_back(current_id); - in_point_ids.insert(output_faces[i].back()); + in_point_bits.set(output_faces[i].back()); // check for intersection of the edge if(orientations[ next_id ] == ON_POSITIVE_SIDE) { output_faces[i].push_back( - inter_pt_index(current_id, next_id, plane, corners, id_map)); - in_point_ids.insert(output_faces[i].back()); + inter_pt_index(current_id, next_id, edge_id)); + in_point_bits.set(output_faces[i].back()); } break; } @@ -152,15 +159,15 @@ clip_to_bbox(const Plane_3& plane, if(orientations[ next_id ] == ON_NEGATIVE_SIDE) { output_faces[i].push_back( - inter_pt_index(current_id, next_id, plane, corners, id_map)); - in_point_ids.insert(output_faces[i].back()); + inter_pt_index(current_id, next_id, edge_id)); + in_point_bits.set(output_faces[i].back()); } break; } case ON_ORIENTED_BOUNDARY: { output_faces[i].push_back(current_id); - in_point_ids.insert(output_faces[i].back()); + in_point_bits.set(output_faces[i].back()); } } } @@ -182,11 +189,14 @@ clip_to_bbox(const Plane_3& plane, typedef typename graph_traits::face_descriptor face_descriptor; std::map out_vertices; - for(int i : in_point_ids) + for(int i=0; i<14;++i) { - vertex_descriptor v = add_vertex(tm_out); - out_vertices.insert(std::make_pair(i, v)); - put(vpm_out, v, corners[i]); + if (in_point_bits.test(i)) + { + vertex_descriptor v = add_vertex(tm_out); + out_vertices.insert(std::make_pair(i, v)); + put(vpm_out, v, corners[i]); + } } std::map< std::pair, halfedge_descriptor> hedge_map; 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 e34c951e4ea..14a84753f10 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h @@ -779,15 +779,24 @@ corefine( TriangleMesh& tm1, > ::type User_visitor; User_visitor uv(choose_parameter(get_parameter(np1, internal_np::visitor))); + static const bool handle_non_manifold_features = + !parameters::Is_default::value || + !parameters::Is_default::value; + // surface intersection algorithm call typedef Corefinement::No_extra_output_from_corefinement Ob; typedef Corefinement::Surface_intersection_visitor_for_corefinement< - TriangleMesh, VPM1, VPM2, Ob, Ecm, User_visitor> Algo_visitor; + TriangleMesh, VPM1, VPM2, Ob, Ecm, User_visitor, false, handle_non_manifold_features> Algo_visitor; Ob ob; Ecm ecm(tm1,tm2,ecm1,ecm2); Corefinement::Intersection_of_triangle_meshes functor(tm1, tm2, vpm1, vpm2, Algo_visitor(uv,ob,ecm,const_mesh_ptr)); + + // Fill non-manifold feature maps if provided + functor.set_non_manifold_feature_map_1(parameters::get_parameter(np1, internal_np::non_manifold_feature_map)); + functor.set_non_manifold_feature_map_2(parameters::get_parameter(np2, internal_np::non_manifold_feature_map)); + functor(CGAL::Emptyset_iterator(), throw_on_self_intersection, true); } 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 6f57675de59..07268ec93ed 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 @@ -26,6 +26,7 @@ #include #include +#include // required to handle the multiple types of edge constrained maps // for the different output types. CGAL_COREF_FUNCTION_CALL_DEF @@ -57,13 +58,72 @@ enum Boolean_operation_type {UNION = 0, INTERSECTION, namespace PMP=Polygon_mesh_processing; namespace params=PMP::parameters; +// extra functions for handling non-documented functions for user visitors +// with no extra functions +BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Has_extra_functions, + Has_extra_functions, + false) + +template +void export_flags(UserVisitor&, boost::mpl::bool_, + FaceIndexMap, const std::vector&, + const boost::dynamic_bitset<>&, + const boost::dynamic_bitset<>&, + const boost::dynamic_bitset<>&, + const boost::dynamic_bitset<>&, + TriangleMesh&) +{} + +template +void register_halfedge_pair(UserVisitor&, boost::mpl::bool_, + halfedge_descriptor, halfedge_descriptor, + bool, bool, + bool, bool, + bool=false, bool=false, + bool=false, bool=false) +{} + +// with extra functions (forward the call to the visitor) +template +void export_flags(UserVisitor& visitor, boost::mpl::bool_, + FaceIndexMap fim, const std::vector& tm_patch_ids, + const boost::dynamic_bitset<>& is_patch_inside_other_tm, + const boost::dynamic_bitset<>& coplanar_patches, + const boost::dynamic_bitset<>& coplanar_patches_of_tm_for_union_and_intersection, + const boost::dynamic_bitset<>& patch_status_not_set, + TriangleMesh& tm) +{ + visitor.export_flags(fim, tm_patch_ids, + is_patch_inside_other_tm, + coplanar_patches, + coplanar_patches_of_tm_for_union_and_intersection, + patch_status_not_set, + tm); +} + +template +void register_halfedge_pair(UserVisitor& visitor, boost::mpl::bool_, + halfedge_descriptor h1, halfedge_descriptor h2, + bool q1_is_between_p1p2, bool q2_is_between_p1p2, + bool p1_is_between_q1q2, bool p2_is_between_q1q2, + bool p1_is_coplanar=false, bool p2_is_coplanar=false, + bool q1_is_coplanar=false, bool q2_is_coplanar=false) +{ + visitor.register_halfedge_pair(h1, h2, + q1_is_between_p1p2, q2_is_between_p1p2, + p1_is_between_q1q2, p2_is_between_q1q2, + p1_is_coplanar, p2_is_coplanar, + q1_is_coplanar, q2_is_coplanar); +} + + template @@ -86,6 +146,7 @@ class Face_graph_output_builder No_mark > >::type EdgeMarkMapTuple; typedef typename Default::Get< UserVisitor_, Default_visitor >::type UserVisitor; + typedef typename Has_extra_functions::type VUNDF; //shortcut // graph_traits typedefs typedef TriangleMesh TM; @@ -458,8 +519,15 @@ public: const boost::dynamic_bitset<>& is_node_of_degree_one, const Mesh_to_map_node&) { - CGAL_assertion( vertex_to_node_id1.size() == vertex_to_node_id2.size()); - CGAL_assertion( vertex_to_node_id1.size() == nodes.size()); + 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; + + CGAL_assertion( vertex_to_node_id1.size() <= nodes.size() ); + CGAL_assertion( vertex_to_node_id2.size() <= nodes.size() ); + CGAL_assertion(used_to_classify_patches || vertex_to_node_id1.size() == vertex_to_node_id2.size()); + CGAL_assertion(used_to_classify_patches || vertex_to_node_id1.size() == nodes.size()); Intersection_edge_map& intersection_edges1 = mesh_to_intersection_edges[&tm1]; Intersection_edge_map& intersection_edges2 = mesh_to_intersection_edges[&tm2]; @@ -479,10 +547,6 @@ public: } CGAL_assertion(BGL::internal::is_index_map_valid(fids2, num_faces(tm2), faces(tm2))); - // bitset to identify coplanar faces - boost::dynamic_bitset<> tm1_coplanar_faces(num_faces(tm1), 0); - boost::dynamic_bitset<> tm2_coplanar_faces(num_faces(tm2), 0); - // In the following loop we filter intersection edges that are strictly inside a patch // of coplanar facets so that we keep only the edges on the border of the patch. // This is not optimal and in an ideal world being able to find the outside edges @@ -495,11 +559,21 @@ public: : epp_it_end; boost::unordered_set inter_edges_to_remove1, inter_edges_to_remove2; + + // Each vector contains a subset of coplanar faces. More particularly only + // the coplanar faces incident to an intersection edge. Note + // that for coplanar faces, intersection edges are on the input + // edges and some coplanar faces might not be seen as they are + // the result of the retriangulation. + std::vector tm1_coplanar_faces, tm2_coplanar_faces; + for (;epp_it!=epp_it_end;) { halfedge_descriptor h1 = epp_it->second.first[&tm1]; + CGAL_assertion( h1 != GT::null_halfedge()); halfedge_descriptor h1_opp = opposite(h1, tm1); halfedge_descriptor h2 = epp_it->second.first[&tm2]; + CGAL_assertion( h2 != GT::null_halfedge()); halfedge_descriptor h2_opp = opposite(h2, tm2); //vertices from tm1 @@ -514,7 +588,7 @@ public: Node_id index_q2 = get_node_id(q2, vertex_to_node_id2); // set boolean for the position of p1 wrt to q1 and q2 - bool p1_eq_q1=is_border(h1_opp, tm1), p1_eq_q2=p1_eq_q1; + bool p1_eq_q1 = false, p1_eq_q2 = false; if (!is_border(h1_opp, tm1) && index_p1!=NID) { if (!is_border(h2_opp, tm2)) @@ -523,8 +597,8 @@ public: if (p1_eq_q1) { //mark coplanar facets if any - tm1_coplanar_faces.set(get(fids1, face(h1_opp, tm1))); - tm2_coplanar_faces.set(get(fids2, face(h2_opp, tm2))); + tm1_coplanar_faces.push_back(face(h1_opp, tm1)); + tm2_coplanar_faces.push_back(face(h2_opp, tm2)); } } if (!is_border(h2, tm2)) @@ -533,14 +607,14 @@ public: if (p1_eq_q2) { //mark coplanar facets if any - tm1_coplanar_faces.set(get(fids1, face(h1_opp, tm1))); - tm2_coplanar_faces.set(get(fids2, face(h2, tm2))); + tm1_coplanar_faces.push_back(face(h1_opp, tm1)); + tm2_coplanar_faces.push_back(face(h2, tm2)); } } } // set boolean for the position of p2 wrt to q1 and q2 - bool p2_eq_q1=is_border(h1, tm1), p2_eq_q2=p2_eq_q1; + bool p2_eq_q1 = false, p2_eq_q2 = false; if (!is_border(h1, tm1) && index_p2!=NID) { if (!is_border(h2_opp, tm2)) @@ -548,8 +622,8 @@ public: p2_eq_q1 = index_p2 == index_q1; if (p2_eq_q1){ //mark coplanar facets if any - tm1_coplanar_faces.set(get(fids1, face(h1, tm1))); - tm2_coplanar_faces.set(get(fids2, face(h2_opp, tm2))); + tm1_coplanar_faces.push_back(face(h1, tm1)); + tm2_coplanar_faces.push_back(face(h2_opp, tm2)); } } if (!is_border(h2, tm2)) @@ -557,8 +631,8 @@ public: p2_eq_q2 = index_p2 == index_q2; if (p2_eq_q2){ //mark coplanar facets if any - tm1_coplanar_faces.set(get(fids1, face(h1, tm1))); - tm2_coplanar_faces.set(get(fids2, face(h2, tm2))); + tm1_coplanar_faces.push_back(face(h1, tm1)); + tm2_coplanar_faces.push_back(face(h2, tm2)); } } } @@ -671,6 +745,21 @@ public: patch_status_not_set_tm1.set(); patch_status_not_set_tm2.set(); + // first set coplanar status of patches using the coplanar faces collected during the + // extra intersection edges collected. This is important in the case of full connected components + // being coplanar. They have no intersection edges (closed cc) or only intersection edges on the + // boundary (non-closed cc) + for (face_descriptor f1 : tm1_coplanar_faces) + { + std::size_t fid1 = get(fids1, f1); + coplanar_patches_of_tm1.set(tm1_patch_ids[ fid1 ]); + } + for (face_descriptor f2 : tm2_coplanar_faces) + { + std::size_t fid2 = get(fids2, f2); + coplanar_patches_of_tm2.set(tm2_patch_ids[ fid2 ]); + } + for (typename An_edge_per_polyline_map::iterator it=an_edge_per_polyline.begin(), it_end=an_edge_per_polyline.end(); it!=it_end;++it) @@ -703,38 +792,82 @@ public: if ( is_border(h1,tm1) != is_border(h2,tm2) ) { //No restriction at this level - std::size_t patch_id1 = - tm1_patch_ids[ get( fids1, is_border(h1,tm1) - ? face(opposite(h1,tm1),tm1) - : face(h1,tm1)) ]; - std::size_t patch_id2 = - tm2_patch_ids[ get( fids2, is_border(h2,tm2) - ? face(opposite(h2,tm2),tm2) - : face(h2,tm2)) ]; - patch_status_not_set_tm1.reset(patch_id1); - patch_status_not_set_tm2.reset(patch_id2); + std::size_t fid1 = + get(fids1, is_border(h1,tm1) ? face(opposite(h1,tm1),tm1) + : face(h1,tm1)); + std::size_t fid2 = + get(fids2, is_border(h2,tm2) ? face(opposite(h2,tm2),tm2) + : face(h2,tm2)); + std::size_t patch_id_p=tm1_patch_ids[ fid1 ]; + std::size_t patch_id_q=tm2_patch_ids[ fid2 ]; + + patch_status_not_set_tm1.reset(patch_id_p); + patch_status_not_set_tm2.reset(patch_id_q); } else { - //Nothing allowed if (!used_to_clip_a_surface) { + if (used_to_classify_patches) + { + Node_id index_o_prime = ids.first, index_o = ids.second; + if( is_border(h1, tm1) ) + { + h1 = opposite(h1, tm1); + h2 = opposite(h2, tm2); + std::swap(index_o_prime, index_o); + } + + std::size_t fid1 = get(fids1, face(h1,tm1)); + std::size_t fid2 = get(fids2, face(h2,tm2)); + std::size_t patch_id_p=tm1_patch_ids[ fid1 ]; + std::size_t patch_id_q=tm2_patch_ids[ fid2 ]; + + //indicates that patch status will be updated + patch_status_not_set_tm1.reset(patch_id_p); + patch_status_not_set_tm2.reset(patch_id_q); + + if (coplanar_patches_of_tm1.test(patch_id_p) && coplanar_patches_of_tm2.test(patch_id_q)) + { + coplanar_patches_of_tm1_for_union_and_intersection.set(patch_id_p); + coplanar_patches_of_tm2_for_union_and_intersection.set(patch_id_q); + } + else + { + vertex_descriptor p = target(next(h1,tm1),tm1); + vertex_descriptor q = target(next(h2,tm2),tm2); + Node_id index_p = get_node_id(p, vertex_to_node_id1); + Node_id index_q = get_node_id(q, vertex_to_node_id2); + + if ( p_is_below_q(index_o_prime, index_o, + index_p, index_q, p, q, + vpm1, vpm2, + nodes) ) + is_patch_inside_tm2.set(patch_id_p); + else + is_patch_inside_tm1.set(patch_id_q); + } + } + else + { + //Nothing allowed #ifdef CGAL_COREFINEMENT_DEBUG - std::cout << " Non-manifold edge case 1\n"; + std::cout << " Non-manifold edge case 1\n"; #endif - impossible_operation.set(); - return; + impossible_operation.set(); + return; + } } } } else { - //Ambiguous, we can do nothing - if (!used_to_clip_a_surface) + if (!used_to_clip_a_surface && !used_to_classify_patches) { #ifdef CGAL_COREFINEMENT_DEBUG std::cout << " Non-manifold edge case 2\n"; #endif + //Ambiguous, we can do nothing impossible_operation.set(); return; } @@ -766,20 +899,38 @@ public: std::size_t patch_id_q1=tm2_patch_ids[ get(fids2, face(opposite(h2,tm2),tm2)) ]; std::size_t patch_id_q2=tm2_patch_ids[ get(fids2, face(h2,tm2)) ]; - //indicates that patch status will be updated - patch_status_not_set_tm1.reset(patch_id_p); - patch_status_not_set_tm2.reset(patch_id_q1); - patch_status_not_set_tm2.reset(patch_id_q2); + if (index_p!=index_q1 && index_p!=index_q2) + { + //indicates that patch status will be updated + patch_status_not_set_tm1.reset(patch_id_p); + patch_status_not_set_tm2.reset(patch_id_q1); + patch_status_not_set_tm2.reset(patch_id_q2); - bool p_is_between_q1q2 = sorted_around_edge( - ids.first, ids.second, - index_q1, index_q2, index_p, - q1, q2, p, - vpm2, vpm1, - nodes); + bool p_is_between_q1q2 = sorted_around_edge( + ids.first, ids.second, + index_q1, index_q2, index_p, + q1, q2, p, + vpm2, vpm1, + nodes); - if (p_is_between_q1q2) - is_patch_inside_tm2.set(patch_id_p); + if (p_is_between_q1q2) + { + is_patch_inside_tm2.set(patch_id_p); + // locally does not really make sense globally + if (h == h1) // i.e. p2 + is_patch_inside_tm1.set(patch_id_q2); + else + is_patch_inside_tm1.set(patch_id_q1); + } + else + { + // locally does not really make sense globally + if (h == h1) // i.e. p2 + is_patch_inside_tm1.set(patch_id_q1); + else + is_patch_inside_tm1.set(patch_id_q2); + } + } } } } @@ -787,12 +938,75 @@ public: if ( is_border_edge(h2,tm2) ) { CGAL_assertion(!used_to_clip_a_surface); - //Ambiguous, we do nothing + if (!used_to_classify_patches) + { #ifdef CGAL_COREFINEMENT_DEBUG - std::cout << " Non-manifold edge case 3\n"; + std::cout << " Non-manifold edge case 3\n"; #endif - impossible_operation.set(); - return; + impossible_operation.set(); + return; + } + else + { + //Sort the three triangle faces around their common edge + // we assume that the exterior of the volume is indicated by + // counterclockwise oriented faces + // (corrected by is_tmi_inside_tmi). + halfedge_descriptor h = is_border(h2, tm2) ? opposite(h2, tm2) : h2; + vertex_descriptor q = target(next(h,tm2),tm2); + // when looking from the side of indices.second, + // the interior of the first triangle mesh is described + // by turning counterclockwise from p1 to p2 + vertex_descriptor p1=target(next(opposite(h1,tm1),tm1),tm1); + vertex_descriptor p2=target(next(h1,tm1),tm1); + // when looking from the side of indices.second, + // the interior of the second volume is described + // by turning from p1 to p2 + + //check if the third point of each triangular face is an original point (stay NID) + //or a intersection point (in that case we need the index of the corresponding node to + //have the exact value of the point) + Node_id index_q = get_node_id(q, vertex_to_node_id2); + Node_id index_p1 = get_node_id(p1, vertex_to_node_id1); + Node_id index_p2 = get_node_id(p2, vertex_to_node_id1); + + std::size_t patch_id_q=tm2_patch_ids[ get(fids2, face(h,tm2)) ]; + std::size_t patch_id_p1=tm1_patch_ids[ get(fids1, face(opposite(h1,tm1),tm1)) ]; + std::size_t patch_id_p2=tm1_patch_ids[ get(fids1, face(h1,tm1)) ]; + + if (index_q!=index_p1 && index_q!=index_p2) + { + //indicates that patch status will be updated + patch_status_not_set_tm2.reset(patch_id_q); + patch_status_not_set_tm1.reset(patch_id_p1); + patch_status_not_set_tm1.reset(patch_id_p2); + + bool q_is_between_p1p2 = sorted_around_edge( + ids.first, ids.second, + index_p1, index_p2, index_q, + p1, p2, q, + vpm1, vpm2, + nodes); + + if (q_is_between_p1p2) + { + is_patch_inside_tm1.set(patch_id_q); + // locally does not really make sense globally + if (h == h2) // i.e. q2 + is_patch_inside_tm2.set(patch_id_p2); + else + is_patch_inside_tm2.set(patch_id_p1); + } + else + { + // locally does not really make sense globally + if (h == h2) // i.e. q2 + is_patch_inside_tm2.set(patch_id_p1); + else + is_patch_inside_tm2.set(patch_id_p2); + } + } + } } else { @@ -861,6 +1075,12 @@ public: p1, p2, q2, vpm1, vpm2, nodes); + + register_halfedge_pair(user_visitor, VUNDF(), + h1, h2, + false, q2_is_between_p1p2, false, !q2_is_between_p1p2, + true, false, true, false); + if ( q2_is_between_p1p2 ) is_patch_inside_tm1.set(patch_id_q2); //case 1 else is_patch_inside_tm2.set(patch_id_p2); //case 2 continue; @@ -873,7 +1093,7 @@ public: vpm1, vpm2, nodes) ) //p1==q2 { - CGAL_assertion( index_p1!=index_p2 || index_p1==Node_id((std::numeric_limits::max)()) ); + CGAL_assertion( index_p1!=index_p2 || index_p1==NID ); coplanar_patches_of_tm1.set(patch_id_p1); coplanar_patches_of_tm2.set(patch_id_q2); bool q1_is_between_p1p2 = sorted_around_edge( @@ -882,6 +1102,12 @@ public: p1, p2, q1, vpm1, vpm2, nodes); + + register_halfedge_pair(user_visitor, VUNDF(), + h1, h2, + q1_is_between_p1p2, false, false, !q1_is_between_p1p2, + true, false, false, true); + if ( q1_is_between_p1p2 ) { // case 3 is_patch_inside_tm1.set(patch_id_q1); @@ -906,6 +1132,12 @@ public: p1, p2, q2, vpm1, vpm2, nodes); + + register_halfedge_pair(user_visitor, VUNDF(), + h1, h2, + false, q2_is_between_p1p2, !q2_is_between_p1p2, false, + false, true, true, false); + if ( q2_is_between_p1p2 ) { //case 5 is_patch_inside_tm1.set(patch_id_q2); @@ -931,6 +1163,12 @@ public: p1, p2, q1, vpm1, vpm2, nodes); + + register_halfedge_pair(user_visitor, VUNDF(), + h1, h2, + q1_is_between_p1p2, false, !q1_is_between_p1p2, false, + false, true, false, true); + if ( q1_is_between_p1p2 ) is_patch_inside_tm1.set(patch_id_q1); //case 7 else is_patch_inside_tm2.set(patch_id_p1); //case 8 continue; @@ -943,17 +1181,17 @@ public: #endif //CGAL_COREFINEMENT_POLYHEDRA_DEBUG CGAL_assertion( - ( index_p1 == Node_id((std::numeric_limits::max)()) ? nodes.to_exact(get(vpm1,p1)): nodes.exact_node(index_p1) ) != - ( index_q1 == Node_id((std::numeric_limits::max)()) ? nodes.to_exact(get(vpm2,q1)): nodes.exact_node(index_q1) ) + ( index_p1 == NID ? nodes.to_exact(get(vpm1,p1)): nodes.exact_node(index_p1) ) != + ( index_q1 == NID ? nodes.to_exact(get(vpm2,q1)): nodes.exact_node(index_q1) ) && - ( index_p2 == Node_id((std::numeric_limits::max)()) ? nodes.to_exact(get(vpm1,p2)): nodes.exact_node(index_p2) ) != - ( index_q1 == Node_id((std::numeric_limits::max)()) ? nodes.to_exact(get(vpm2,q1)): nodes.exact_node(index_q1) ) + ( index_p2 == NID ? nodes.to_exact(get(vpm1,p2)): nodes.exact_node(index_p2) ) != + ( index_q1 == NID ? nodes.to_exact(get(vpm2,q1)): nodes.exact_node(index_q1) ) && - ( index_p1 == Node_id((std::numeric_limits::max)()) ? nodes.to_exact(get(vpm1,p1)): nodes.exact_node(index_p1) ) != - ( index_q2 == Node_id((std::numeric_limits::max)()) ? nodes.to_exact(get(vpm2,q2)): nodes.exact_node(index_q2) ) + ( index_p1 == NID ? nodes.to_exact(get(vpm1,p1)): nodes.exact_node(index_p1) ) != + ( index_q2 == NID ? nodes.to_exact(get(vpm2,q2)): nodes.exact_node(index_q2) ) && - ( index_p2 == Node_id((std::numeric_limits::max)()) ? nodes.to_exact(get(vpm1,p2)): nodes.exact_node(index_p2) ) != - ( index_q2 == Node_id((std::numeric_limits::max)()) ? nodes.to_exact(get(vpm2,q2)): nodes.exact_node(index_q2) ) + ( index_p2 == NID ? nodes.to_exact(get(vpm1,p2)): nodes.exact_node(index_p2) ) != + ( index_q2 == NID ? nodes.to_exact(get(vpm2,q2)): nodes.exact_node(index_q2) ) ); bool q1_is_between_p1p2 = sorted_around_edge( @@ -981,6 +1219,7 @@ public: vpm2, vpm1, nodes); if (!p1_is_between_q1q2){ + register_halfedge_pair(user_visitor, VUNDF(), h1, h2, true, true, false, false); // case (a4) // poly_first - poly_second = p1q1 U q2p2 // poly_second - poly_first = {0} @@ -992,6 +1231,7 @@ public: impossible_operation.set(TM1_MINUS_TM2); // tm1-tm2 is non-manifold } else{ + register_halfedge_pair(user_visitor, VUNDF(), h1, h2, true, true, true, true); // case (b4) // poly_first - poly_second = q2q1 // poly_second - poly_first = p2p1 @@ -1010,6 +1250,7 @@ public: } else { + register_halfedge_pair(user_visitor, VUNDF(), h1, h2, true, false, false, true); //case (c4) // poly_first - poly_second = p1q1 // poly_second - poly_first = p2q2 @@ -1034,6 +1275,7 @@ public: { if( q2_is_between_p1p2 ) { + register_halfedge_pair(user_visitor, VUNDF(), h1, h2, false, true, true, false); //case (d4) // poly_first - poly_second = q2p2 // poly_second - poly_first = q1p1 @@ -1063,6 +1305,7 @@ public: vpm2, vpm1, nodes); if (!p1_is_between_q1q2){ + register_halfedge_pair(user_visitor, VUNDF(), h1, h2, false, false, false, false); //case (e4) // poly_first - poly_second = p1p2 // poly_second - poly_first = q1q2 @@ -1074,6 +1317,7 @@ public: impossible_operation.set(UNION); // tm1 U tm2 is non-manifold } else{ + register_halfedge_pair(user_visitor, VUNDF(), h1, h2, false, false, true, true); //case (f4) is_patch_inside_tm2.set(patch_id_p1); is_patch_inside_tm2.set(patch_id_p2); @@ -1091,6 +1335,24 @@ public: } } + if (used_to_classify_patches) + { + export_flags( user_visitor, VUNDF(),fids1, tm1_patch_ids, + is_patch_inside_tm2, + coplanar_patches_of_tm1, + coplanar_patches_of_tm1_for_union_and_intersection, + patch_status_not_set_tm1, + tm1); + export_flags( user_visitor, VUNDF(), + fids2, tm2_patch_ids, + is_patch_inside_tm1, + coplanar_patches_of_tm2, + coplanar_patches_of_tm2_for_union_and_intersection, + patch_status_not_set_tm2, + tm2); + return; + } + // (2-b) Classify isolated surface patches wrt the other mesh // in case a mesh is not closed, any cc of the second mesh that is // free from intersection is considered as outside/inside @@ -1109,7 +1371,17 @@ public: CGAL::Bounded_side in_tm2 = is_tm2_inside_out ? ON_UNBOUNDED_SIDE : ON_BOUNDED_SIDE; - Side_of_triangle_mesh inside_tm2(tm2, vpm2); + typedef typename Nodes_vector::Exact_kernel Exact_kernel; + typedef Side_of_helper VPM_helper; + typedef typename VPM_helper::VPM SOTM_vpm2; + typedef typename VPM_helper::Tree_type Tree_type; + + Tree_type tree; + VPM_helper::build_tree(tm2, tree, vertex_to_node_id2, fids2, vpm2, nodes); + Side_of_triangle_mesh inside_tm2(tree); for(face_descriptor f : faces(tm1)) { @@ -1120,31 +1392,36 @@ public: patch_status_not_set_tm1.reset( patch_id ); halfedge_descriptor h = halfedge(f, tm1); Node_id index_p1 = get_node_id(target(h, tm1), vertex_to_node_id1); + std::array fnids = { index_p1, index_p1, index_p1 }; if (index_p1 != NID) { h=next(h, tm1); index_p1 = get_node_id(target(h, tm1), vertex_to_node_id1); + fnids[1]=index_p1; if (index_p1 != NID) { h=next(h, tm1); index_p1 = get_node_id(target(h, tm1), vertex_to_node_id1); + fnids[2]=index_p1; } } + if (index_p1 != NID) { - if (tm1_coplanar_faces.test(f_id)) + if (coplanar_patches_of_tm1.test(patch_id)) { - coplanar_patches_of_tm1.set(patch_id); - coplanar_patches_of_tm1_for_union_and_intersection.set(patch_id); + if (is_tm1_inside_out == is_tm2_inside_out) + coplanar_patches_of_tm1_for_union_and_intersection.set(patch_id); } else { - // triangle which is tangent at its 3 vertices - // \todo improve this part which is not robust with a kernel - // with inexact constructions. - Bounded_side position = inside_tm2(centroid(get(vpm1, source(h, tm1)), - get(vpm1, target(h, tm1)), - get(vpm1, target(next(h, tm1), tm1)) )); + typename Exact_kernel::Point_3 e_centroid = + centroid(nodes.exact_node(fnids[0]), + nodes.exact_node(fnids[1]), + nodes.exact_node(fnids[2])); + + Bounded_side position = inside_tm2(e_centroid); + CGAL_assertion( position != ON_BOUNDARY); if ( position == in_tm2 ) is_patch_inside_tm2.set(patch_id); @@ -1152,9 +1429,7 @@ public: } else { - // TODO: tm2 might have been modified and an inexact vpm will - // provide a non-robust result. - Bounded_side position = inside_tm2( get(vpm1, target(h, tm1))); + Bounded_side position = inside_tm2( nodes.to_exact(get(vpm1, target(h, tm1)))); CGAL_assertion( position != ON_BOUNDARY); if ( position == in_tm2 ) is_patch_inside_tm2.set(patch_id); @@ -1171,7 +1446,18 @@ public: CGAL::Bounded_side in_tm1 = is_tm1_inside_out ? ON_UNBOUNDED_SIDE : ON_BOUNDED_SIDE; - Side_of_triangle_mesh inside_tm1(tm1, vpm1); + typedef typename Nodes_vector::Exact_kernel Exact_kernel; + typedef Side_of_helper VPM_helper; + typedef typename VPM_helper::VPM SOTM_vpm1; + typedef typename VPM_helper::Tree_type Tree_type; + + Tree_type tree; + VPM_helper::build_tree(tm1, tree, vertex_to_node_id1, fids1, vpm1, nodes); + Side_of_triangle_mesh inside_tm1(tree); + for(face_descriptor f : faces(tm2)) { const std::size_t f_id = get(fids2, f); @@ -1181,30 +1467,33 @@ public: patch_status_not_set_tm2.reset( patch_id ); halfedge_descriptor h = halfedge(f, tm2); Node_id index_p2 = get_node_id(target(h, tm2), vertex_to_node_id2); + std::array fnids = { index_p2, index_p2, index_p2 }; if (index_p2 != NID) { h=next(h, tm2); index_p2 = get_node_id(target(h, tm2), vertex_to_node_id2); + fnids[1]=index_p2; if (index_p2 != NID) { h=next(h, tm2); index_p2 = get_node_id(target(h, tm2), vertex_to_node_id2); + fnids[2]=index_p2; } } if (index_p2 != NID) { - if (tm2_coplanar_faces.test(f_id)) + if (coplanar_patches_of_tm2.test(patch_id)) { - coplanar_patches_of_tm2.set(patch_id); - coplanar_patches_of_tm2_for_union_and_intersection.set(patch_id); + if (is_tm1_inside_out == is_tm2_inside_out) + coplanar_patches_of_tm2_for_union_and_intersection.set(patch_id); } else { - // triangle which is tangent at its 3 vertices - // \todo improve this part which is not robust with a kernel - // with inexact constructions. - Bounded_side position = inside_tm1(midpoint(get(vpm2, source(h, tm2)), - get(vpm2, target(h, tm2)) )); + typename Exact_kernel::Point_3 e_centroid = + centroid(nodes.exact_node(fnids[0]), + nodes.exact_node(fnids[1]), + nodes.exact_node(fnids[2])); + Bounded_side position = inside_tm1(e_centroid); CGAL_assertion( position != ON_BOUNDARY); if ( position == in_tm1 ) is_patch_inside_tm1.set(patch_id); @@ -1212,9 +1501,7 @@ public: } else { - // TODO: tm1 might have been modified and an inexact vpm will - // provide a non-robust result. - Bounded_side position = inside_tm1( get(vpm2, target(h, tm2))); + Bounded_side position = inside_tm1( nodes.to_exact(get(vpm2, target(h, tm2)))); CGAL_assertion( position != ON_BOUNDARY); if ( position == in_tm1 ) is_patch_inside_tm1.set(patch_id); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Output_builder_for_autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Output_builder_for_autorefinement.h index db57fbee53a..6e5b3a73705 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Output_builder_for_autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Output_builder_for_autorefinement.h @@ -245,7 +245,7 @@ public: CGAL_assertion(BGL::internal::is_index_map_valid(fids, num_faces(tm), faces(tm))); // bitset to identify coplanar faces - boost::dynamic_bitset<> tm_coplanar_faces(num_faces(tm), 0); + std::vector tm_coplanar_faces; // In the following loop we filter intersection edges that are strictly inside a patch // of coplanar facets so that we keep only the edges on the border of the patch. @@ -277,11 +277,6 @@ public: else{ halfedge_descriptor h2_opp = opposite(h2, tm); - if (is_border_edge(h1,tm) || is_border_edge(h2,tm)){ - ++epp_it; - continue; - } - //vertices from tm1 vertex_descriptor p1 = target(next(h1_opp, tm), tm); vertex_descriptor p2 = target(next(h1, tm), tm); @@ -315,20 +310,20 @@ public: //mark coplanar facets if any if (p1_eq_q1){ - tm_coplanar_faces.set(get(fids, face(h1_opp, tm))); - tm_coplanar_faces.set(get(fids, face(h2_opp, tm))); + tm_coplanar_faces.push_back(face(h1_opp, tm)); + tm_coplanar_faces.push_back(face(h2_opp, tm)); } if (p1_eq_q2){ - tm_coplanar_faces.set(get(fids, face(h1_opp, tm))); - tm_coplanar_faces.set(get(fids, face(h2, tm))); + tm_coplanar_faces.push_back(face(h1_opp, tm)); + tm_coplanar_faces.push_back(face(h2, tm)); } if (p2_eq_q1){ - tm_coplanar_faces.set(get(fids, face(h1, tm))); - tm_coplanar_faces.set(get(fids, face(h2_opp, tm))); + tm_coplanar_faces.push_back(face(h1, tm)); + tm_coplanar_faces.push_back(face(h2_opp, tm)); } if (p2_eq_q2){ - tm_coplanar_faces.set(get(fids, face(h1, tm))); - tm_coplanar_faces.set(get(fids, face(h2, tm))); + tm_coplanar_faces.push_back(face(h1, tm)); + tm_coplanar_faces.push_back(face(h2, tm)); } if ( (p1_eq_q1 || p1_eq_q2) && (p2_eq_q1 || p2_eq_q2) ) to_remove = true; @@ -368,6 +363,12 @@ public: boost::dynamic_bitset<> coplanar_patches(nb_patches,false); patches_to_keep.set(); patch_status_not_set.set(); + + // set coplanar patches flags + for (face_descriptor f : tm_coplanar_faces) + coplanar_patches.set( patch_ids[get(fids,f)] ); + + // use a union-find on patches to track the incidence between patches kept typedef Union_find UF; UF uf; @@ -404,10 +405,25 @@ public: if ( is_border_edge(h1, tm) ){ if ( is_border_edge(h2,tm) ) { + // CASE h1 and h2 are boundary edge if ( is_border(h1,tm) == is_border(h2,tm) ) { - //Orientation issue, nothing done - all_fixed = false; + std::size_t pid1 = + patch_ids[ get(fids, face( is_border(h1,tm)?opposite(h1,tm):h1 ,tm)) ]; + if (coplanar_patches[pid1]) + { + std::size_t pid2 = + patch_ids[ get(fids, face( is_border(h2,tm)?opposite(h2,tm):h2 ,tm)) ]; + CGAL_assertion(coplanar_patches[pid2]); + // the face of p and the face of q1 have the same orientation: remove both patches + patches_to_keep.reset(pid1); + patches_to_keep.reset(pid2); + } + else + { + //Orientation issue, nothing done + all_fixed = false; + } } else { @@ -415,22 +431,42 @@ public: { std::size_t pid1=patch_ids[ get(fids, face(opposite(h1,tm),tm)) ], pid2=patch_ids[ get(fids, face(h2,tm)) ]; - uf.unify_sets(patch_handles[pid1], patch_handles[pid2]); - patch_status_not_set.reset(pid1); - patch_status_not_set.reset(pid2); + + if (coplanar_patches[pid1]) + { + CGAL_assertion(coplanar_patches[pid2]); + // arbitrarily remove the patch with the smallest id + patches_to_keep.reset(pid1 #include +#include +#include + namespace CGAL{ namespace Polygon_mesh_processing { namespace Corefinement{ @@ -99,6 +102,245 @@ struct No_extra_output_from_corefinement {} }; +template +class Graph_node_classifier +{ + typedef std::size_t Node_id; + typedef boost::graph_traits Graph_traits; + typedef typename Graph_traits::vertex_descriptor vertex_descriptor; + typedef typename Graph_traits::halfedge_descriptor halfedge_descriptor; + boost::dynamic_bitset<> is_node_on_boundary; // indicate if a vertex is a border vertex in tm1 or tm2 + boost::container::flat_map > m_node_on_vertex_map; + boost::container::flat_map > m_node_on_edge_map; +// variables filled by preprocessing + TriangleMesh* m_tm1_ptr = nullptr; + const std::vector* m_node_on_vertex_1_ptr = nullptr; + const std::vector* m_node_on_edge_1_ptr = nullptr; + TriangleMesh* m_tm2_ptr = nullptr; + const std::vector* m_node_on_vertex_2_ptr = nullptr; + const std::vector* m_node_on_edge_2_ptr = nullptr; + + bool is_on_border(std::size_t node_id1, std::size_t node_id2, + const std::vector* node_on_vertex_ptr, + const std::vector* node_on_edge_ptr, + TriangleMesh* tm_ptr) + { + if (tm_ptr == nullptr) return false; + + if (node_on_vertex_ptr!=nullptr) + { + vertex_descriptor v1 = (*node_on_vertex_ptr)[node_id1]; + if ( v1 != Graph_traits::null_vertex() ) + { + vertex_descriptor v2 = (*node_on_vertex_ptr)[node_id2]; + if ( v2 != Graph_traits::null_vertex() ) + { + std::pair< halfedge_descriptor, bool > res = + halfedge(v1, v2, *tm_ptr); + CGAL_assertion(res.second); + return res.second && is_border_edge(res.first, *tm_ptr); + } + if (node_on_edge_ptr!=nullptr) + { + halfedge_descriptor h = (*node_on_edge_ptr)[node_id2]; + if (h != Graph_traits::null_halfedge() && is_border_edge(h, *tm_ptr)) + return source(h, *tm_ptr)==v1 || target(h, *tm_ptr)==v1; + return false; + } + } + } + + if (node_on_edge_ptr!=nullptr) + { + halfedge_descriptor h = (*node_on_edge_ptr)[node_id1]; + if (h != Graph_traits::null_halfedge() && is_border_edge(h, *tm_ptr)) + { + if ( node_on_vertex_ptr!=nullptr ) + { + vertex_descriptor v2 = (*node_on_vertex_ptr)[node_id2]; + if (v2 != Graph_traits::null_vertex() ) + return source(h, *tm_ptr)==v2 || target(h, *tm_ptr)==v2; + } + halfedge_descriptor h_bis = (*node_on_edge_ptr)[node_id2]; + if (h_bis != Graph_traits::null_halfedge()) + return h==h_bis || h==opposite(h_bis, *tm_ptr); + } + } + return false; + } +public: + + void preprocessing() + { + boost::container::flat_set mesh_ptrs; + mesh_ptrs.reserve(2); + for (const auto& k_v : m_node_on_vertex_map) mesh_ptrs.insert(k_v.first); + for (const auto& k_v : m_node_on_edge_map) mesh_ptrs.insert(k_v.first); + + if (!mesh_ptrs.empty()) + { + m_tm1_ptr=*mesh_ptrs.begin(); + auto itv = m_node_on_vertex_map.find(m_tm1_ptr); + if (itv != m_node_on_vertex_map.end()) m_node_on_vertex_1_ptr= &(itv->second); + auto ite = m_node_on_edge_map.find(m_tm1_ptr); + if (ite != m_node_on_edge_map.end()) m_node_on_edge_1_ptr= &(ite->second); + if (mesh_ptrs.size()==2) + { + m_tm2_ptr=*std::next(mesh_ptrs.begin()); + itv = m_node_on_vertex_map.find(m_tm2_ptr); + if (itv != m_node_on_vertex_map.end()) m_node_on_vertex_2_ptr= &(itv->second); + ite = m_node_on_edge_map.find(m_tm2_ptr); + if (ite != m_node_on_edge_map.end()) m_node_on_edge_2_ptr= &(ite->second); + } + } + } + + void node_on_vertex(Node_id node_id, vertex_descriptor v, const TriangleMesh& tm) + { + m_node_on_vertex_map[const_cast(&tm)][node_id] = v; + + //we turn around the hedge and check no halfedge is a border halfedge + for(halfedge_descriptor hc :halfedges_around_target(halfedge(v,tm),tm)) + if ( is_border_edge(hc,tm) ) + { + is_node_on_boundary.set(node_id); + return; + } + } + + void node_on_edge(Node_id node_id, halfedge_descriptor h, const TriangleMesh& tm) + { + if ( is_border_edge(h,tm) ) + is_node_on_boundary.set(node_id); + m_node_on_edge_map[const_cast(&tm)][node_id] = h; + + } + + void new_node(Node_id node_id, const TriangleMesh& tm) + { + is_node_on_boundary.resize(node_id+1, false); + TriangleMesh* tm_ptr = const_cast(&tm); + m_node_on_edge_map[tm_ptr].resize(node_id+1, Graph_traits::null_halfedge()); + m_node_on_vertex_map[tm_ptr].resize(node_id+1, Graph_traits::null_vertex()); + } + + bool is_terminal(Node_id node_id, const std::vector& neighbor_nodes) + { + if ( is_node_on_boundary.test(node_id) && neighbor_nodes.size()==2) + { + std::size_t nn1 = neighbor_nodes[0], nn2 = neighbor_nodes[1]; + + return is_on_border(node_id, nn1, m_node_on_vertex_1_ptr, m_node_on_edge_1_ptr, m_tm1_ptr) != + is_on_border(node_id, nn2, m_node_on_vertex_1_ptr, m_node_on_edge_1_ptr, m_tm1_ptr) + || + is_on_border(node_id, nn1, m_node_on_vertex_2_ptr, m_node_on_edge_2_ptr, m_tm2_ptr) != + is_on_border(node_id, nn2, m_node_on_vertex_2_ptr, m_node_on_edge_2_ptr, m_tm2_ptr); + } + return false; + } +}; + +template +class Graph_node_classifier +{ + typedef std::size_t Node_id; + typedef boost::graph_traits Graph_traits; + typedef typename Graph_traits::vertex_descriptor vertex_descriptor; + typedef typename Graph_traits::halfedge_descriptor halfedge_descriptor; + boost::dynamic_bitset<> m_is_node_on_boundary; // indicate if a vertex is a border vertex in tm1 or tm2 + std::vector> m_node_on_vertex; + std::vector> m_node_on_edge; + TriangleMesh* m_tm_ptr = nullptr; + + bool is_on_border(std::size_t node_id1, std::size_t node_id2) + { + if (m_tm_ptr == nullptr) return false; + + for (vertex_descriptor v1 : m_node_on_vertex[node_id1]) + { + for (vertex_descriptor v2 : m_node_on_vertex[node_id2]) + { + //vertex-vertex case + std::pair< halfedge_descriptor, bool > res = + halfedge(v1, v2, *m_tm_ptr); + if (res.second && is_border_edge(res.first, *m_tm_ptr)) + return true; + } + for (halfedge_descriptor h2 : m_node_on_edge[node_id2]) + { + // vertex-edge case + if ( (source(h2, *m_tm_ptr)==v1 || target(h2, *m_tm_ptr)==v1) + && is_border_edge(h2, *m_tm_ptr) ) + { + return true; + } + } + } + + for (halfedge_descriptor h1 : m_node_on_edge[node_id1]) + { + if (!is_border_edge(h1, *m_tm_ptr)) continue; + for (vertex_descriptor v2 : m_node_on_vertex[node_id2]) + { + // edge-vertex case + if (source(h1, *m_tm_ptr)==v2 || target(h1, *m_tm_ptr)==v2) + return true; + } + for (halfedge_descriptor h2 : m_node_on_edge[node_id2]) + { + if (h1==h2 || h1==opposite(h2, *m_tm_ptr)) + return true; + } + } + + return false; + } + +public: + + void preprocessing(){} + + void node_on_vertex(Node_id node_id, vertex_descriptor v, const TriangleMesh& tm) + { + m_node_on_vertex[node_id].push_back(v); + + //we turn around the hedge and check no halfedge is a border halfedge + for(halfedge_descriptor hc :halfedges_around_target(halfedge(v,tm),tm)) + if ( is_border_edge(hc,tm) ) + { + m_is_node_on_boundary.set(node_id); + return; + } + } + + void node_on_edge(Node_id node_id, halfedge_descriptor h, const TriangleMesh& tm) + { + if ( is_border_edge(h,tm) ) + m_is_node_on_boundary.set(node_id); + m_node_on_edge[node_id].push_back(h); + + } + + void new_node(Node_id node_id, const TriangleMesh& tm) + { + m_is_node_on_boundary.resize(node_id+1, false); + m_tm_ptr = const_cast(&tm); + m_node_on_edge.resize(node_id+1); + m_node_on_vertex.resize(node_id+1); + } + + bool is_terminal(Node_id node_id, const std::vector& neighbor_nodes) + { + if ( m_is_node_on_boundary.test(node_id) && neighbor_nodes.size()==2) + { + std::size_t nn1 = neighbor_nodes[0], nn2 = neighbor_nodes[1]; + + return is_on_border(node_id, nn1) != is_on_border(node_id, nn2); + } + return false; + } +}; + // A visitor for Intersection_of_triangle_meshes that can be used to corefine // two meshes template< class TriangleMesh, @@ -107,7 +349,8 @@ template< class TriangleMesh, class OutputBuilder_ = Default, class EdgeMarkMapBind_ = Default, class UserVisitor_ = Default, - bool doing_autorefinement = false > + bool doing_autorefinement = false, + bool handle_non_manifold_features = false > class Surface_intersection_visitor_for_corefinement{ //default template parameters typedef typename Default::Get On_edge_map; //to keep the correspondance between node_id and vertex_handle in each mesh typedef std::vector Node_id_to_vertex; - typedef std::map Mesh_to_map_node; + typedef std::map Mesh_to_map_node; //to handle coplanar halfedge of polyhedra that are full in the intersection typedef std::multimap Node_to_target_of_hedge_map; typedef std::map Mesh_to_vertices_on_intersection_map; typedef boost::unordered_map Vertex_to_node_id; typedef std::map Mesh_to_vertex_to_node_id; + typedef Non_manifold_feature_map NM_features_map; // typedef for the CDT typedef Intersection_nodes INodes; @@ -153,7 +397,8 @@ private: typedef typename CDT::Vertex_handle CDT_Vertex_handle; // data members private: - // boost::dynamic_bitset<> non_manifold_nodes; + + Graph_node_classifier graph_node_classifier; std::vector< std::vector > graph_of_constraints; boost::dynamic_bitset<> is_node_of_degree_one; //nb of intersection points between coplanar faces, see fixes XSL_TAG_CPL_VERT @@ -167,6 +412,9 @@ private: std::map< Node_id,std::set > coplanar_constraints; +// optional data members to handle non-manifold issues + std::map non_manifold_feature_maps; + //data members that require initialization in the constructor UserVisitor& user_visitor; OutputBuilder& output_builder; @@ -212,22 +460,98 @@ public: , const_mesh_ptr(const_mesh_ptr) {} + void + set_non_manifold_feature_map( + const TriangleMesh& tm, + const NM_features_map& nm) + { + non_manifold_feature_maps[&tm] = &nm; + } + + void copy_nodes_ids_for_non_manifold_features() + { + static const constexpr std::size_t NM_NID((std::numeric_limits::max)()); + + for(const std::pair& tm_and_nm : + non_manifold_feature_maps) + { + TriangleMesh* tm_ptr = const_cast(tm_and_nm.first); + // update nodes on edges + On_edge_map& on_edge_map = on_edge[tm_ptr]; + std::vector< std::pair > edges_to_copy; + for (const std::pair& ed_and_ids : on_edge_map) + { + std::size_t eid = get(tm_and_nm.second->e_nm_id, ed_and_ids.first); + if (eid!=NM_NID) + edges_to_copy.push_back(std::make_pair(eid,&(ed_and_ids.second))); + } + for(const std::pair& id_and_nodes : edges_to_copy) + { + const std::vector& nm_edges = + tm_and_nm.second->non_manifold_edges[id_and_nodes.first]; + CGAL_assertion( on_edge_map.count(nm_edges.front())==1 ); + + for (std::size_t i=1; i node_id + Vertex_to_node_id& vertex_to_node_id = mesh_to_vertex_to_node_id[tm_ptr]; + Node_to_target_of_hedge_map& vertices_on_inter = mesh_to_vertices_on_inter[tm_ptr]; + + std::vector< std::pair > vertices_to_add; + for (const typename std::pair& vd_and_id + : vertex_to_node_id) + { + std::size_t vid = get(tm_and_nm.second->v_nm_id, vd_and_id.first); + if (vid!=NM_NID) + vertices_to_add.push_back(std::make_pair(vd_and_id.first,vd_and_id.second)); + } + + for(const std::pair& vd_and_nid : vertices_to_add) + { + std::size_t vid = get(tm_and_nm.second->v_nm_id, vd_and_nid.first); + for(vertex_descriptor vd : tm_and_nm.second->non_manifold_vertices[vid]) + { + if (vd != vd_and_nid.first) + { + vertex_to_node_id.insert(std::make_pair(vd,vd_and_nid.second)); + output_builder.set_vertex_id(vd, vd_and_nid.second, *tm_ptr); + vertices_on_inter.insert(std::make_pair(vd_and_nid.second,halfedge(vd,*tm_ptr))); + } + } + } + } + } + template void annotate_graph(std::vector& graph) { std::size_t nb_nodes=graph.size(); graph_of_constraints.resize(nb_nodes); is_node_of_degree_one.resize(nb_nodes); +//TODO: pas bon avec autoref et la collecte des infos aussi... + + graph_node_classifier.preprocessing(); for(std::size_t node_id=0;node_id(&tm); + graph_node_classifier.new_node(node_id, tm); + // user_visitor.new_node_added_triple_face(node_id, f1, f2, f3, tm); // NODE_VISITOR_TAG #ifdef CGAL_DEBUG_AUTOREFINEMENT std::cout << "adding node " << node_id << " " << f1 << " " << f2 << " " << f3 << "\n"; #endif + TriangleMesh* tm_ptr = const_cast(&tm); on_face[tm_ptr][f1].push_back(node_id); on_face[tm_ptr][f2].push_back(node_id); on_face[tm_ptr][f3].push_back(node_id); @@ -329,10 +641,10 @@ public: bool is_target_coplanar, bool is_source_coplanar) { - // non_manifold_nodes.resize(node_id+1); - TriangleMesh* tm1_ptr = const_cast(&tm1); TriangleMesh* tm2_ptr = const_cast(&tm2); + graph_node_classifier.new_node(node_id, *tm1_ptr); + graph_node_classifier.new_node(node_id, *tm2_ptr); //forward to the visitor // user_visitor.new_node_added(node_id, type, h_1, h_2, is_target_coplanar, is_source_coplanar); // NODE_VISITOR_TAG @@ -346,7 +658,7 @@ public: case ON_EDGE: //Edge intersected by an edge { on_edge[tm2_ptr][edge(h_2,tm2)].push_back(node_id); - // check_node_on_non_manifold_edge(node_id,h_2,tm2); + check_node_on_boundary_edge_case(node_id,h_2,tm2); } break; case ON_VERTEX: @@ -358,7 +670,7 @@ public: node_id_to_vertex.resize(node_id+1,Graph_traits::null_vertex()); node_id_to_vertex[node_id]=target(h_2,tm2); all_incident_faces_got_a_node_as_vertex(h_2,node_id,*tm2_ptr); - // check_node_on_non_manifold_vertex(node_id,h_2,tm2); + check_node_on_boundary_vertex_case(node_id,h_2,tm2); output_builder.set_vertex_id(target(h_2, tm2), node_id, tm2); } break; @@ -383,7 +695,7 @@ public: all_incident_faces_got_a_node_as_vertex(h_1,node_id, *tm1_ptr); // register the vertex in the output builder output_builder.set_vertex_id(target(h_1, tm1), node_id, tm1); - // check_node_on_non_manifold_vertex(node_id,h_1,tm1); + check_node_on_boundary_vertex_case(node_id,h_1,tm1); } else{ if ( is_source_coplanar ){ @@ -397,12 +709,34 @@ public: all_incident_faces_got_a_node_as_vertex(h_1_opp,node_id, *tm1_ptr); // register the vertex in the output builder output_builder.set_vertex_id(source(h_1, tm1), node_id, tm1); - // check_node_on_non_manifold_vertex(node_id,h_1_opp,tm1); + check_node_on_boundary_vertex_case(node_id,h_1_opp,tm1); } else{ //handle intersection on principal edge + typename std::map::iterator it_find = + non_manifold_feature_maps.find(&tm1); + if ( it_find != non_manifold_feature_maps.end() ) + { + // update h_1 if it is not the canonical non-manifold edge + // This is important to make sure intersection points on non-manifold + // edges are all connected for the same edge so that the redistribution + // on other edges does not overwrite some nodes. + // This update might be required in case of EDGE-EDGE intersection or + // COPLANAR intersection. + const NM_features_map& nm_features_map_1 = *it_find->second; + std::size_t eid1 = nm_features_map_1.non_manifold_edges.empty() + ? std::size_t(-1) + : get(nm_features_map_1.e_nm_id, edge(h_1, tm1)); + + if (eid1 != std::size_t(-1)) + { + if ( edge(h_1, tm1) != nm_features_map_1.non_manifold_edges[eid1].front() ) + h_1 = halfedge(nm_features_map_1.non_manifold_edges[eid1].front(), tm1); + } + } + on_edge[tm1_ptr][edge(h_1,tm1)].push_back(node_id); - // check_node_on_non_manifold_edge(node_id,h_1,tm1); + check_node_on_boundary_edge_case(node_id,h_1,tm1); } } } @@ -471,8 +805,9 @@ public: std::copy(begin,end,std::back_inserter(node_ids_array[it_id->second])); } - // Used by the autorefinement to re-set the id of nodes on the boundary of a - // face since another vertex (inside a face or on another edge) might have + // Used by the autorefinement and non-manifold edge handling to re-set + // the id of nodes on the boundary of a face since another vertex + // (inside a face or on another edge) might have // overwritten the vertex in node_id_to_vertex template void update_node_id_to_vertex_map(Node_id_to_vertex& node_id_to_vertex, @@ -564,7 +899,7 @@ public: // this condition ensures to consider only graph edges that are in // the same triangle if ( !points_on_triangle || it_vh!=id_to_CDT_vh.end() ){ - CGAL_assertion(doing_autorefinement || it_vh!=id_to_CDT_vh.end()); + CGAL_assertion(doing_autorefinement || handle_non_manifold_features || it_vh!=id_to_CDT_vh.end()); if (it_vh==id_to_CDT_vh.end()) continue; // needed for autorefinement (interior nodes) cdt.insert_constraint(vh,it_vh->second); constrained_edges.push_back(std::make_pair(id,id_n)); @@ -656,6 +991,7 @@ public: bool hedge_is_marked = call_get(marks_on_edges,tm,edge(hedge,tm)); //do split the edges CGAL_assertion_code(vertex_descriptor expected_src=source(hedge,tm)); + user_visitor.before_edge_split(hedge, tm); for(std::size_t node_id : node_ids) { halfedge_descriptor hnew = Euler::split_edge(hedge, tm); @@ -674,9 +1010,11 @@ public: //update marker tags. If the edge was marked, then the resulting edges in the split must be marked if ( hedge_is_marked ) call_put(marks_on_edges,tm,edge(hnew,tm),true); + user_visitor.edge_split(hnew, tm); CGAL_assertion_code(expected_src=vnew); } + user_visitor.after_edge_split(); CGAL_assertion(target(hedge_incident_to_src,tm)==original_vertex); CGAL_assertion(face(hedge_incident_to_src,tm)==face(hedge_opp,tm)); @@ -731,7 +1069,7 @@ public: f_vertices[1]=it_fb->second.vertices[1]; f_vertices[2]=it_fb->second.vertices[2]; update_face_indices(f_vertices,f_indices,vertex_to_node_id); - if (doing_autorefinement) + if (doing_autorefinement || handle_non_manifold_features) it_fb->second.update_node_id_to_vertex_map(node_id_to_vertex, tm); } else{ @@ -777,7 +1115,7 @@ public: { id_to_CDT_vh.insert( std::make_pair(f_indices[ik],triangle_vertices[ik])); - if (doing_autorefinement) + if (doing_autorefinement || handle_non_manifold_features) // update the current vertex in node_id_to_vertex // to match the one of the face node_id_to_vertex[f_indices[ik]]=f_vertices[ik]; @@ -952,6 +1290,8 @@ public: const VertexPointMap1& vpm1, const VertexPointMap2& vpm2) { + copy_nodes_ids_for_non_manifold_features(); + nodes.all_nodes_created(); TriangleMesh* tm1_ptr = const_cast(&tm1); @@ -984,15 +1324,19 @@ public: // Face_boundaries& face_boundaries=mesh_to_face_boundaries[&tm]; Node_to_target_of_hedge_map& nodes_to_hedge=it->second; + + // iterate on the vertices that are on the intersection between the input meshes for(typename Node_to_target_of_hedge_map::iterator it_node_2_hedge=nodes_to_hedge.begin(); it_node_2_hedge!=nodes_to_hedge.end(); ++it_node_2_hedge) { Node_id node_id_of_first=it_node_2_hedge->first; + // look for neighbors of the current node in the intersection graph std::vector& neighbors=graph_of_constraints[node_id_of_first]; if ( !neighbors.empty() ) { + // for all neighbors look for input vertices that are also on the intersection for(Node_id node_id : neighbors) { //if already done for the opposite @@ -1010,7 +1354,7 @@ public: target(it_node_2_hedge_two->second,tm) ) { hedge=opposite(next(hedge,tm),tm); - if (tm1_ptr==tm2_ptr && hedge==start) + if ((doing_autorefinement || handle_non_manifold_features) && hedge==start) { ++it_node_2_hedge_two; // we are using a multimap and // the halfedge we are looking for @@ -1066,7 +1410,7 @@ public: triangulate_intersected_faces(it, vpm2, nodes, mesh_to_face_boundaries); } - nodes.finalize(); + nodes.finalize(mesh_to_node_id_to_vertex); // additional operations output_builder(nodes, 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 8614627c59b..e34a519869f 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 @@ -146,6 +146,207 @@ void copy_edge_mark(G&, No_mark&) {} // nothing to do + +// For exact side_of_triangle_mesh +template +struct Node_vector_exact_vertex_point_map +{ +// map type definitions + typedef typename boost::property_traits::key_type key_type; + typedef typename NodeVector::Exact_kernel Exact_kernel; + typedef typename Exact_kernel::Point_3 value_type; + typedef value_type reference; + typedef boost::readable_property_map_tag category; +// internal type definitions + typedef std::size_t Node_id; + + Node_vector_exact_vertex_point_map(){} + + Node_vector_exact_vertex_point_map(const Node_id_map& node_ids, + const VertexPointMap& vpm, + const NodeVector& node_vector) + : node_ids(&node_ids) + , vpm(&vpm) + , node_vector(&node_vector) + {} + + friend value_type get(Node_vector_exact_vertex_point_map m, key_type k) + { + typename Node_id_map::const_iterator it = m.node_ids->find(k); + if (it == m.node_ids->end()) + return m.node_vector->to_exact( get(*(m.vpm), k) ); + return m.node_vector->exact_node(it->second); + } + + const Node_id_map* node_ids; + const VertexPointMap* vpm; + const NodeVector* node_vector; +}; + +// For exact side_of_triangle_mesh +template +struct Split_primitives +{ + Split_primitives(TriangleMesh& tm, PPM ppm) + : tm(tm) + , ppm(ppm) + {} + + template + void operator()(PrimitiveIterator first, + PrimitiveIterator beyond, + const CGAL::Bbox_3& bbox) const + { + typedef typename std::iterator_traits::value_type Prmtv; + PrimitiveIterator middle = first + (beyond - first)/2; + typedef typename std::iterator_traits::value_type Prmtv; + switch(TreeTraits::longest_axis(bbox)) + { + case TreeTraits::CGAL_AXIS_X: // sort along x + std::nth_element(first, middle, beyond, [this](const Prmtv& p1, const Prmtv& p2){ return get(ppm, p1.id()).x() < get(ppm,p2.id()).x(); }); + break; + case TreeTraits::CGAL_AXIS_Y: // sort along y + std::nth_element(first, middle, beyond, [this](const Prmtv& p1, const Prmtv& p2){ return get(ppm, p1.id()).y() < get(ppm,p2.id()).y(); }); + break; + case TreeTraits::CGAL_AXIS_Z: // sort along z + std::nth_element(first, middle, beyond, [this](const Prmtv& p1, const Prmtv& p2){ return get(ppm, p1.id()).z() < get(ppm,p2.id()).z(); }); + break; + default: + CGAL_error(); + } + } + TriangleMesh& tm; + PPM ppm; +}; + +// For exact side_of_triangle_mesh +template +struct Compute_bbox { + Compute_bbox(const BPM& bpm) + : bpm(bpm) + {} + + template + CGAL::Bbox_3 operator()(ConstPrimitiveIterator first, + ConstPrimitiveIterator beyond) const + { + CGAL::Bbox_3 bbox = get(bpm, first->id()); + for(++first; first != beyond; ++first) + { + bbox += get(bpm, first->id()); + } + return bbox; + } + BPM bpm; +}; + +// For exact side_of_triangle_mesh +template +struct Side_of_helper +{ + typedef Node_vector_exact_vertex_point_map VPM; + + typedef CGAL::AABB_face_graph_triangle_primitive Primitive; + typedef CGAL::AABB_traits Traits; + typedef CGAL::AABB_tree Tree_type; + + static + VPM get_vpm(const Node_id_map& node_ids, + const VertexPointMap& vpm, + const NodeVector& node_vector) + { + return VPM(node_ids, vpm, node_vector); + } + + template + static + void build_tree(TriangleMesh& tm, + Tree_type& tree, + const Node_id_map& node_ids, + FaceIdMap fid, + const VertexPointMap& vpm, + const NodeVector& node_vector) + { + 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; + + // add primitives + tree.insert(faces(tm).begin(), faces(tm).end(), tm, get_vpm(node_ids, vpm, node_vector)); + + // pre-build bboxes (using approximation) + std::vector face_bboxes(num_faces(tm)); + + auto get_v_box = [&node_ids, &node_vector, &vpm](vertex_descriptor v) + { + typename Node_id_map::const_iterator it = node_ids.find(v); + if (it == node_ids.end()) + return get(vpm, v).bbox(); + return approx(node_vector.exact_node(it->second)).bbox(); + }; + + for (face_descriptor f : faces(tm)) + { + halfedge_descriptor h = halfedge(f, tm); + face_bboxes[get(fid, f)] = get_v_box( source(h, tm) ) + + get_v_box( target(h, tm) ) + + get_v_box( target(next(h, tm), tm) ); + } + + typedef CGAL::Pointer_property_map::type Id_to_box; + Id_to_box id_to_box = CGAL::make_property_map(face_bboxes); + typedef Property_map_binder BPM; + BPM bpm(fid, id_to_box); + Compute_bbox compute_bbox(bpm); + + typedef One_point_from_face_descriptor_map PPM; + PPM ppm(&tm, vpm); + + Split_primitives split_primitives(tm, ppm); + tree.custom_build(compute_bbox, split_primitives); + } +}; + +template +struct Side_of_helper +{ + typedef VertexPointMap VPM; + static + VPM get_vpm(const Node_id_map&, + const VertexPointMap& vpm, + const NodeVector&) + { + return vpm; + } + + typedef CGAL::AABB_face_graph_triangle_primitive Primitive; + typedef CGAL::AABB_traits Traits; + typedef CGAL::AABB_tree Tree_type; + + + template + static + void build_tree(TriangleMesh& tm, + Tree_type& tree, + const Node_id_map& /* node_ids */, + FaceIdMap /* fid */, + const VertexPointMap& vpm, + const NodeVector& /* node_vector */) + { + tree.insert(faces(tm).begin(), faces(tm).end(), tm, vpm); + tree.build(); + } +}; + // Parts to get default property maps for output meshes based on the value type // of input vertex point maps. template @@ -215,6 +416,7 @@ template struct Default_visitor{ typedef boost::graph_traits GT; typedef typename GT::face_descriptor face_descriptor; + typedef typename GT::halfedge_descriptor halfedge_descriptor; void before_subface_creations(face_descriptor /*f_old*/,TriangleMesh&){} void after_subface_creations(TriangleMesh&){} @@ -223,6 +425,9 @@ struct Default_visitor{ void before_face_copy(face_descriptor /*f_old*/, TriangleMesh&, TriangleMesh&){} void after_face_copy(face_descriptor /*f_old*/, TriangleMesh&, face_descriptor /* f_new */, TriangleMesh&){} + void before_edge_split(halfedge_descriptor /* h */, const TriangleMesh& /* tm */){} + void edge_split(halfedge_descriptor /* hnew */, const TriangleMesh& /* tm */){} + void after_edge_split(){} // calls commented in the code and probably incomplete due to the migration // see NODE_VISITOR_TAG @@ -420,12 +625,9 @@ struct Patch_description{ // shared_edges will be filled by halfedges pointing in the patch // that are inside `is_intersection_edge`, thus mesh boundary halfedges // are not necessarily inside. -template +template void extract_patch_simplices( - std::size_t patch_id, PolygonMesh& pm, - const FaceIndexMap fids, - const std::vector& patch_ids, std::vector::face_descriptor>& patch_faces, std::set::vertex_descriptor>& interior_vertices, std::vector::halfedge_descriptor>& interior_edges, @@ -437,22 +639,18 @@ void extract_patch_simplices( typedef typename GT::vertex_descriptor vertex_descriptor; typedef typename GT::face_descriptor face_descriptor; - for(face_descriptor f : faces(pm)) + for(face_descriptor f : patch_faces) { - if ( patch_ids[ get(fids, f) ]==patch_id ) + for(halfedge_descriptor h : + halfedges_around_face(halfedge(f, pm),pm)) { - patch_faces.push_back( f ); - for(halfedge_descriptor h : - halfedges_around_face(halfedge(f, pm),pm)) + if ( !is_intersection_edge.count(edge(h, pm)) ) { - if ( !is_intersection_edge.count(edge(h, pm)) ) - { - if ( h < opposite(h,pm) || is_border(opposite(h,pm),pm) ) - interior_edges.push_back( h ); - } - else - shared_edges.push_back(h); + if ( h < opposite(h,pm) || is_border(opposite(h,pm),pm) ) + interior_edges.push_back( h ); } + else + shared_edges.push_back(h); } } @@ -494,14 +692,19 @@ struct Patch_container{ , patch_ids(patch_ids) , fids(fids) , is_intersection_edge(is_intersection_edge) - {} + { + typedef boost::graph_traits GT; + typedef typename GT::face_descriptor face_descriptor; + + for(face_descriptor f : faces(pm)) + patches[patch_ids[ get(fids, f) ]].faces.push_back( f ); + } Patch_description& operator[](std::size_t i) { if ( !patches[i].is_initialized ) { extract_patch_simplices( - i, pm, - fids, patch_ids, + pm, patches[i].faces, patches[i].interior_vertices, patches[i].interior_edges, patches[i].shared_edges, is_intersection_edge @@ -521,28 +724,38 @@ struct Patch_container{ typedef typename GT::face_descriptor face_descriptor; Patch_description& patch=this->operator[](i); - out << "OFF\n" << patch.interior_vertices.size() + - patch.shared_edges.size(); - out << " " << patch.faces.size() << " 0\n"; + + std::stringstream ss; std::map vertexid; int id=0; for(vertex_descriptor vh : patch.interior_vertices) { vertexid[vh]=id++; - out << get(vertex_point, pm, vh) << "\n"; + ss << get(vertex_point, pm, vh) << "\n"; } for(halfedge_descriptor hh : patch.shared_edges) { - vertexid[target(hh, pm)]=id++; - out << get(vertex_point, pm, target(hh, pm)) << "\n"; + if( vertexid.insert( std::make_pair(target(hh,pm), id) ).second ) + { + ss << get(vertex_point, pm, target(hh, pm)) << "\n"; + ++id; + } + if( vertexid.insert( std::make_pair(source(hh,pm), id) ).second ) + { + ss << get(vertex_point, pm, source(hh, pm)) << "\n"; + ++id; + } } + out << "OFF\n" << id << " " << patch.faces.size() << " 0\n"; + out << ss.str(); + for(face_descriptor f : patch.faces) { - out << "3 " << vertexid[source(halfedge(f,pm),pm)] << - " " << vertexid[target(halfedge(f,pm),pm)] << - " " << vertexid[target(next(halfedge(f,pm),pm),pm)] << "\n"; + out << "3 " << vertexid.at(source(halfedge(f,pm),pm)) << + " " << vertexid.at(target(halfedge(f,pm),pm)) << + " " << vertexid.at(target(next(halfedge(f,pm),pm),pm)) << "\n"; } return out; @@ -559,6 +772,16 @@ struct Patch_container{ dump_patch(i, output); } } + void dump_patches(std::string prefix) + { + for (std::size_t i=0;i #include #include +#include #include #include @@ -98,9 +99,12 @@ struct Default_surface_intersection_visitor{ // If we implement a predicate only test, we can get rid of it. static const bool Predicates_on_constructions_needed = doing_autorefinement; static const bool do_need_vertex_graph = false; + void set_non_manifold_feature_map( + const TriangleMesh&, + const Non_manifold_feature_map&) + {} }; - struct Node_id_set { typedef std::size_t Node_id; @@ -187,6 +191,9 @@ class Intersection_of_triangle_meshes Node_visitor visitor; Faces_to_nodes_map f_to_node; //Associate a pair of triangles to their intersection points std::vector extra_terminal_nodes; //used only for autorefinement + Non_manifold_feature_map non_manifold_feature_map_1, + non_manifold_feature_map_2; + static const constexpr std::size_t NM_NID = (std::numeric_limits::max)(); CGAL_assertion_code(bool doing_autorefinement;) // member functions @@ -195,6 +202,7 @@ class Intersection_of_triangle_meshes const TriangleMesh& tm_e, const VPMF& vpm_f, const VPME& vpm_e, + const Non_manifold_feature_map& non_manifold_feature_map, bool throw_on_self_intersection) { std::vector face_boxes, edge_boxes; @@ -215,15 +223,38 @@ class Intersection_of_triangle_meshes edge_boxes.reserve(num_edges(tm_e)); edge_boxes_ptr.reserve(num_edges(tm_e)); - for(edge_descriptor ed : edges(tm_e)) - { - halfedge_descriptor h=halfedge(ed,tm_e); - edge_boxes.push_back( Box( - get(vpm_e,source(h,tm_e)).bbox() + - get(vpm_e,target(h,tm_e)).bbox(), - h ) ); - edge_boxes_ptr.push_back( &edge_boxes.back() ); - } + if (non_manifold_feature_map.non_manifold_edges.empty()) + // general manifold case + for(edge_descriptor ed : edges(tm_e)) + { + halfedge_descriptor h=halfedge(ed,tm_e); + edge_boxes.push_back( Box( + get(vpm_e,source(h,tm_e)).bbox() + + get(vpm_e,target(h,tm_e)).bbox(), + h ) ); + edge_boxes_ptr.push_back( &edge_boxes.back() ); + } + else + // non-manifold case + for(edge_descriptor ed : edges(tm_e)) + { + std::size_t eid=get(non_manifold_feature_map.e_nm_id, ed); + halfedge_descriptor h=halfedge(ed,tm_e); + // insert only one copy of a non-manifold edge + if (eid!=NM_NID) + { + if (non_manifold_feature_map.non_manifold_edges[eid].front()!=ed) + continue; + else + // make sure the halfedge used is consistant with stored one + h = halfedge(non_manifold_feature_map.non_manifold_edges[eid].front(), tm_e); + } + edge_boxes.push_back( Box( + get(vpm_e,source(h,tm_e)).bbox() + + get(vpm_e,target(h,tm_e)).bbox(), + h ) ); + edge_boxes_ptr.push_back( &edge_boxes.back() ); + } /// \todo experiments different cutoff values std::ptrdiff_t cutoff = 2 * std::ptrdiff_t( @@ -314,18 +345,34 @@ class Intersection_of_triangle_meshes get_or_create_node(const Cpl_inter_pt& ipt, Node_id& current_node, std::map& coplanar_node_map, - const TriangleMesh& tm1, - const TriangleMesh& tm2) + const Non_manifold_feature_map& nm_features_map_1, + const Non_manifold_feature_map& nm_features_map_2, + const TriangleMesh& tm1, + const TriangleMesh& tm2) { halfedge_descriptor h1=graph_traits::null_halfedge(),h2=h1; switch(ipt.type_1){ case ON_VERTEX: - h1=halfedge(target(ipt.info_1,tm1),tm1); + { + std::size_t vid1 = nm_features_map_1.non_manifold_vertices.empty() + ? NM_NID + : get(nm_features_map_1.v_nm_id, target(ipt.info_1,tm1)); + if (vid1==NM_NID) + h1=halfedge(target(ipt.info_1,tm1),tm1); + else + h1=halfedge(nm_features_map_1.non_manifold_vertices[vid1][0],tm1); + } break; case ON_EDGE : { - h1=opposite(ipt.info_1,tm1); - if (h1>ipt.info_1) h1=ipt.info_1; + std::size_t eid1 = nm_features_map_1.non_manifold_edges.empty() + ? NM_NID + : get(nm_features_map_1.e_nm_id, edge(ipt.info_1,tm1)); + if (eid1==NM_NID) + h1=ipt.info_1; + else + h1=halfedge(nm_features_map_1.non_manifold_edges[eid1][0],tm1); + h1=(std::max)(h1, opposite(h1, tm1)); } break; case ON_FACE : @@ -335,12 +382,26 @@ class Intersection_of_triangle_meshes } switch(ipt.type_2){ case ON_VERTEX: - h2=halfedge(target(ipt.info_2,tm2),tm2); + { + std::size_t vid2 = nm_features_map_2.non_manifold_vertices.empty() + ? NM_NID + : get(nm_features_map_2.v_nm_id, target(ipt.info_2,tm2)); + if (vid2==NM_NID) + h2=halfedge(target(ipt.info_2,tm2),tm2); + else + h2=halfedge(nm_features_map_2.non_manifold_vertices[vid2][0],tm2); + } break; case ON_EDGE : { - h2=opposite(ipt.info_2,tm2); - if (h2>ipt.info_2) h2=ipt.info_2; + std::size_t eid2 = nm_features_map_2.non_manifold_edges.empty() + ? NM_NID + : get(nm_features_map_2.e_nm_id, edge(ipt.info_2,tm2)); + if (eid2==NM_NID) + h2=ipt.info_2; + else + h2=halfedge(nm_features_map_2.non_manifold_edges[eid2][0],tm2); + h2=(std::max)(h2, opposite(h2, tm2)); } break; case ON_FACE : @@ -350,7 +411,7 @@ class Intersection_of_triangle_meshes } Key key(ipt.type_1, ipt.type_2, h1, h2); - if (&tm1==&tm2 && h1>h2) + if (&tm1==&tm2 && h2::iterator,bool> res= @@ -363,14 +424,14 @@ class Intersection_of_triangle_meshes } void add_intersection_point_to_face_and_all_edge_incident_faces(face_descriptor f_1, - halfedge_descriptor e_2, + halfedge_descriptor h_2, const TriangleMesh& tm1, const TriangleMesh& tm2, Node_id node_id) { - if (!is_border(e_2, tm2)) + if (!is_border(h_2, tm2)) { - face_descriptor f_2 = face(e_2, tm2); + face_descriptor f_2 = face(h_2, tm2); if(&tm1!=&tm2 || f_1!=f_2) { Face_pair face_pair = &tm1==&tm2 ? make_sorted_pair(f_1,f_2): @@ -381,10 +442,10 @@ class Intersection_of_triangle_meshes f_to_node[Face_pair_and_int(face_pair,0)].insert(node_id); } } - e_2 = opposite(e_2, tm2); - if (!is_border(e_2, tm2)) + h_2 = opposite(h_2, tm2); + if (!is_border(h_2, tm2)) { - face_descriptor f_2 = face(e_2, tm2); + face_descriptor f_2 = face(h_2, tm2); if(&tm1!=&tm2 || f_1!=f_2) { Face_pair face_pair = &tm1==&tm2 ? make_sorted_pair(f_1,f_2): @@ -465,6 +526,7 @@ class Intersection_of_triangle_meshes halfedge_descriptor f_2, const TriangleMesh& tm1, const TriangleMesh& tm2, + const Non_manifold_feature_map& nm_features_map_1, Node_id node_id, bool is_new_node) { @@ -475,42 +537,78 @@ class Intersection_of_triangle_meshes ? stm_edge_to_ltm_faces : ltm_edge_to_stm_faces; - for(halfedge_descriptor h_1 : - halfedges_around_target(v_1,tm1)) - { - add_intersection_point_to_face_and_all_edge_incident_faces(face(f_2,tm2),h_1,tm2,tm1,node_id); - typename Edge_to_faces::iterator it_ets=tm1_edge_to_tm2_faces.find(edge(h_1,tm1)); - if (it_ets!=tm1_edge_to_tm2_faces.end()) it_ets->second.erase(face(f_2,tm2)); - } + std::vector tmp_vertices_1(1, target(v_1, tm1)); + + std::size_t vid1 = nm_features_map_1.non_manifold_vertices.empty() + ? NM_NID + : get(nm_features_map_1.v_nm_id, target(v_1, tm1)); + + const std::vector& vertices_1 = vid1==NM_NID + ? tmp_vertices_1 + : nm_features_map_1.non_manifold_vertices[vid1]; + for(vertex_descriptor v1 : vertices_1) + for(halfedge_descriptor h_1 : + halfedges_around_target(v1,tm1)) + { + add_intersection_point_to_face_and_all_edge_incident_faces(face(f_2,tm2),h_1,tm2,tm1,node_id); + typename Edge_to_faces::iterator it_ets=tm1_edge_to_tm2_faces.find(edge(h_1,tm1)); + if (it_ets!=tm1_edge_to_tm2_faces.end()) it_ets->second.erase(face(f_2,tm2)); + } } void handle_coplanar_case_VERTEX_EDGE(halfedge_descriptor v_1, - halfedge_descriptor e_2, + halfedge_descriptor h_2, const TriangleMesh& tm1, const TriangleMesh& tm2, + const Non_manifold_feature_map& nm_features_map_1, + const Non_manifold_feature_map& nm_features_map_2, Node_id node_id, bool is_new_node) { if(is_new_node) - visitor.new_node_added(node_id,ON_VERTEX,e_2,v_1,tm2,tm1,false,false); + visitor.new_node_added(node_id,ON_VERTEX,h_2,v_1,tm2,tm1,false,false); Edge_to_faces& tm1_edge_to_tm2_faces = &tm1 <= &tm2 ? stm_edge_to_ltm_faces : ltm_edge_to_stm_faces; - for(halfedge_descriptor h_1 : - halfedges_around_target(v_1,tm1)) - { - typename Edge_to_faces::iterator it_ets=tm1_edge_to_tm2_faces.find(edge(h_1,tm1)); - Face_set* fset = (it_ets!=tm1_edge_to_tm2_faces.end())?&(it_ets->second):nullptr; - cip_handle_case_edge(node_id,fset,h_1,e_2,tm1,tm2); - } + std::vector tmp_vertices_1(1, target(v_1, tm1)); + + std::size_t vid1 = nm_features_map_1.non_manifold_vertices.empty() + ? NM_NID + : get(nm_features_map_1.v_nm_id, target(v_1, tm1)); + + const std::vector& vertices_1 = vid1==NM_NID + ? tmp_vertices_1 + : nm_features_map_1.non_manifold_vertices[vid1]; + + std::vector tmp_edges_2(1, edge(h_2, tm2)); + + std::size_t eid2 = nm_features_map_2.non_manifold_edges.empty() + ? NM_NID + : get(nm_features_map_2.e_nm_id, edge(h_2, tm2)); + + const std::vector& edges_2 = eid2==NM_NID + ? tmp_edges_2 + : nm_features_map_2.non_manifold_edges[eid2]; + + for (vertex_descriptor v1 : vertices_1) + for(halfedge_descriptor h_1 : + halfedges_around_target(v1,tm1)) + { + typename Edge_to_faces::iterator it_ets=tm1_edge_to_tm2_faces.find(edge(h_1,tm1)); + Face_set* fset = (it_ets!=tm1_edge_to_tm2_faces.end())?&(it_ets->second):nullptr; + for (edge_descriptor e2 : edges_2) + cip_handle_case_edge(node_id,fset,h_1,halfedge(e2, tm2),tm1,tm2); + } } void handle_coplanar_case_VERTEX_VERTEX(halfedge_descriptor v_1, halfedge_descriptor v_2, const TriangleMesh& tm1, const TriangleMesh& tm2, + const Non_manifold_feature_map& nm_features_map_1, + const Non_manifold_feature_map& nm_features_map_2, Node_id node_id, bool is_new_node) { @@ -521,13 +619,33 @@ class Intersection_of_triangle_meshes ? stm_edge_to_ltm_faces : ltm_edge_to_stm_faces; - for(halfedge_descriptor h_1 : - halfedges_around_target(v_1,tm1)) - { - typename Edge_to_faces::iterator it_ets=tm1_edge_to_tm2_faces.find(edge(h_1,tm1)); - Face_set* fset = (it_ets!=tm1_edge_to_tm2_faces.end())?&(it_ets->second):nullptr; - cip_handle_case_vertex(node_id,fset,h_1,v_2,tm1,tm2); - } + std::vector tmp_vertices_1(1, target(v_1, tm1)), + tmp_vertices_2(1, target(v_2, tm2)); + + std::size_t vid1 = nm_features_map_1.non_manifold_vertices.empty() + ? NM_NID + : get(nm_features_map_1.v_nm_id, target(v_1, tm1)); + + std::size_t vid2 = nm_features_map_2.non_manifold_vertices.empty() + ? NM_NID + : get(nm_features_map_2.v_nm_id, target(v_2, tm2)); + + const std::vector& vertices_1 = vid1==NM_NID + ? tmp_vertices_1 + : nm_features_map_1.non_manifold_vertices[vid1]; + const std::vector& vertices_2 = vid2==NM_NID + ? tmp_vertices_2 + : nm_features_map_2.non_manifold_vertices[vid2]; + + for (vertex_descriptor v1 : vertices_1) + for(halfedge_descriptor h_1 : + halfedges_around_target(v1,tm1)) + { + typename Edge_to_faces::iterator it_ets=tm1_edge_to_tm2_faces.find(edge(h_1,tm1)); + Face_set* fset = (it_ets!=tm1_edge_to_tm2_faces.end())?&(it_ets->second):nullptr; + for (vertex_descriptor v2 : vertices_2) + cip_handle_case_vertex(node_id,fset,h_1,halfedge(v2, tm2),tm1,tm2); + } } template @@ -535,7 +653,9 @@ class Intersection_of_triangle_meshes const TriangleMesh& tm1, const TriangleMesh& tm2, const VPM1& vpm1, - const VPM2& vpm2) + const VPM2& vpm2, + const Non_manifold_feature_map& nm_features_map_1, + const Non_manifold_feature_map& nm_features_map_2) { CGAL_assertion( &tm1 < &tm2 || &tm1==&tm2 ); @@ -554,7 +674,7 @@ class Intersection_of_triangle_meshes CGAL_assertion(&tm1!=&tm2 || f1!=f2); - typedef CGAL::Exact_predicates_exact_constructions_kernel EK; + typedef typename Node_vector::Exact_kernel EK; typedef Coplanar_intersection Cpl_inter_pt; std::list inter_pts; @@ -569,7 +689,7 @@ class Intersection_of_triangle_meshes Node_id node_id; bool is_new_node; std::tie(node_id, is_new_node) = - get_or_create_node(ipt,current_node,coplanar_node_map,tm1,tm2); + get_or_create_node(ipt,current_node,coplanar_node_map,nm_features_map_1,nm_features_map_2,tm1,tm2); cpln_nodes.push_back(node_id); switch(ipt.type_1){ @@ -577,13 +697,13 @@ class Intersection_of_triangle_meshes { switch(ipt.type_2){ case ON_VERTEX: - handle_coplanar_case_VERTEX_VERTEX(ipt.info_1,ipt.info_2,tm1,tm2,node_id,is_new_node); + handle_coplanar_case_VERTEX_VERTEX(ipt.info_1,ipt.info_2,tm1,tm2,nm_features_map_1,nm_features_map_2,node_id,is_new_node); break; case ON_EDGE: - handle_coplanar_case_VERTEX_EDGE(ipt.info_1,ipt.info_2,tm1,tm2,node_id,is_new_node); + handle_coplanar_case_VERTEX_EDGE(ipt.info_1,ipt.info_2,tm1,tm2,nm_features_map_1,nm_features_map_2,node_id,is_new_node); break; case ON_FACE: - handle_coplanar_case_VERTEX_FACE(ipt.info_1,ipt.info_2,tm1,tm2,node_id,is_new_node); + handle_coplanar_case_VERTEX_FACE(ipt.info_1,ipt.info_2,tm1,tm2,nm_features_map_1,node_id,is_new_node); break; default: CGAL_error_msg("Should not get there!"); } @@ -593,15 +713,33 @@ class Intersection_of_triangle_meshes { switch(ipt.type_2){ case ON_VERTEX: - handle_coplanar_case_VERTEX_EDGE(ipt.info_2,ipt.info_1,tm2,tm1,node_id,is_new_node); + handle_coplanar_case_VERTEX_EDGE(ipt.info_2,ipt.info_1,tm2,tm1,nm_features_map_2,nm_features_map_1,node_id,is_new_node); break; case ON_EDGE: { + std::vector tmp_edges_1(1, edge(ipt.info_1,tm1)), + tmp_edges_2(1, edge(ipt.info_2,tm2)); + std::size_t eid1 = nm_features_map_1.non_manifold_edges.empty() + ? NM_NID + : get(nm_features_map_1.e_nm_id, edge(ipt.info_1, tm1)); + std::size_t eid2 = nm_features_map_2.non_manifold_edges.empty() + ? NM_NID + : get(nm_features_map_2.e_nm_id, edge(ipt.info_2, tm2)); + const std::vector& edges_1 = eid1==NM_NID + ? tmp_edges_1 + : nm_features_map_1.non_manifold_edges[eid1]; + const std::vector& edges_2 = eid2==NM_NID + ? tmp_edges_2 + : nm_features_map_2.non_manifold_edges[eid2]; if(is_new_node) - visitor.new_node_added(node_id,ON_EDGE,ipt.info_1,ipt.info_2,tm1,tm2,false,false); - typename Edge_to_faces::iterator it_ets=stm_edge_to_ltm_faces.find(edge(ipt.info_1,tm1)); - Face_set* fset = (it_ets!=stm_edge_to_ltm_faces.end())?&(it_ets->second):nullptr; - cip_handle_case_edge(node_id,fset,ipt.info_1,ipt.info_2,tm1,tm2); + visitor.new_node_added(node_id,ON_EDGE,halfedge(edges_1.front(), tm1),halfedge(edges_2.front(),tm2),tm1,tm2,false,false); + for(edge_descriptor e1 : edges_1) + for(edge_descriptor e2 : edges_2) + { + typename Edge_to_faces::iterator it_ets=stm_edge_to_ltm_faces.find(e1); + Face_set* fset = (it_ets!=stm_edge_to_ltm_faces.end())?&(it_ets->second):nullptr; + cip_handle_case_edge(node_id,fset,halfedge(e1,tm1),halfedge(e2,tm2),tm1,tm2); + } } break; default: CGAL_error_msg("Should not get there!"); @@ -611,7 +749,7 @@ class Intersection_of_triangle_meshes case ON_FACE: { CGAL_assertion(ipt.type_2==ON_VERTEX); - handle_coplanar_case_VERTEX_FACE(ipt.info_2,ipt.info_1,tm2,tm1,node_id,is_new_node); + handle_coplanar_case_VERTEX_FACE(ipt.info_2,ipt.info_1,tm2,tm1,nm_features_map_2,node_id,is_new_node); } break; default: CGAL_error_msg("Should not get there!"); @@ -667,6 +805,8 @@ class Intersection_of_triangle_meshes const TriangleMesh& tm2, const VPM1& vpm1, const VPM2& vpm2, + const Non_manifold_feature_map& nm_features_map_1, + const Non_manifold_feature_map& nm_features_map_2, Node_id& current_node) { typedef std::tuple Inter_type; @@ -676,6 +816,7 @@ class Intersection_of_triangle_meshes it!=tm1_edge_to_tm2_faces.end();++it) { edge_descriptor e_1=it->first; + halfedge_descriptor h_1=halfedge(e_1,tm1); Face_set& fset=it->second; while (!fset.empty()){ @@ -687,18 +828,93 @@ class Intersection_of_triangle_meshes //handle degenerate case: one extremity of edge belong to f_2 std::vector all_edges; if ( std::get<3>(res) ) // is edge target in triangle plane - std::copy(halfedges_around_target(h_1,tm1).first, - halfedges_around_target(h_1,tm1).second, - std::back_inserter(all_edges)); + { + if (!nm_features_map_1.non_manifold_edges.empty()) + { + std::size_t vid1 = get(nm_features_map_1.v_nm_id, target(h_1, tm1)); + if (vid1 != NM_NID) + { + for (vertex_descriptor vd : nm_features_map_1.non_manifold_vertices[vid1]) + { + std::copy(halfedges_around_target(vd,tm1).first, + halfedges_around_target(vd,tm1).second, + std::back_inserter(all_edges)); + } + if (all_edges.front()!=h_1) + { + // restore expected property + typename std::vector::iterator pos = + std::find(all_edges.begin(), all_edges.end(), h_1); + CGAL_assertion(pos!=all_edges.end()); + std::swap(*pos, all_edges.front()); + } + } + else + std::copy(halfedges_around_target(h_1,tm1).first, + halfedges_around_target(h_1,tm1).second, + std::back_inserter(all_edges)); + } + else + std::copy(halfedges_around_target(h_1,tm1).first, + halfedges_around_target(h_1,tm1).second, + std::back_inserter(all_edges)); + } else{ if ( std::get<2>(res) ) // is edge source in triangle plane + { + if (!nm_features_map_1.non_manifold_edges.empty()) + { + std::size_t vid1 = get(nm_features_map_1.v_nm_id, source(h_1, tm1)); + if (vid1 != NM_NID) + { + for (vertex_descriptor vd : nm_features_map_1.non_manifold_vertices[vid1]) + { + std::copy(halfedges_around_source(vd,tm1).first, + halfedges_around_source(vd,tm1).second, + std::back_inserter(all_edges)); + } + if (all_edges.front()!=h_1) + { + // restore expected property + typename std::vector::iterator pos = + std::find(all_edges.begin(), all_edges.end(), h_1); + CGAL_assertion(pos!=all_edges.end()); + std::swap(*pos, all_edges.front()); + } + } + else + std::copy(halfedges_around_source(h_1,tm1).first, + halfedges_around_source(h_1,tm1).second, + std::back_inserter(all_edges)); + } + else std::copy(halfedges_around_source(h_1,tm1).first, halfedges_around_source(h_1,tm1).second, std::back_inserter(all_edges)); + } else + { all_edges.push_back(h_1); + edge_descriptor e_1 = edge(h_1, tm1); + if (!nm_features_map_1.non_manifold_edges.empty()) + { + std::size_t eid1 = get(nm_features_map_1.e_nm_id, e_1); + if (eid1 != NM_NID) + { + CGAL_assertion( nm_features_map_1.non_manifold_edges[eid1][0]==e_1 ); + for (std::size_t k=1; + k(res); + + std::size_t eid2 = nm_features_map_2.non_manifold_edges.empty() + ? NM_NID + : get(nm_features_map_2.e_nm_id, edge(h_2, tm2)); + + if (eid2!=NM_NID) + h_2 = halfedge(nm_features_map_2.non_manifold_edges[eid2].front(), tm2); + visitor.new_node_added(node_id,ON_EDGE,h_1,h_2,tm1,tm2,std::get<3>(res),std::get<2>(res)); for (;it_edge!=all_edges.end();++it_edge){ if ( it_edge!=all_edges.begin() ){ typename Edge_to_faces::iterator it_ets=tm1_edge_to_tm2_faces.find(edge(*it_edge,tm1)); Face_set* fset_bis = (it_ets!=tm1_edge_to_tm2_faces.end())?&(it_ets->second):nullptr; - cip_handle_case_edge(node_id,fset_bis,*it_edge,h_2,tm1,tm2); + if( eid2 == NM_NID ) + cip_handle_case_edge(node_id,fset_bis,*it_edge,h_2,tm1,tm2); + else + { + for (edge_descriptor e2 : nm_features_map_2.non_manifold_edges[eid2]) + cip_handle_case_edge(node_id,fset_bis,*it_edge,halfedge(e2, tm2),tm1,tm2); + } } else - cip_handle_case_edge(node_id,&fset,*it_edge,h_2,tm1,tm2); + { + if( eid2 == NM_NID ) + cip_handle_case_edge(node_id,&fset,*it_edge,h_2,tm1,tm2); + else + for (edge_descriptor e2 : nm_features_map_2.non_manifold_edges[eid2]) + cip_handle_case_edge(node_id,&fset,*it_edge,halfedge(e2, tm2),tm1,tm2); + } } } // end case ON_EDGE break; @@ -767,14 +1005,27 @@ class Intersection_of_triangle_meshes nodes.add_new_node(get(vpm2, target(h_2,tm2))); //we use the original vertex to create the node //before it was ON_FACE but do not remember why, probably a bug... visitor.new_node_added(node_id,ON_VERTEX,h_1,h_2,tm1,tm2,std::get<3>(res),std::get<2>(res)); + + std::size_t vid2 = nm_features_map_2.non_manifold_vertices.empty() + ? NM_NID + : get(nm_features_map_2.v_nm_id, target(h_2, tm2)); + for (;it_edge!=all_edges.end();++it_edge){ if ( it_edge!=all_edges.begin() ){ typename Edge_to_faces::iterator it_ets=tm1_edge_to_tm2_faces.find(edge(*it_edge,tm1)); Face_set* fset_bis = (it_ets!=tm1_edge_to_tm2_faces.end())?&(it_ets->second):nullptr; - cip_handle_case_vertex(node_id,fset_bis,*it_edge,h_2,tm1,tm2); + if( vid2 == NM_NID ) + cip_handle_case_vertex(node_id,fset_bis,*it_edge,h_2,tm1,tm2); + else + for (vertex_descriptor vd2 : nm_features_map_2.non_manifold_vertices[vid2]) + cip_handle_case_vertex(node_id,fset_bis,*it_edge,halfedge(vd2, tm2),tm1,tm2); } else - cip_handle_case_vertex(node_id,&fset,*it_edge,h_2,tm1,tm2); + if( vid2 == NM_NID ) + cip_handle_case_vertex(node_id,&fset,*it_edge,h_2,tm1,tm2); + else + for (vertex_descriptor vd2 : nm_features_map_2.non_manifold_vertices[vid2]) + cip_handle_case_vertex(node_id,&fset,*it_edge,halfedge(vd2, tm2),tm1,tm2); } } // end case ON_VERTEX break; @@ -1104,7 +1355,7 @@ class Intersection_of_triangle_meshes } else{ CGAL_assertion(segment.size()==1); - isolated_point_seen=true; + isolated_point_seen=true; // NOT TRUE CAN BE END POINT OF POLYLINE FALLING ONTO AN INPUT EDGE } } @@ -1290,6 +1541,20 @@ public: CGAL_assertion_code( doing_autorefinement=true; ) } +// setting maps of non manifold features + void set_non_manifold_feature_map_1(internal_np::Param_not_found){} + void set_non_manifold_feature_map_2(internal_np::Param_not_found){} + void set_non_manifold_feature_map_1(const Non_manifold_feature_map& m) + { + non_manifold_feature_map_1=m; + visitor.set_non_manifold_feature_map(nodes.tm1, non_manifold_feature_map_1); + } + void set_non_manifold_feature_map_2(const Non_manifold_feature_map& m) + { + non_manifold_feature_map_2=m; + visitor.set_non_manifold_feature_map(nodes.tm2, non_manifold_feature_map_2); + } + template OutputIterator operator()(OutputIterator output, bool throw_on_self_intersection, @@ -1302,18 +1567,18 @@ public: const VertexPointMap1& vpm1=nodes.vpm1; const VertexPointMap2& vpm2=nodes.vpm2; - filter_intersections(tm1, tm2, vpm1, vpm2, throw_on_self_intersection); - filter_intersections(tm2, tm1, vpm2, vpm1, throw_on_self_intersection); + filter_intersections(tm1, tm2, vpm1, vpm2, non_manifold_feature_map_2, throw_on_self_intersection); + filter_intersections(tm2, tm1, vpm2, vpm1, non_manifold_feature_map_1, throw_on_self_intersection); Node_id current_node((std::numeric_limits::max)()); CGAL_assertion(current_node+1==0); - +// TODO: handle non-manifold edges in coplanar #ifndef DO_NOT_HANDLE_COPLANAR_FACES //first handle coplanar triangles if (&tm1<&tm2) - compute_intersection_of_coplanar_faces(current_node, tm1, tm2, vpm1, vpm2); + compute_intersection_of_coplanar_faces(current_node, tm1, tm2, vpm1, vpm2, non_manifold_feature_map_1, non_manifold_feature_map_2); else - compute_intersection_of_coplanar_faces(current_node, tm2, tm1, vpm2, vpm1); + compute_intersection_of_coplanar_faces(current_node, tm2, tm1, vpm2, vpm1, non_manifold_feature_map_2, non_manifold_feature_map_1); visitor.set_number_of_intersection_points_from_coplanar_faces(current_node+1); if (!coplanar_faces.empty()) @@ -1329,8 +1594,10 @@ public: ? stm_edge_to_ltm_faces : ltm_edge_to_stm_faces; - compute_intersection_points(tm1_edge_to_tm2_faces, tm1, tm2, vpm1, vpm2, current_node); - compute_intersection_points(tm2_edge_to_tm1_faces, tm2, tm1, vpm2, vpm1, current_node); + compute_intersection_points(tm1_edge_to_tm2_faces, tm1, tm2, vpm1, vpm2, non_manifold_feature_map_1, non_manifold_feature_map_2, current_node); + compute_intersection_points(tm2_edge_to_tm1_faces, tm2, tm1, vpm2, vpm1, non_manifold_feature_map_2, non_manifold_feature_map_1, current_node); + + nodes.check_no_duplicates(); if (!build_polylines){ visitor.finalize(nodes,tm1,tm2,vpm1,vpm2); @@ -1377,7 +1644,7 @@ public: CGAL_assertion(current_node+1==0); //first handle coplanar triangles - compute_intersection_of_coplanar_faces(current_node, tm, tm, vpm, vpm); + compute_intersection_of_coplanar_faces(current_node, tm, tm, vpm, vpm, non_manifold_feature_map_1, non_manifold_feature_map_1); if (!coplanar_faces.empty()) visitor.input_have_coplanar_faces(); @@ -1385,7 +1652,7 @@ public: //compute intersection points of segments and triangles. //build the nodes of the graph and connectivity infos - compute_intersection_points(stm_edge_to_ltm_faces, tm, tm, vpm, vpm, current_node); + compute_intersection_points(stm_edge_to_ltm_faces, tm, tm, vpm, vpm, non_manifold_feature_map_1, non_manifold_feature_map_1, current_node); if (!build_polylines){ visitor.finalize(nodes,tm,tm,vpm,vpm); 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 99ff0a7815f..aa91b437311 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 @@ -43,6 +43,10 @@ template class Intersection_nodes { +//typedefs +public: + typedef CGAL::Exact_predicates_exact_constructions_kernel Exact_kernel; +private: //typedefs typedef typename boost::property_traits::value_type Point_3; CGAL_static_assertion((std::is_same::value_type, @@ -50,7 +54,6 @@ class Intersection_nodes::Kernel Input_kernel; typedef std::vector Nodes_vector; - typedef CGAL::Exact_predicates_exact_constructions_kernel Exact_kernel; typedef CGAL::Cartesian_converter Exact_to_double; typedef boost::graph_traits GT; typedef typename GT::halfedge_descriptor halfedge_descriptor; @@ -126,7 +129,13 @@ public: } void all_nodes_created(){} - void finalize() {} + template + void finalize(const Mesh_to_map_node&) {} + + void check_no_duplicates() + { + CGAL_assertion(nodes.size() == std::set(nodes.begin(), nodes.end()).size()); + } }; // end specialization // Intersection_nodes @@ -163,7 +172,6 @@ private: Exact_to_double exact_to_double; Exact_kernel ek; Exact_kernel::Intersect_3 exact_intersection; - std::vector tm1_vertices, tm2_vertices; const bool doing_autorefinement; public: @@ -272,40 +280,46 @@ public: } void all_nodes_created() - { - tm1_vertices.resize(enodes.size(), GT::null_vertex()); - tm2_vertices.resize(enodes.size(), GT::null_vertex()); - } + {} template // VertexPointMap1 or VertexPointMap2 - void call_put(const VPM& vpm, vertex_descriptor vd, std::size_t i, TriangleMesh& tm) + void call_put(const VPM& vpm, vertex_descriptor vd, std::size_t i, TriangleMesh&) { - put(vpm, vd, exact_to_double(enodes[i])); - if (&tm1==&tm) - { - if ( tm1_vertices[i] == GT::null_vertex() ) - { - tm1_vertices[i] = vd; - return; - } - if (doing_autorefinement) - tm2_vertices[i] = vd; - } - else - tm2_vertices[i] = vd; + put(vpm, vd, exact_to_double(enodes[i])); // Note this call is useless and only useful to see something in debug for intermediate results } - void finalize() + template + void finalize(const std::map& mesh_to_node_id_to_vertex) { - for (std::size_t i=0, e=enodes.size(); i!=e; ++i) + if (!doing_autorefinement) { - Point_3 pt = exact_to_double(enodes[i]); - if ( tm1_vertices[i] != GT::null_vertex() ) - put(vpm1, tm1_vertices[i], pt); - if ( tm2_vertices[i] != GT::null_vertex() ) - put(vpm2, tm2_vertices[i], pt); + const Node_id_to_vertex& tm1_vertices = mesh_to_node_id_to_vertex.find(&tm1)->second; + const Node_id_to_vertex& tm2_vertices = mesh_to_node_id_to_vertex.find(&tm2)->second; + for (std::size_t i=0, e=enodes.size(); i!=e; ++i) + { + Point_3 pt = exact_to_double(enodes[i]); + if ( tm1_vertices[i] != GT::null_vertex() ) + put(vpm1, tm1_vertices[i], pt); + if ( tm2_vertices[i] != GT::null_vertex() ) + put(vpm2, tm2_vertices[i], pt); + } + } + else{ + const Node_id_to_vertex& tm1_vertices = mesh_to_node_id_to_vertex.find(&tm1)->second; + for (std::size_t i=0, e=enodes.size(); i!=e; ++i) + { + Point_3 pt = exact_to_double(enodes[i]); + if ( tm1_vertices[i] != GT::null_vertex() ) + put(vpm1, tm1_vertices[i], pt); + } } } + + void check_no_duplicates() + { + CGAL_assertion(enodes.size() == std::set(enodes.begin(), enodes.end()).size()); + } + }; // end specialization // Intersection_nodes @@ -421,9 +435,16 @@ public: } void all_nodes_created(){} - void finalize() {} + + template + void finalize(const std::map&) + {} + void check_no_duplicates() + { + CGAL_assertion(nodes.size() == std::set(nodes.begin(), nodes.end()).size()); + } }; // end specialization 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 3c4efee0abb..3d4a6777fcc 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 @@ -17,7 +17,6 @@ #include -#include #include #include @@ -27,17 +26,16 @@ namespace CGAL{ namespace Polygon_mesh_processing { namespace Corefinement{ -template +template struct Intersect_coplanar_faces_3 { // typedefs typedef typename boost::property_traits::value_type Point; CGAL_static_assertion((std::is_same::value_type, - typename boost::property_traits::value_type>::value)); + typename boost::property_traits::value_type>::value)); typedef typename CGAL::Kernel_traits::Kernel Input_kernel; - typedef CGAL::Exact_predicates_exact_constructions_kernel Exact_kernel; typedef boost::graph_traits GT; typedef typename GT::halfedge_descriptor halfedge_descriptor; @@ -304,7 +302,7 @@ void intersection_coplanar_faces( halfedge_descriptor h1=halfedge(f1,tm1), h2=halfedge(f2,tm2); - Intersect_coplanar_faces_3 + Intersect_coplanar_faces_3 intersect_cpln(tm1, tm2, vpm1, vpm2); // We will add in `inter_pts` the initial triangle of h1 diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/predicates.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/predicates.h index 4b25b21e472..f0f65b62ee7 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/predicates.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/predicates.h @@ -109,6 +109,16 @@ bool sorted_around_edge( || ( s2 != NEGATIVE ); //true if the angle p1,o,q or the angle q,o,p2 is smaller than or equal to Pi } +template +bool p_is_below_q(const typename Kernel::Point_3& o_prime, const typename Kernel::Point_3& o, + const typename Kernel::Point_3& p, const typename Kernel::Point_3& q) +{ + CGAL::Orientation res = CGAL::orientation(o_prime, o, p, q); + CGAL_assertion(res != CGAL::COPLANAR); + + return res == CGAL::POSITIVE; +} + template bool are_triangles_coplanar_same_side( const typename Kernel::Point_3& o_prime, const typename Kernel::Point_3& o, @@ -167,6 +177,27 @@ bool sorted_around_edge( Node_id o_prime_index, : nodes.exact_node(q_index ) ); } +template +bool p_is_below_q( Node_id o_prime_index, + Node_id o_index, + Node_id p_index, + Node_id q_index, + vertex_descriptor p, + vertex_descriptor q, + const VPMP& vpm_p, + const VPMQ& vpm_q, + const Node_vector& nodes) +{ + const Node_id NID((std::numeric_limits::max)()); + return p_is_below_q( + nodes.exact_node(o_prime_index), + nodes.exact_node(o_index), + p_index == NID ? nodes.to_exact(get(vpm_p,p)) + : nodes.exact_node(p_index), + q_index == NID ? nodes.to_exact(get(vpm_q,q)) + : nodes.exact_node(q_index) ); +} + } } } // CGAL::Polygon_mesh_processing::Corefinement diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polygon_mesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polygon_mesh.h index f558eb76e68..53fcf62e09d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polygon_mesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polygon_mesh.h @@ -94,7 +94,9 @@ triangulate_hole_polygon_mesh(PolygonMesh& pmesh, OutputIterator out, VertexPointMap vpmap, bool use_delaunay_triangulation, - const Kernel& k) + const Kernel& k, + const bool use_cdt, + const typename Kernel::FT max_squared_distance) { typedef Halfedge_around_face_circulator Hedge_around_face_circulator; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; @@ -173,6 +175,13 @@ triangulate_hole_polygon_mesh(PolygonMesh& pmesh, // fill hole using polyline function, with custom tracer for PolygonMesh Tracer_polyhedron tracer(out, pmesh, P_edges); + +#ifndef CGAL_HOLE_FILLING_DO_NOT_USE_CDT2 + if(use_cdt && triangulate_hole_polyline_with_cdt(P, tracer, is_valid, k, max_squared_distance)) + { + return std::make_pair(tracer.out, CGAL::internal::Weight_min_max_dihedral_and_area(0,0)); + } +#endif CGAL::internal::Weight_min_max_dihedral_and_area weight = triangulate_hole_polyline(P, Q, tracer, WC(is_valid), use_delaunay_triangulation, k) 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 2fc28eec9a6..e60dafba2b1 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 @@ -22,6 +22,16 @@ #include #include #endif + +#ifndef CGAL_HOLE_FILLING_DO_NOT_USE_CDT2 +#include +#include +#include +#include +#include +#include +#endif + #include #include #include @@ -782,11 +792,13 @@ public: std::pair range(0, n-1); boost::tuple, bool, bool> res = construct_3D_triangulation(P, range, tr, edge_exist); if(!res.template get<2>()) { +#ifdef CGAL_HOLE_FILLING_VERBOSE #ifndef CGAL_TEST_SUITE CGAL_warning_msg(false, "Returning no output. Dimension of 3D Triangulation is below 2!"); #else std::cerr << "W: Returning no output. Dimension of 3D Triangulation is below 2!\n"; #endif +#endif return Weight::NOT_VALID(); } @@ -806,11 +818,13 @@ public: } if(W.get(0, n-1) == Weight::NOT_VALID()) { +#ifdef CGAL_HOLE_FILLING_VERBOSE #ifndef CGAL_TEST_SUITE CGAL_warning_msg(false, "Returning no output. No possible triangulation is found!"); #else std::cerr << "W: Returning no output. No possible triangulation is found!\n"; #endif +#endif return Weight::NOT_VALID(); } @@ -1002,7 +1016,9 @@ private: Triangulate_hole_polyline all_space; all_space.triangulate_all(P, Q, WC, std::make_pair(h.first, h.second), W, lambda); if(W.get(h.first, h.second) == Weight::NOT_VALID()) { +#ifdef CGAL_HOLE_FILLING_VERBOSE CGAL_warning_msg(false, "Returning no output. Filling hole with incomplete patches is not successful!"); +#endif return Weight::NOT_VALID(); } } @@ -1023,7 +1039,9 @@ private: Triangulate_hole_polyline all_space; all_space.triangulate_all(P, Q, WC, std::make_pair(h.first, h.second), W, lambda); if(W.get(h.first, h.second) == Weight::NOT_VALID()) { +#ifdef CGAL_HOLE_FILLING_VERBOSE CGAL_warning_msg(false, "Returning no output. Filling hole with incomplete patches is not successful!"); +#endif return Weight::NOT_VALID(); } } @@ -1038,7 +1056,9 @@ private: tr.clear(); boost::tuple, bool, bool> res = construct_3D_triangulation(P, h, tr, edge_exist); if(!boost::get<0>(res)) { +#ifdef CGAL_HOLE_FILLING_VERBOSE CGAL_warning_msg(false, "Returning no output. Filling hole with incomplete patches is not successful!"); +#endif return Weight::NOT_VALID(); } start_edge = *boost::get<0>(res); @@ -1098,12 +1118,14 @@ private: (P, Q, W, lambda, e_start, edge_graph, WC, false); if(W.get(0, n-1) == Weight::NOT_VALID()) { +#ifdef CGAL_HOLE_FILLING_VERBOSE #ifndef CGAL_TEST_SUITE CGAL_warning_msg(false, "Returning no output using Delaunay triangulation.\n Falling back to the general Triangulation framework."); #else std::cerr << "W: Returning no output using Delaunay triangulation.\n" << "Falling back to the general Triangulation framework.\n"; #endif +#endif return Weight::NOT_VALID(); } @@ -1144,11 +1166,13 @@ public: triangulate_all(P, Q, WC, std::make_pair(0,n-1), W, lambda); if(W.get(0,n-1) == Weight::NOT_VALID() || n <= 2) { +#ifdef CGAL_HOLE_FILLING_VERBOSE #ifndef CGAL_TEST_SUITE CGAL_warning_msg(false, "Returning no output. No possible triangulation is found!"); #else std::cerr << "W: Returning no output. No possible triangulation is found!\n"; #endif +#endif return Weight::NOT_VALID(); } @@ -1194,7 +1218,258 @@ public: } }; -/*********************************************************************************** +#ifndef CGAL_HOLE_FILLING_DO_NOT_USE_CDT2 + +/************************************************************************ + * Triangulate hole by using a cdt_2 + ************************************************************************/ +// /!\ points.first == points.last + +template +bool is_planar_2( + const std::vector& points, + const typename Traits::Vector_3& avg_normal, + const typename Traits::FT max_squared_distance, + const Traits& traits) { + + typedef typename Traits::FT FT; + typedef typename Traits::Point_3 Point_3; + typedef typename Traits::Plane_3 Plane_3; + typedef typename Traits::Construct_projected_point_3 Projection_3; + typedef typename Traits::Compute_squared_distance_3 Squared_distance_3; + + const Projection_3 projection_3 = + traits.construct_projected_point_3_object(); + const Squared_distance_3 squared_distance_3 = + traits.compute_squared_distance_3_object(); + + const std::size_t n = points.size() - 1; // the first equals to the last + if (n < 3) { + return false; // cant be a plane! + } + + // Compute centroid. + const Point_3 centroid = + CGAL::centroid(points.begin(), points.end() - 1); + + // Compute covariance matrix. + FT xx = FT(0), yy = FT(0), zz = FT(0); + FT xy = FT(0), xz = FT(0), yz = FT(0); + for (std::size_t i = 0; i < n; ++i) { + const Point_3& p = points[i]; + const FT dx = p.x() - centroid.x(); + const FT dy = p.y() - centroid.y(); + const FT dz = p.z() - centroid.z(); + xx += dx * dx; yy += dy * dy; zz += dz * dz; + xy += dx * dy; xz += dx * dz; yz += dy * dz; + } + + // Check the planarity. + const FT x = yy * zz - yz * yz; + const FT y = xx * zz - xz * xz; + const FT z = xx * yy - xy * xy; + FT maxv = -FT(1); + maxv = (CGAL::max)(maxv, x); + maxv = (CGAL::max)(maxv, y); + maxv = (CGAL::max)(maxv, z); + if (maxv <= FT(0)) { + return false; // a good plane does not exist for sure! + } + + // Here, avg_squared_distance is a little bit more tolerant than avg_distance^2. + CGAL_assertion(avg_normal != typename Traits::Vector_3()); + const Plane_3 plane = Plane_3(centroid, avg_normal); + FT avg_squared_distance = FT(0); + for (std::size_t i = 0; i < n; ++i) { + const Point_3& p = points[i]; + const Point_3 q = projection_3(plane, p); + avg_squared_distance += CGAL::abs(squared_distance_3(p, q)); + } + avg_squared_distance /= static_cast(n); + // std::cout << "avg squared distance: " << avg_squared_distance << std::endl; + + CGAL_assertion(max_squared_distance >= FT(0)); + if (avg_squared_distance > max_squared_distance) { + return false; // the user distance criteria are not satisfied! + } + + // std::cout << "The hole seems to be near planar." << std::endl; + return true; +} + +template < + typename PointRange, // need size() + typename Tracer, + typename Validity_checker, + typename Traits +> +bool +triangulate_hole_polyline_with_cdt(const PointRange& points, + Tracer& tracer, + const Validity_checker& is_valid, + const Traits& traits, + const typename Traits::FT max_squared_distance) +{ + typedef typename Traits::FT FT; + typedef typename Traits::Point_3 Point_3; + typedef typename Traits::Vector_3 Vector_3; + typedef typename Traits::Collinear_3 Collinear_3; + + // Compute an average normal of the hole. + const Collinear_3 collinear_3 = + traits.collinear_3_object(); + + std::vector P(std::begin(points), std::end(points)); + CGAL_assertion(P.size() >= 3); + if (P.front() != P.back()) { + P.push_back(P.front()); + } + + FT x = FT(0), y = FT(0), z = FT(0); + std::size_t num_normals = 0; + const Point_3& ref_point = P[0]; + const std::size_t size = P.size() - 1; + for (std::size_t i = 1; i < size - 1; ++i) { + const std::size_t ip = i + 1; + + const Point_3& p1 = ref_point; // 3 points, which form a triangle + const Point_3& p2 = P[i]; + const Point_3& p3 = P[ip]; + + // Skip in case we have collinear points. + if (collinear_3(p1, p2, p3)) { + continue; + } + + // Computing the normal of a triangle. + const Vector_3 n = CGAL::normal(p1, p2, p3); + // If it is a positive normal -> + if ( + ( n.x() > FT(0) ) || + ( n.x() == FT(0) && n.y() > FT(0) ) || + ( n.x() == FT(0) && n.y() == FT(0) && n.z() > FT(0) )) { + x += n.x(); y += n.y(); z += n.z(); + } else { // otherwise invert -> + x -= n.x(); y -= n.y(); z -= n.z(); + } + ++num_normals; + } + + if (num_normals < 1) { + // std::cerr << "WARNING: num normals, cdt 2 falls back to the original solution!" << std::endl; + return false; + } + + // Setting the final normal. + x /= static_cast(num_normals); + y /= static_cast(num_normals); + z /= static_cast(num_normals); + const Vector_3 avg_normal = Vector_3(x, y, z); + // std::cout << "avg normal: " << avg_normal << std::endl; + + // Checking the hole planarity. + if (!is_planar_2(P, avg_normal, max_squared_distance, traits)) { + // std::cerr << "WARNING: planarity, cdt 2 falls back to the original solution!" << std::endl; + return false; + } + + // Checking the hole simplicity. + typedef Triangulation_2_projection_traits_3 P_traits; + const P_traits p_traits(avg_normal); + if (!is_simple_2(P.begin(), P.end() - 1, p_traits)) { + // std::cerr << "WARNING: simplicity, cdt 2 falls back to the original solution!" << std::endl; + return false; + } + + Lookup_table_map lambda(static_cast(size), -1); + + // Create and fill the cdt_2. + typedef CGAL::Triangulation_vertex_base_with_info_2 Vb; + typedef CGAL::Triangulation_face_base_with_info_2 Fbi; + typedef CGAL::Constrained_triangulation_face_base_2 Fb; + typedef CGAL::Triangulation_data_structure_2 TDS; + // If the polygon is simple, there should be no intersection. + typedef CGAL::No_constraint_intersection_tag Itag; + typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; + P_traits cdt_traits(avg_normal); + CDT cdt(cdt_traits); + + std::vector< std::pair > points_and_ids; + points_and_ids.reserve(size); + for (std::size_t i = 0; i < size; ++i) { + points_and_ids.push_back(std::make_pair(P[i], i)); + } + + std::vector vertices(size); + cdt.insert(points_and_ids.begin(), points_and_ids.end()); + for (typename CDT::Vertex_handle v : cdt.finite_vertex_handles()) { + vertices[v->info()] = v; + } + + for (std::size_t i = 0; i < size; ++i) { + const std::size_t ip = (i + 1) % size; + if (vertices[i] != vertices[ip]) { + cdt.insert_constraint(vertices[i], vertices[ip]); + } + } + + // Mark external faces. + for (typename CDT::All_faces_iterator fit = cdt.all_faces_begin(), + end = cdt.all_faces_end(); fit != end; ++fit) { + fit->info() = 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()) { + continue; + } + + fh->info() = 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() != size) { + // std::cerr << "WARNING: dim + num vertices, cdt 2 falls back to the original solution!" << std::endl; + return false; + } + + // Fill the lambda. + for (typename CDT::Finite_faces_iterator fit = cdt.finite_faces_begin(), + end = cdt.finite_faces_end(); fit != end; ++fit) { + if (!fit->info()) { // if it is not external + + std::vector is(3); + for (int i = 0; i < 3; ++i) { + is[i] = static_cast(fit->vertex(i)->info()); + } + + std::sort(is.begin(), is.end()); + lambda.put(is[0], is[2], is[1]); + if (!is_valid(P, is[0], is[1], is[2])) { + // std::cerr << "WARNING: validity, cdt 2 falls back to the original solution!" << std::endl; + return false; + } + } + } + + // Call the tracer. It correctly orients the patch faces. + // std::cout << "CDT is being used!" << std::endl; + tracer(lambda, 0, static_cast(size) - 1); + return true; +} + +#endif + +/******************************************************************************* * Internal entry point for both polyline and Polyhedron_3 triangulation functions ***********************************************************************************/ 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 fd5a838f16b..169e6a66219 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include #include @@ -1771,6 +1771,11 @@ surface_intersection(const TriangleMesh& tm1, Corefinement::Intersection_of_triangle_meshes functor(tm1, tm2, vpm1, vpm2); + + // Fill non-manifold feature maps if provided + functor.set_non_manifold_feature_map_1(parameters::get_parameter(np1, internal_np::non_manifold_feature_map)); + functor.set_non_manifold_feature_map_2(parameters::get_parameter(np2, internal_np::non_manifold_feature_map)); + return functor(polyline_output, throw_on_self_intersection, true); } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/manifoldness.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/manifoldness.h index 5d3b20d2355..351019d5b11 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/manifoldness.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/manifoldness.h @@ -284,7 +284,7 @@ std::size_t make_umbrella_manifold(typename boost::graph_traits::ha /// \ingroup PMP_repairing_grp /// collects the non-manifold vertices (if any) present in the mesh. A non-manifold vertex `v` is returned -/// via one incident halfedge `h` such that `target(h, pm) = v` for all the umbrellas that `v` apppears in +/// via one incident halfedge `h` such that `target(h, pm) = v` for all the umbrellas that `v` appears in /// (an umbrella being the set of faces incident to all the halfedges reachable by walking around `v` /// using `hnext = prev(opposite(h, pm), pm)`, starting from `h`). /// diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orientation.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orientation.h index e85a3f6acfc..5e170ff0203 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orientation.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orientation.h @@ -53,8 +53,8 @@ namespace internal{ {} typedef bool result_type; - template - bool operator()(vertex_descriptor v1, vertex_descriptor v2) const + template + bool operator()(vertex_descriptor1 v1, vertex_descriptor2 v2) const { return CGAL::SMALLER == compare_z(get(vpmap, v1), get(vpmap, v2)); } 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 8a9889f9285..8254cfa4384 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 @@ -50,11 +50,12 @@ namespace CGAL { namespace Polygon_mesh_processing { namespace internal { -template +template std::array::halfedge_descriptor, 2> is_badly_shaped(const typename boost::graph_traits::face_descriptor f, TriangleMesh& tmesh, const VPM& vpm, + const VCM& vcm, const ECM& ecm, const Traits& gt, const double cap_threshold, // angle over 160° ==> cap @@ -70,58 +71,61 @@ is_badly_shaped(const typename boost::graph_traits::face_descripto halfedge_descriptor res = PMP::is_needle_triangle_face(f, tmesh, needle_threshold, parameters::vertex_point_map(vpm) .geom_traits(gt)); - if(res != null_h && !get(ecm, edge(res, tmesh))) + if(res != null_h && (!get(vcm, source(res, tmesh)) || !get(vcm, target(res, tmesh))) ) { // don't want to collapse edges that are too large - if(collapse_length_threshold == 0 || + if(collapse_length_threshold == 0 || edge_length(res, tmesh, parameters::vertex_point_map(vpm).geom_traits(gt)) <= collapse_length_threshold) { return make_array(res, null_h); } } - else // let's not make it possible to have a face be both a cap and a needle (for now) - { - res = PMP::is_cap_triangle_face(f, tmesh, cap_threshold, parameters::vertex_point_map(vpm).geom_traits(gt)); - if(res != null_h && !get(ecm, edge(res, tmesh))) - return make_array(null_h, res); - } + + res = PMP::is_cap_triangle_face(f, tmesh, cap_threshold, parameters::vertex_point_map(vpm).geom_traits(gt)); + if(res != null_h && !get(ecm, edge(res, tmesh))) + return make_array(null_h, res); return make_array(null_h, null_h); } -template +template void collect_badly_shaped_triangles(const typename boost::graph_traits::face_descriptor f, TriangleMesh& tmesh, const VPM& vpm, + const VCM& vcm, const ECM& ecm, const Traits& gt, const double cap_threshold, // angle over this threshold (as a cosine) ==> cap const double needle_threshold, // longest edge / shortest edge over this ratio ==> needle const double collapse_length_threshold, // max length of edges allowed to be collapsed - EdgeContainer& edges_to_collapse, - EdgeContainer& edges_to_flip) + HalfedgeContainer& edges_to_collapse, + HalfedgeContainer& edges_to_flip) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; - std::array res = is_badly_shaped(f, tmesh, vpm, ecm, gt, cap_threshold, + std::array res = is_badly_shaped(f, tmesh, vpm, vcm, ecm, gt, cap_threshold, needle_threshold, collapse_length_threshold); if(res[0] != boost::graph_traits::null_halfedge()) { -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES +#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA std::cout << "add new needle: " << edge(res[0], tmesh) << std::endl; #endif - edges_to_collapse.insert(edge(res[0], tmesh)); + CGAL_assertion(!is_border(res[0], tmesh)); + CGAL_assertion(!get(ecm, edge(res[0], tmesh))); + edges_to_collapse.insert(res[0]); } else // let's not make it possible to have a face be both a cap and a needle (for now) { if(res[1] != boost::graph_traits::null_halfedge()) { -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES +#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA std::cout << "add new cap: " << edge(res[1],tmesh) << std::endl; #endif - edges_to_flip.insert(edge(res[1], tmesh)); + CGAL_assertion(!is_border(res[1], tmesh)); + CGAL_assertion(!get(ecm, edge(res[1], tmesh))); + edges_to_flip.insert(res[1]); } } } @@ -254,8 +258,6 @@ get_best_edge_orientation(typename boost::graph_traits::edge_descr halfedge_descriptor h = halfedge(e, tmesh), ho = opposite(h, tmesh); - CGAL_assertion(!get(vcm, source(h, tmesh)) || !get(vcm, target(h, tmesh))); - boost::optional dv1 = get_collapse_volume(h, tmesh, vpm, gt); boost::optional dv2 = get_collapse_volume(ho, tmesh, vpm, gt); @@ -381,6 +383,9 @@ bool remove_almost_degenerate_faces(const FaceRange& face_range, typedef typename boost::property_map::type DVCM; DVCM vcm = get(Vertex_property_tag(), tmesh); + CGAL_precondition(is_valid_polygon_mesh(tmesh)); + CGAL_precondition(is_triangle_mesh(tmesh)); + for(face_descriptor f : face_range) { if(f == boost::graph_traits::null_face()) @@ -401,15 +406,22 @@ bool remove_almost_degenerate_faces(const FaceRange& face_range, } // Start the process of removing bad elements - std::set edges_to_collapse; - std::set edges_to_flip; + std::set edges_to_collapse; + std::set edges_to_flip; // @todo could probably do something a bit better by looping edges, consider the incident faces // f1 / f2 and look at f1 if f1 next_edges_to_collapse; - std::set next_edges_to_flip; + std::set next_edges_to_collapse; + std::set next_edges_to_flip; - // treat needles + // Treat needles =============================================================================== #ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA int kk=0; std::ofstream(std::string("tmp/n-00000.off")) << tmesh; #endif while(!edges_to_collapse.empty()) { - edge_descriptor e = *edges_to_collapse.begin(); + halfedge_descriptor h = *edges_to_collapse.begin(); edges_to_collapse.erase(edges_to_collapse.begin()); - CGAL_assertion(!get(ecm, e)); + CGAL_assertion(!is_border(h, tmesh)); - if(get(vcm, source(e, tmesh)) && get(vcm, target(e, tmesh))) + const edge_descriptor e = edge(h, tmesh); + CGAL_assertion(!get(ecm, edge(h, tmesh))); + + if(get(vcm, source(h, tmesh)) && get(vcm, target(h, tmesh))) continue; -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES - std::cout << " treat needle: " << e << " (" << tmesh.point(source (e, tmesh)) - << " --- " << tmesh.point(target(e, tmesh)) << ")" << std::endl; +#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA + std::cout << " treat needle: " << e + << " (" << source(e, tmesh) << " " << tmesh.point(source(h, tmesh)) + << " --- " << source(e, tmesh) << " " << tmesh.point(target(h, tmesh)) << ")" << std::endl; #endif if(CGAL::Euler::does_satisfy_link_condition(e, tmesh)) { - // the following edges are removed by the collapse - halfedge_descriptor h = halfedge(e, tmesh); - CGAL_assertion(!is_border(h, tmesh)); // because extracted from a face - - std::array nc = - internal::is_badly_shaped(face(h, tmesh), tmesh, vpm, ecm, gt, + // Verify that the element is still badly shaped + const std::array nc = + internal::is_badly_shaped(face(h, tmesh), tmesh, vpm, vcm, ecm, gt, cap_threshold, needle_threshold, collapse_length_threshold); if(nc[0] != h) { -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES - std::cerr << "Warning: Needle criteria no longer verified " << tmesh.point(source(e, tmesh)) << " " - << tmesh.point(target(e, tmesh)) << std::endl; +#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA + std::cout << "\t Needle criteria no longer verified" << std::endl; #endif - // the opposite edge might also have been inserted in the set and might still be a needle - h = opposite(h, tmesh); - if(is_border(h, tmesh)) - continue; - - nc = internal::is_badly_shaped(face(h, tmesh), tmesh, vpm, ecm, gt, - cap_threshold, needle_threshold, - collapse_length_threshold); - if(nc[0] != h) - continue; + continue; } + // pick the orientation of edge to keep the vertex minimizing the volume variation + const halfedge_descriptor best_h = internal::get_best_edge_orientation(e, tmesh, vpm, vcm, gt); + if(best_h == boost::graph_traits::null_halfedge()) + { +#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA + std::cout << "\t Geometrically invalid edge collapse!" << std::endl; +#endif + next_edges_to_collapse.insert(h); + continue; + } + + // Proceeding with the collapse, purge the sets from halfedges being removed for(int i=0; i<2; ++i) { if(!is_border(h, tmesh)) { - edge_descriptor pe = edge(prev(h, tmesh), tmesh); - edges_to_flip.erase(pe); - next_edges_to_collapse.erase(pe); - edges_to_collapse.erase(pe); + edges_to_flip.erase(h); + edges_to_collapse.erase(h); + next_edges_to_collapse.erase(h); + + halfedge_descriptor rm_h = prev(h, tmesh); + if(get(ecm, edge(rm_h, tmesh))) + rm_h = next(h, tmesh); + + edges_to_flip.erase(rm_h); + edges_to_collapse.erase(rm_h); + next_edges_to_collapse.erase(rm_h); + + halfedge_descriptor opp_rm_h = opposite(rm_h, tmesh); + edges_to_flip.erase(opp_rm_h); + edges_to_collapse.erase(opp_rm_h); + next_edges_to_collapse.erase(opp_rm_h); } h = opposite(h, tmesh); } - // pick the orientation of edge to keep the vertex minimizing the volume variation - h = internal::get_best_edge_orientation(e, tmesh, vpm, vcm, gt); - - if(h == boost::graph_traits::null_halfedge()) - { -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES - std::cerr << "Warning: geometrically invalid edge collapse! " - << tmesh.point(source(e, tmesh)) << " " - << tmesh.point(target(e, tmesh)) << std::endl; -#endif - next_edges_to_collapse.insert(e); - continue; - } - - edges_to_flip.erase(e); - next_edges_to_collapse.erase(e); // for edges added in faces incident to a vertex kept after a collapse #ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA - std::cerr << " " << kk << " -- Collapsing " << tmesh.point(source(h, tmesh)) << " " - << tmesh.point(target(h, tmesh)) << std::endl; + std::cout << " " << kk << " -- Collapsing " << tmesh.point(source(best_h, tmesh)) << " " + << tmesh.point(target(best_h, tmesh)) << std::endl; #endif + + CGAL_assertion(!get(vcm, source(best_h, tmesh))); + + // The function get_best_edge_orientation() has ensured that get(vcm, source(h, tmesh)) + // is not constrained, so get(ecm, e) is also not constrained for all e incident + // to source(h, tmesh). + // + // The function Euler::collapse_edge() removes edge(prev(h, tmesh)), but that edge + // might be constrained. In that case, next() must be removed instead. + vertex_descriptor v; + if(get(ecm, edge(prev(h, tmesh), tmesh))) + v = Euler::collapse_edge(edge(best_h, tmesh), tmesh, ecm); + else + v = Euler::collapse_edge(edge(best_h, tmesh), tmesh); + // moving to the midpoint is not a good idea. On a circle for example you might endpoint with // a bad geometry because you iteratively move one point // auto mp = midpoint(tmesh.point(source(h, tmesh)), tmesh.point(target(h, tmesh))); + // tmesh.point(v) = mp; - vertex_descriptor v = Euler::collapse_edge(edge(h, tmesh), tmesh); - - //tmesh.point(v) = mp; // examine all faces incident to the vertex kept for(halfedge_descriptor hv : halfedges_around_target(v, tmesh)) { if(!is_border(hv, tmesh)) { - internal::collect_badly_shaped_triangles(face(hv, tmesh), tmesh, vpm, ecm, gt, + internal::collect_badly_shaped_triangles(face(hv, tmesh), tmesh, vpm, vcm, ecm, gt, cap_threshold, needle_threshold, collapse_length_threshold, edges_to_collapse, edges_to_flip); } @@ -541,92 +566,84 @@ bool remove_almost_degenerate_faces(const FaceRange& face_range, #endif something_was_done = true; } - else + else // ! CGAL::Euler::does_satisfy_link_condition(e, tmesh) { -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES - std::cerr << "Warning: uncollapsable edge! " << tmesh.point(source(e, tmesh)) << " " - << tmesh.point(target(e, tmesh)) << std::endl; +#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA + std::cout << "\t Uncollapsable edge!" << std::endl; #endif - next_edges_to_collapse.insert(e); + next_edges_to_collapse.insert(h); } } - // treat caps + // Treat caps ================================================================================== + CGAL_assertion(next_edges_to_flip.empty()); + #ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA kk=0; std::ofstream(std::string("tmp/c-000.off")) << tmesh; #endif while(!edges_to_flip.empty()) { - edge_descriptor e = *edges_to_flip.begin(); + halfedge_descriptor h = *edges_to_flip.begin(); edges_to_flip.erase(edges_to_flip.begin()); + CGAL_assertion(!is_border(h, tmesh)); + + const edge_descriptor e = edge(h, tmesh); CGAL_assertion(!get(ecm, e)); - if(get(vcm, source(e, tmesh)) && get(vcm, target(e, tmesh))) - continue; - -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES - std::cout << "treat cap: " << e << " (" << tmesh.point(source(e, tmesh)) - << " --- " << tmesh.point(target(e, tmesh)) << ")" << std::endl; +#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA + std::cout << " treat cap: " << e + << " (" << source(e, tmesh) << " " << tmesh.point(source(h, tmesh)) + << " --- " << target(e, tmesh) << " " << tmesh.point(target(h, tmesh)) << ")" << std::endl; #endif - halfedge_descriptor h = halfedge(e, tmesh); - std::array nc = internal::is_badly_shaped(face(h, tmesh), tmesh, vpm, ecm, gt, + std::array nc = internal::is_badly_shaped(face(h, tmesh), tmesh, vpm, vcm, ecm, gt, cap_threshold, needle_threshold, collapse_length_threshold); - // First check the triangle is still a cap + // Check the triangle is still a cap if(nc[1] != h) { -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES - std::cerr << "Warning: Cap criteria no longer verified " << tmesh.point(source(e, tmesh)) << " --- " - << tmesh.point(target(e, tmesh)) << std::endl; +#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA + std::cout << "\t Cap criteria no longer verified" << std::endl; #endif - // the opposite edge might also have been inserted in the set and might still be a cap - h = opposite(h, tmesh); - if(is_border(h, tmesh)) - continue; - - nc = internal::is_badly_shaped(face(h, tmesh), tmesh, vpm, ecm, gt, - cap_threshold, needle_threshold, collapse_length_threshold); - if(nc[1] != h) - continue; + continue; } - // special case on the border + // special case of `edge(h, tmesh)` being a border edge --> remove the face if(is_border(opposite(h, tmesh), tmesh)) { - // remove the triangle - edges_to_flip.erase(edge(prev(h, tmesh), tmesh)); - edges_to_flip.erase(edge(next(h, tmesh), tmesh)); - next_edges_to_collapse.erase(edge(prev(h, tmesh), tmesh)); - next_edges_to_collapse.erase(edge(next(h, tmesh), tmesh)); + for(halfedge_descriptor hh : CGAL::halfedges_around_face(h, tmesh)) + { + // Remove from even 'next_edges_to_flip' because it might have been re-added from a flip + edges_to_flip.erase(hh); + next_edges_to_flip.erase(hh); + next_edges_to_collapse.erase(hh); + } + Euler::remove_face(h, tmesh); + something_was_done = true; continue; } + CGAL_assertion(!is_border(e, tmesh)); + // condition for the flip to be valid (the edge to be created does not already exist) if(!halfedge(target(next(h, tmesh), tmesh), target(next(opposite(h, tmesh), tmesh), tmesh), tmesh).second) { - if(!internal::should_flip(e, tmesh, vpm, gt)) { -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES - std::cout << "Flipping prevented: not the best diagonal" << std::endl; +#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA + std::cout << "\t Flipping prevented: not the best diagonal" << std::endl; #endif - next_edges_to_flip.insert(e); + next_edges_to_flip.insert(h); continue; } -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES - std::cout << "Flipping" << std::endl; -#endif #ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA - std::cerr << "step " << kk << "\n"; - std::cerr << " Flipping " << tmesh.point(source(h, tmesh)) << " " - << tmesh.point(target(h, tmesh)) << std::endl; + std::cout << "\t step " << kk << " -- Flipping" << std::endl; #endif Euler::flip_edge(h, tmesh); CGAL_assertion(edge(h, tmesh) == e); @@ -636,33 +653,28 @@ bool remove_almost_degenerate_faces(const FaceRange& face_range, { CGAL_assertion(!is_border(h, tmesh)); std::array nc = - internal::is_badly_shaped(face(h, tmesh), tmesh, vpm, ecm, gt, + internal::is_badly_shaped(face(h, tmesh), tmesh, vpm, vcm, ecm, gt, cap_threshold, needle_threshold, collapse_length_threshold); - if(nc[1] != boost::graph_traits::null_halfedge()) - { - if(edge(nc[1], tmesh) != e) - next_edges_to_flip.insert(edge(nc[1], tmesh)); - } - else - { - if(nc[0] != boost::graph_traits::null_halfedge()) - { - next_edges_to_collapse.insert(edge(nc[0], tmesh)); - } - } + if(nc[1] != boost::graph_traits::null_halfedge() && nc[1] != h) + next_edges_to_flip.insert(nc[1]); + else if(nc[0] != boost::graph_traits::null_halfedge()) + next_edges_to_collapse.insert(nc[0]); + h = opposite(h, tmesh); } + something_was_done = true; } -#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES - else + else // flipped edge already exists in the mesh { - std::cerr << "Warning: unflippable edge! " << tmesh.point(source(h, tmesh)) << " --- " - << tmesh.point(target(h, tmesh)) << std::endl; - next_edges_to_flip.insert(e); - } +#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA + std::cout << "\t Unflippable edge!" << std::endl; #endif + CGAL_assertion(!is_border(h, tmesh)); + next_edges_to_flip.insert(h); + } + #ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA std::string nb = std::to_string(++kk); if(kk<10) nb = std::string("0")+nb; @@ -673,11 +685,11 @@ bool remove_almost_degenerate_faces(const FaceRange& face_range, #endif } - std::swap(edges_to_collapse, next_edges_to_collapse); - std::swap(edges_to_flip, next_edges_to_flip); - if(!something_was_done) return false; + + std::swap(edges_to_collapse, next_edges_to_collapse); + std::swap(edges_to_flip, next_edges_to_flip); } return false; @@ -1495,7 +1507,7 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, face_set.insert(face(hd, tmesh)); } - CGAL_assertion(is_valid_polygon_mesh(tmesh)); + CGAL_expensive_assertion(is_valid_polygon_mesh(tmesh)); } } } @@ -1582,6 +1594,7 @@ bool remove_degenerate_faces(const FaceRange& face_range, const NamedParameters& np) { CGAL_assertion(CGAL::is_triangle_mesh(tmesh)); + CGAL_assertion(CGAL::is_valid_polygon_mesh(tmesh)); using parameters::get_parameter; using parameters::choose_parameter; 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 fe2a253f593..18153362c22 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 @@ -752,7 +752,7 @@ bool construct_tentative_hole_patch(std::vector > to_dump; for(const Face_indices& face : hole_faces) { @@ -1467,8 +1467,13 @@ remove_self_intersections_one_step(std::set faces_to_remove_copy = faces_to_remove; +#if defined(CGAL_PMP_REMOVE_SELF_INTERSECTION_DEBUG) || defined(CGAL_PMP_REMOVE_SELF_INTERSECTION_OUTPUT) + static int call_id = -1; + ++call_id; +#endif + #ifdef CGAL_PMP_REMOVE_SELF_INTERSECTION_DEBUG - std::cout << "##### running remove_self_intersections_one_step, step " << step + std::cout << "##### running remove_self_intersections_one_step (#" << call_id << "), step " << step << " with " << faces_to_remove.size() << " intersecting faces\n"; #endif @@ -1479,18 +1484,24 @@ remove_self_intersections_one_step(std::set) const { return false; } + }; + + typedef typename internal_np::Lookup_named_param_def < + internal_np::filter_t, + NamedParameters, + Return_false//default + > ::type Output_iterator_predicate; + Output_iterator_predicate out_it_predicates + = choose_parameter(get_parameter(np, internal_np::filter)); + // use containment check const double containment_epsilon = choose_parameter(get_parameter(np, internal_np::polyhedral_envelope_epsilon), 0.); @@ -2006,9 +2024,10 @@ bool remove_self_intersections(const FaceRange& face_range, // TODO : possible optimization to reduce the range to check with the bbox // of the previous patches or something. - self_intersections(working_face_range, tmesh, std::back_inserter(self_inter)); + self_intersections(working_face_range, tmesh, + CGAL::filter_output_iterator(std::back_inserter(self_inter), out_it_predicates)); #ifdef CGAL_PMP_REMOVE_SELF_INTERSECTION_DEBUG - std::cout << self_inter.size() << " intersecting pairs" << std::endl; + std::cout << " DEBUG: " << self_inter.size() << " intersecting pairs" << std::endl; #endif for(const Face_pair& fp : self_inter) { 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 17dfd0e0051..15d649393f9 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 @@ -42,11 +42,12 @@ #include #endif -#include +#include #include #include #include +#include #include #ifdef DOXYGEN_RUNNING @@ -503,11 +504,21 @@ bool does_self_intersect(const FaceRange& face_range, CGAL::Emptyset_iterator unused_out; internal::self_intersections_impl(face_range, tmesh, unused_out, true /*throw*/, np); } - catch(CGAL::internal::Throw_at_output_exception&) + catch (const CGAL::internal::Throw_at_output_exception&) { return true; } - + #if defined(CGAL_LINKED_WITH_TBB) && TBB_USE_CAPTURED_EXCEPTION + catch (const tbb::captured_exception& e) + { + const char* ti1 = e.name(); + const char* ti2 = typeid(const CGAL::internal::Throw_at_output_exception&).name(); + const std::string tn1(ti1); + const std::string tn2(ti2); + if (tn1 == tn2) return true; + else throw; + } + #endif return false; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/shape_predicates.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/shape_predicates.h index ebfb661d346..fb05b41b819 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/shape_predicates.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/shape_predicates.h @@ -358,6 +358,8 @@ is_needle_triangle_face(typename boost::graph_traits::face_descrip const NamedParameters& np) { CGAL_precondition(threshold >= 1.); + CGAL_precondition(f != boost::graph_traits::null_face()); + CGAL_precondition(CGAL::is_triangle(halfedge(f, tm), tm)); using parameters::get_parameter; using parameters::choose_parameter; @@ -462,7 +464,8 @@ is_cap_triangle_face(typename boost::graph_traits::face_descriptor const double threshold, const NamedParameters& np) { - CGAL_precondition(CGAL::is_triangle_mesh(tm)); + CGAL_precondition(f != boost::graph_traits::null_face()); + CGAL_precondition(CGAL::is_triangle(halfedge(f, tm), tm)); CGAL_precondition(threshold >= -1.); CGAL_precondition(threshold <= 0.); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h index 4387c52030b..e936df1bff9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h @@ -150,6 +150,7 @@ struct Dummy_cycle_rep_maintainer } // Dummies just to fit the API + void add_representative(const halfedge_descriptor) const { } void remove_representative(const halfedge_descriptor) const { } void clear_representatives() const { } @@ -214,13 +215,13 @@ public: { typedef typename boost::property_traits::reference Point_ref; - CGAL_assertion(!cycle_halfedges.empty()); - #ifdef CGAL_PMP_STITCHING_DEBUG std::cout << "update_representatives(" << cycle_halfedges.size() << ", " << filtered_stitchable_halfedges.size() << ")" << std::endl; #endif + CGAL_assertion(!cycle_halfedges.empty()); + for(const halfedge_descriptor h : cycle_halfedges) put(m_candidate_halfedges, h, true); @@ -332,17 +333,22 @@ void fill_pairs(const Halfedge& he, bool insertion_ok; std::tie(set_it, insertion_ok) = border_halfedge_map.emplace(he, std::make_pair(1,0)); - if(!insertion_ok) // we found already a halfedge with the points + if(!insertion_ok) // there is already a halfedge with the points { ++set_it->second.first; // increase the multiplicity if(set_it->second.first == 2) { + const Halfedge other_he = set_it->first; set_it->second.second = halfedge_pairs.size(); // set the id of the pair in the vector - halfedge_pairs.emplace_back(set_it->first, he); - if(get(vpm, source(he,pmesh)) == get(vpm, target(set_it->first, pmesh)) && - get(vpm, target(he,pmesh)) == get(vpm, source(set_it->first, pmesh))) + halfedge_pairs.emplace_back(other_he, he); + if(get(vpm, source(he,pmesh)) == get(vpm, target(other_he, pmesh)) && + get(vpm, target(he,pmesh)) == get(vpm, source(other_he, pmesh))) { - manifold_halfedge_pairs.push_back(true); + // Even if the halfedges are compatible, refuse to stitch if that would break the graph + if(face(opposite(he, pmesh), pmesh) == face(opposite(other_he, pmesh), pmesh)) + manifold_halfedge_pairs.push_back(false); + else + manifold_halfedge_pairs.push_back(true); } else { @@ -783,12 +789,12 @@ filter_stitchable_pairs(PolygonMesh& pmesh, } template + typename CycleRepMaintainer, typename VertexPointMap> std::size_t stitch_halfedge_range(const std::vector& to_stitch, const CandidateHalfedgeRange& representative_candidates, PolygonMesh& pmesh, - MaintainerVisitor& mv, - const VertexPointMap& vpm) + const VertexPointMap& vpm, + CycleRepMaintainer& cycle_reps_maintainer) { typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; @@ -818,7 +824,7 @@ std::size_t stitch_halfedge_range(const std::vector& to_stitch, const std::vector& to_stitch_filtered = filter_stitchable_pairs(pmesh, to_stitch, to_stitch_local, uf_vertices, uf_handles); - mv.update_representatives(representative_candidates, to_stitch_filtered, vpm); + cycle_reps_maintainer.update_representatives(representative_candidates, to_stitch_filtered, vpm); // Actually stitching run_stitch_borders(pmesh, to_stitch_filtered, vpm, uf_vertices, uf_handles); @@ -831,11 +837,11 @@ std::size_t stitch_halfedge_range(const std::vector& to_stitch, PolygonMesh& pmesh, const VertexPointMap& vpm) { - Dummy_cycle_rep_maintainer mv(pmesh); - return stitch_halfedge_range(to_stitch, halfedges(pmesh), pmesh, mv, vpm); + Dummy_cycle_rep_maintainer cycle_reps_maintainer(pmesh); + return stitch_halfedge_range(to_stitch, halfedges(pmesh), pmesh, vpm, cycle_reps_maintainer); } -//overload to avoid a useless copy +// overload to avoid a useless copy template std::size_t stitch_halfedge_range_dispatcher(const std::vector& to_stitch, PolygonMesh& pmesh, @@ -844,7 +850,7 @@ std::size_t stitch_halfedge_range_dispatcher(const std::vector& to return stitch_halfedge_range(to_stitch, pmesh, vpm); } -//overload to doing the copy +// overload making a copy template std::size_t stitch_halfedge_range_dispatcher(const HalfedgePairRange& to_stitch_const, PolygonMesh& pmesh, @@ -855,20 +861,182 @@ std::size_t stitch_halfedge_range_dispatcher(const HalfedgePairRange& to_stitch_ return stitch_halfedge_range(to_stitch, pmesh, vpm); } +// collect_duplicated_stitchable_boundary_edges() cannot handle configurations with non-manifoldness. +// However, even if non-manifoldness exists within a loop, it is safe choice to stitch consecutive +// stitchable halfedges +template +std::size_t zip_boundary_cycle(typename boost::graph_traits::halfedge_descriptor& bh, + const HalfedgeRange& cycle_halfedges, + PolygonMesh& pmesh, + const VPM vpm, + const HalfedgeKeeper& hd_kpr) +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + std::size_t stitched_boundary_cycles_n = 0; + + // Zipping cannot change the topology of the hole so the maintenance is trivial + internal::Dummy_cycle_rep_maintainer dummy_maintainer(pmesh); + + // A boundary cycle might need to be stitched starting from different extremities + // + // v11 ------ v10 + // | | + // v0 --- v1(v13) === v2(v12) v5(v9) === v6(v8) --- v7 + // | | + // v3 ------- v4 + // + // As long as we find vertices on the boundary with both incident halfedges being compatible, + // we zip it up as much as possible. + + // not everything is always stitchable + std::set unstitchable_halfedges; + + const halfedge_descriptor null_h = boost::graph_traits::null_halfedge(); + for(;;) // until there is nothing to stitch anymore + { + if(bh == null_h) // the complete boundary cycle is stitched + break; + +#ifdef CGAL_PMP_STITCHING_DEBUG + std::cout << "Walking border from halfedge: " << edge(bh, pmesh) << std::endl; +#endif + + CGAL_assertion(is_border(bh, pmesh)); + + halfedge_descriptor hn = next(bh, pmesh), start_h = null_h; + do + { + halfedge_descriptor hnn = next(hn, pmesh); + CGAL_assertion(get(vpm, target(hn, pmesh)) == get(vpm, source(hnn, pmesh))); + + if(get(vpm, source(hn, pmesh)) == get(vpm, target(hnn, pmesh)) && + !is_degenerate_edge(edge(hn, pmesh), pmesh, parameters::vertex_point_map(vpm))) + { + if(unstitchable_halfedges.count(hn) == 0) + { + start_h = hn; + break; + } + } + + hn = hnn; + } + while(hn != bh); + + if(start_h == null_h) // nothing to be stitched on this boundary cycle + break; + +#ifdef CGAL_PMP_STITCHING_DEBUG_PP + std::cout << "Starting stitching from halfedge: " + << get(vpm, source(edge(start_h, pmesh), pmesh)) << " " + << get(vpm, target(edge(start_h, pmesh), pmesh)) << std::endl; +#endif + + CGAL_assertion(is_border(start_h, pmesh)); + + // Associate as many consecutive halfedge pairs as possible ("zipping") + std::vector > hedges_to_stitch; + + halfedge_descriptor curr_h = start_h; + halfedge_descriptor curr_hn = next(curr_h, pmesh); + for(;;) // while we can expand the zipping range + { + // Don't create an invalid polygon mesh, even if the geometry allows it + if(face(opposite(curr_h, pmesh), pmesh) == face(opposite(curr_hn, pmesh), pmesh)) + { + unstitchable_halfedges.insert(curr_h); + bh = curr_hn; + break; + } + + CGAL_assertion(is_border(curr_h, pmesh)); + CGAL_assertion(is_border(curr_hn, pmesh)); + + if(hd_kpr(curr_h, curr_hn) == curr_h) + hedges_to_stitch.emplace_back(curr_h, curr_hn); + else + hedges_to_stitch.emplace_back(curr_hn, curr_h); + +#ifdef CGAL_PMP_STITCHING_DEBUG_PP + std::cout << "expand zip with:\n" + << edge(curr_h, pmesh) << "\n\t" << source(curr_h, pmesh) << "\t(" << get(vpm, source(curr_h, pmesh)) << ")" + << "\n\t" << target(curr_h, pmesh) << "\t(" << get(vpm, target(curr_h, pmesh)) << ")\n" + << edge(curr_hn, pmesh) << "\n\t" << source(curr_hn, pmesh) << "\t(" << get(vpm, source(curr_hn, pmesh)) << ")" + << "\n\t" << target(curr_hn, pmesh) << "\t(" << get(vpm, target(curr_hn, pmesh)) << ")" << std::endl; +#endif + + // check if we have reached the end of the boundary cycle + if(prev(curr_h, pmesh) == curr_hn || prev(curr_h, pmesh) == next(curr_hn, pmesh)) + { + bh = null_h; + break; + } + + curr_h = prev(curr_h, pmesh); + curr_hn = next(curr_hn, pmesh); + + // check if the next two halfedges are not geometrically compatible + if(get(vpm, source(curr_h, pmesh)) != get(vpm, target(curr_hn, pmesh)) || + is_degenerate_edge(edge(curr_hn, pmesh), pmesh, parameters::vertex_point_map(vpm))) + { + bh = curr_hn; + break; + } + } + + // bh must be a boundary halfedge on the border that will not be impacted by any stitching + CGAL_assertion_code(if(bh != null_h) {) + CGAL_assertion_code( for(const auto& hp : hedges_to_stitch) {) + CGAL_assertion( bh != hp.first && bh != hp.second); + CGAL_assertion_code(}}) + + if(!hedges_to_stitch.empty()) + { +#ifdef CGAL_PMP_STITCHING_DEBUG_PP + std::cout << hedges_to_stitch.size() " halfedge pairs to stitch on border containing:\n" + << edge(h, pmesh) << "\n\t" << source(h, pmesh) << "\t(" << get(vpm, source(h, pmesh)) << ")" + << "\n\t" << target(h, pmesh) << "\t(" << get(vpm, target(h, pmesh)) << ")" << std::endl; +#endif + + std::size_t local_stitches = internal::stitch_halfedge_range(hedges_to_stitch, cycle_halfedges, + pmesh, vpm, dummy_maintainer); + stitched_boundary_cycles_n += local_stitches; + + if(local_stitches == 0) // refused to stitch this halfedge pair range due to manifold issue + { +#ifdef CGAL_PMP_STITCHING_DEBUG_PP + std::cout << "Failed to stitch this range!" << std::endl; +#endif + + for(const auto& hp : hedges_to_stitch) + { + unstitchable_halfedges.insert(hp.first); + unstitchable_halfedges.insert(hp.second); + } + } + } + } + + return stitched_boundary_cycles_n; +} /// High-level functions -template -std::size_t stitch_boundary_cycle(const typename boost::graph_traits::halfedge_descriptor bh, +template +std::size_t stitch_boundary_cycle(const typename boost::graph_traits::halfedge_descriptor h, PolygonMesh& pmesh, - MaintainerVisitor& mv, + CycleRepMaintainer& cycle_reps_maintainer, const CGAL_PMP_NP_CLASS& np) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename std::pair halfedges_pair; - CGAL_precondition(bh != boost::graph_traits::null_halfedge()); - CGAL_precondition(is_border(bh, pmesh)); + CGAL_precondition(h != boost::graph_traits::null_halfedge()); + CGAL_precondition(is_border(h, pmesh)); CGAL_precondition(is_valid(pmesh)); using parameters::choose_parameter; @@ -884,18 +1052,38 @@ std::size_t stitch_boundary_cycle(const typename boost::graph_traits()); + halfedge_descriptor bh = h, bh_mem = bh; + std::vector cycle_halfedges; for(halfedge_descriptor h : halfedges_around_face(bh, pmesh)) cycle_halfedges.push_back(h); + std::size_t res = internal::zip_boundary_cycle(bh, cycle_halfedges, pmesh, vpm, hd_kpr); + if(bh == boost::graph_traits::null_halfedge()) // stitched everything + { + cycle_reps_maintainer.remove_representative(bh); + return res; + } + + // Re-compute the range if something was stitched + if(res != 0) + { + cycle_reps_maintainer.remove_representative(bh_mem); + cycle_reps_maintainer.add_representative(bh); + + cycle_halfedges.clear(); + for(halfedge_descriptor h : halfedges_around_face(bh, pmesh)) + cycle_halfedges.push_back(h); + } + std::vector to_stitch; internal::collect_duplicated_stitchable_boundary_edges(cycle_halfedges, pmesh, hd_kpr, false /*per cc*/, std::back_inserter(to_stitch), np); - mv.remove_representative(bh); + res += stitch_halfedge_range(to_stitch, cycle_halfedges, pmesh, vpm, cycle_reps_maintainer); - return stitch_halfedge_range(to_stitch, cycle_halfedges, pmesh, mv, vpm); + return res; } } //end of namespace internal @@ -920,7 +1108,7 @@ std::size_t stitch_boundary_cycle(const typename boost::graph_traits::%vertex_descriptor` /// as key type and `%Point_3` as value type} -/// \cgalParamDefault{`boost::get(CGAL::vertex_point, pm)`} +/// \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 @@ -936,8 +1124,8 @@ std::size_t stitch_boundary_cycle(const typename boost::graph_traits mv(pmesh); - return internal::stitch_boundary_cycle(h, pmesh, mv, np); + internal::Dummy_cycle_rep_maintainer dummy_maintainer(pmesh); + return internal::stitch_boundary_cycle(h, pmesh, dummy_maintainer, np); } template @@ -950,17 +1138,17 @@ std::size_t stitch_boundary_cycle(const typename boost::graph_traits + typename CycleRepMaintainer, typename CGAL_PMP_NP_TEMPLATE_PARAMETERS> std::size_t stitch_boundary_cycles(const BorderHalfedgeRange& boundary_cycle_representatives, PolygonMesh& pmesh, - MaintainerVisitor& mv, + CycleRepMaintainer& cycle_reps_maintainer, const CGAL_PMP_NP_CLASS& np) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; std::size_t stitched_boundary_cycles_n = 0; for(const halfedge_descriptor h : boundary_cycle_representatives) - stitched_boundary_cycles_n += stitch_boundary_cycle(h, pmesh, mv, np); + stitched_boundary_cycles_n += stitch_boundary_cycle(h, pmesh, cycle_reps_maintainer, np); return stitched_boundary_cycles_n; } @@ -988,7 +1176,7 @@ std::size_t stitch_boundary_cycles(const BorderHalfedgeRange& boundary_cycle_rep /// \cgalParamDescription{a property map associating points to the vertices of `pm`} /// \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, pm)`} +/// \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 @@ -1006,8 +1194,8 @@ std::size_t stitch_boundary_cycles(const BorderHalfedgeRange& boundary_cycle_rep { // If this API is called, we are not from stitch_borders() (otherwise there would be a maintainer) // so there is only one pass and we don't carea bout maintaining the cycle subset - internal::Dummy_cycle_rep_maintainer mv(pmesh); - return stitch_boundary_cycles(boundary_cycle_representatives, pmesh, mv, np); + internal::Dummy_cycle_rep_maintainer dummy_maintainer(pmesh); + return stitch_boundary_cycles(boundary_cycle_representatives, pmesh, dummy_maintainer, np); } ///\cond SKIP_IN_MANUAL @@ -1102,11 +1290,11 @@ std::size_t stitch_borders(PolygonMesh& pmesh, namespace internal { template std::size_t stitch_borders(const BorderHalfedgeRange& boundary_cycle_representatives, PolygonMesh& pmesh, - MaintainerVisitor& mv, + CycleRepMaintainer& cycle_maintainer, const CGAL_PMP_NP_CLASS& np) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; @@ -1130,35 +1318,34 @@ std::size_t stitch_borders(const BorderHalfedgeRange& boundary_cycle_representat bool per_cc = choose_parameter(get_parameter(np, internal_np::apply_per_connected_component), false); #ifdef CGAL_PMP_STITCHING_DEBUG - std::cout << "------- Stitch cycles... (" << boundary_cycle_representatives.size() << " cycle(s))" << std::endl; + std::cout << "------- Stitch cycles (#1)... (" << boundary_cycle_representatives.size() << " cycle(s))" << std::endl; #endif - std::size_t res = stitch_boundary_cycles(boundary_cycle_representatives, pmesh, mv, np); + std::size_t res = stitch_boundary_cycles(boundary_cycle_representatives, pmesh, cycle_maintainer, np); #ifdef CGAL_PMP_STITCHING_DEBUG - std::cout << "------- Stitched " << res << " in boundary cycles" << std::endl; + std::cout << "------- Stitched " << res << " halfedge pairs in boundary cycles" << std::endl; std::cout << "------- Stitch all..." << std::endl; #endif - const auto& to_consider = mv.halfedges_to_consider(); - mv.clear_representatives(); + const auto& to_consider = cycle_maintainer.halfedges_to_consider(); + cycle_maintainer.clear_representatives(); std::vector > to_stitch; internal::collect_duplicated_stitchable_boundary_edges(to_consider, pmesh, hd_kpr, per_cc, std::back_inserter(to_stitch), np); - - res += stitch_halfedge_range(to_stitch, to_consider, pmesh, mv, vpm); - - const auto& new_representatives = mv.cycle_representatives(); + res += stitch_halfedge_range(to_stitch, to_consider, pmesh, vpm, cycle_maintainer); #ifdef CGAL_PMP_STITCHING_DEBUG - std::cout << "------- Stitched " << res << " after cycles & general" << std::endl; - std::cout << "------- Stitch cycles (#2)... (" << new_representatives.size() << " cycles)" << std::endl; + std::cout << "------- Stitched " << res << " halfedge pairs after cycles & general" << std::endl; + std::cout << "------- Stitch cycles (#2)... (" << new_representatives.size() << " cycle(s))" << std::endl; #endif + const auto& new_representatives = cycle_maintainer.cycle_representatives(); + // Don't care about keeping track of the sub-cycles as this is the last pass - internal::Dummy_cycle_rep_maintainer null_mv(pmesh); - res += stitch_boundary_cycles(new_representatives, pmesh, null_mv, np); + internal::Dummy_cycle_rep_maintainer dummy_cycle_maintainer(pmesh); + res += stitch_boundary_cycles(new_representatives, pmesh, dummy_cycle_maintainer, np); #ifdef CGAL_PMP_STITCHING_DEBUG std::cout << "------- Stitched " << res << " (total)" << std::endl; @@ -1228,8 +1415,8 @@ std::size_t stitch_borders(const BorderHalfedgeRange& boundary_cycle_representat ) { // Need to keep track of the cycles since we are working on a subset of all the boundary cycles - internal::Boundary_cycle_rep_maintainer mv(pmesh); - return stitch_borders(boundary_cycle_representatives, pmesh, mv, np); + internal::Boundary_cycle_rep_maintainer cycle_reps_maintainer(pmesh); + return stitch_borders(boundary_cycle_representatives, pmesh, cycle_reps_maintainer, np); } /// \cond SKIP_IN_MANUAL @@ -1242,8 +1429,8 @@ std::size_t stitch_borders(const BorderHalfedgeRange& boundary_cycle_representat >::type* = 0) { // Need to keep track of the cycles since we are working on a subset of all the boundary cycles - internal::Boundary_cycle_rep_maintainer mv(pmesh); - return stitch_borders(boundary_cycle_representatives, pmesh, mv, parameters::all_default()); + internal::Boundary_cycle_rep_maintainer cycle_reps_maintainer(pmesh); + return stitch_borders(boundary_cycle_representatives, pmesh, cycle_reps_maintainer, parameters::all_default()); } template @@ -1256,8 +1443,8 @@ std::size_t stitch_borders(PolygonMesh& pmesh, extract_boundary_cycles(pmesh, std::back_inserter(boundary_cycle_representatives)); // We are working on all boundary cycles, so there is no need to keep track of any subset - internal::Dummy_cycle_rep_maintainer mv(pmesh); - return stitch_borders(boundary_cycle_representatives, pmesh, mv, np); + internal::Dummy_cycle_rep_maintainer dummy_maintainer(pmesh); + return stitch_borders(boundary_cycle_representatives, pmesh, dummy_maintainer, np); } template diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_hole.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_hole.h index 4e57a2f9626..98c33a0c0f0 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_hole.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_hole.h @@ -16,6 +16,7 @@ #include +#include #include #include #include @@ -42,10 +43,13 @@ namespace Polygon_mesh_processing { /*! \ingroup hole_filling_grp triangulates a hole in a polygon mesh. - The hole must not contain any non-manifold vertex, - nor self-intersections. - The patch generated does not introduce non-manifold edges nor degenerate triangles. - If a hole cannot be triangulated, `pmesh` is not modified and nothing is recorded in `out`. + + Depending on the choice of the underlying algorithm different preconditions apply. + When using the 2D constrained Delaunay triangulation, the border edges of the hole + must not intersect the surface. Otherwise, additionally, the boundary + of the hole must not contain any non-manifold vertex. The patch generated does not + introduce non-manifold edges nor degenerate triangles. If a hole cannot be triangulated, + `pmesh` is not modified and nothing is recorded in `out`. @tparam PolygonMesh a model of `MutableFaceGraph` @tparam OutputIterator a model of `OutputIterator` @@ -81,6 +85,27 @@ namespace Polygon_mesh_processing { \cgalParamExtra{If no valid triangulation can be found in this search space, the algorithm falls back to the non-Delaunay triangulations search space to find a solution.} \cgalParamNEnd + + \cgalParamNBegin{use_2d_constrained_delaunay_triangulation} + \cgalParamDescription{If `true`, the points of the boundary of the hole are used + to estimate a fitting plane and a 2D constrained Delaunay triangulation + is then used to fill the hole projected in the fitting plane.} + \cgalParamType{Boolean} + \cgalParamDefault{`true`} + \cgalParamExtra{If the boundary of the hole is not planar (according to the + parameter `threshold_distance`) or if no valid 2D triangulation + can be found, the algorithm falls back to the method using + the 3D Delaunay triangulation. This parameter is a good choice for near planar holes.} + \cgalParamNEnd + + \cgalParamNBegin{threshold_distance} + \cgalParamDescription{The maximum distance between the vertices of + the hole boundary and the least squares plane fitted to this boundary.} + \cgalParamType{double} + \cgalParamDefault{one quarter of the height of the bounding box of the hole} + \cgalParamExtra{This parameter is used only in conjunction with + the parameter `use_2d_constrained_delaunay_triangulation`.} + \cgalParamNEnd \cgalNamedParamsEnd @return `out` @@ -115,13 +140,45 @@ namespace Polygon_mesh_processing { #endif CGAL_precondition(face(border_halfedge, pmesh) == boost::graph_traits::null_face()); + bool use_cdt = + #ifdef CGAL_HOLE_FILLING_DO_NOT_USE_CDT2 + false; +#else + choose_parameter(get_parameter(np, internal_np::use_2d_constrained_delaunay_triangulation), false); +#endif - return internal::triangulate_hole_polygon_mesh(pmesh, + typename GeomTraits::FT max_squared_distance = typename GeomTraits::FT(-1); + if (use_cdt) { + + std::vector points; + typedef Halfedge_around_face_circulator Hedge_around_face_circulator; + const auto vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), get_property_map(vertex_point, pmesh)); + Hedge_around_face_circulator circ(border_halfedge, pmesh), done(circ); + do { + points.push_back(get(vpmap, target(*circ, pmesh))); + } while (++circ != done); + + const typename GeomTraits::Iso_cuboid_3 bbox = CGAL::bounding_box(points.begin(), points.end()); + typename GeomTraits::FT default_squared_distance = CGAL::abs(CGAL::squared_distance(bbox.vertex(0), bbox.vertex(5))); + default_squared_distance /= typename GeomTraits::FT(16); // one quarter of the bbox height + + const typename GeomTraits::FT threshold_distance = choose_parameter( + get_parameter(np, internal_np::threshold_distance), typename GeomTraits::FT(-1)); + max_squared_distance = default_squared_distance; + if (threshold_distance >= typename GeomTraits::FT(0)) + max_squared_distance = threshold_distance * threshold_distance; + CGAL_assertion(max_squared_distance >= typename GeomTraits::FT(0)); + } + + return internal::triangulate_hole_polygon_mesh( + pmesh, border_halfedge, out, choose_parameter(get_parameter(np, internal_np::vertex_point), get_property_map(vertex_point, pmesh)), use_dt3, - choose_parameter(get_parameter(np, internal_np::geom_traits))).first; + choose_parameter(get_parameter(np, internal_np::geom_traits)), + use_cdt, + max_squared_distance).first; } template @@ -192,6 +249,27 @@ namespace Polygon_mesh_processing { falls back to the non-Delaunay triangulations search space to find a solution.} \cgalParamNEnd + \cgalParamNBegin{use_2d_constrained_delaunay_triangulation} + \cgalParamDescription{If `true`, the points of the boundary of the hole are used + to estimate a fitting plane and a 2D constrained Delaunay triangulation + is then used to fill the hole projected in the fitting plane.} + \cgalParamType{Boolean} + \cgalParamDefault{`true`} + \cgalParamExtra{If the boundary of the hole is not planar (according to the + parameter `threshold_distance`) or if no valid 2D triangulation + can be found, the algorithm falls back to the method using + the 3D Delaunay triangulation. This parameter is a good choice for near planar holes.} + \cgalParamNEnd + + \cgalParamNBegin{threshold_distance} + \cgalParamDescription{The maximum distance between the vertices of + the hole boundary and the least squares plane fitted to this boundary.} + \cgalParamType{double} + \cgalParamDefault{one quarter of the height of the bounding box of the hole} + \cgalParamExtra{This parameter is used only in conjunction with + the parameter `use_2d_constrained_delaunay_triangulation`.} + \cgalParamNEnd + \cgalParamNBegin{density_control_factor} \cgalParamDescription{factor to control density of the ouput mesh, where larger values cause denser refinements, as in `refine()`} @@ -283,6 +361,27 @@ namespace Polygon_mesh_processing { falls back to the non-Delaunay triangulations search space to find a solution.} \cgalParamNEnd + \cgalParamNBegin{use_2d_constrained_delaunay_triangulation} + \cgalParamDescription{If `true`, the points of the boundary of the hole are used + to estimate a fitting plane and a 2D constrained Delaunay triangulation + is then used to fill the hole projected in the fitting plane.} + \cgalParamType{Boolean} + \cgalParamDefault{`true`} + \cgalParamExtra{If the boundary of the hole is not planar (according to the + parameter `threshold_distance`) or if no valid 2D triangulation + can be found, the algorithm falls back to the method using + the 3D Delaunay triangulation. This parameter is a good choice for near planar holes.} + \cgalParamNEnd + + \cgalParamNBegin{threshold_distance} + \cgalParamDescription{The maximum distance between the vertices of + the hole boundary and the least squares plane fitted to this boundary.} + \cgalParamType{double} + \cgalParamDefault{one quarter of the height of the bounding box of the hole} + \cgalParamExtra{This parameter is used only in conjunction with + the parameter `use_2d_constrained_delaunay_triangulation`.} + \cgalParamNEnd + \cgalParamNBegin{density_control_factor} \cgalParamDescription{factor to control density of the ouput mesh, where larger values cause denser refinements, as in `refine()`} @@ -409,6 +508,27 @@ namespace Polygon_mesh_processing { \cgalParamExtra{If no valid triangulation can be found in this search space, the algorithm falls back to the non-Delaunay triangulations search space to find a solution.} \cgalParamNEnd + + \cgalParamNBegin{use_2d_constrained_delaunay_triangulation} + \cgalParamDescription{If `true`, the points of the boundary of the hole are used + to estimate a fitting plane and a 2D constrained Delaunay triangulation + is then used to fill the hole projected in the fitting plane.} + \cgalParamType{Boolean} + \cgalParamDefault{`true`} + \cgalParamExtra{If the boundary of the hole is not planar (according to the + parameter `threshold_distance`) or if no valid 2D triangulation + can be found, the algorithm falls back to the method using + the 3D Delaunay triangulation. This parameter is a good choice for near planar holes.} + \cgalParamNEnd + + \cgalParamNBegin{threshold_distance} + \cgalParamDescription{The maximum distance between the vertices of + the hole boundary and the least squares plane fitted to this boundary.} + \cgalParamType{double} + \cgalParamDefault{one quarter of the height of the bounding box of the hole} + \cgalParamExtra{This parameter is used only in conjunction with + the parameter `use_2d_constrained_delaunay_triangulation`.} + \cgalParamNEnd \cgalNamedParamsEnd \todo handle islands @@ -426,7 +546,13 @@ namespace Polygon_mesh_processing { using parameters::choose_parameter; using parameters::get_parameter; - bool use_dt3 = + bool use_cdt = +#ifdef CGAL_HOLE_FILLING_DO_NOT_USE_CDT2 + false; +#else + choose_parameter(get_parameter(np, internal_np::use_2d_constrained_delaunay_triangulation), true); +#endif +bool use_dt3 = #ifdef CGAL_HOLE_FILLING_DO_NOT_USE_DT3 false; #else @@ -448,7 +574,32 @@ namespace Polygon_mesh_processing { typedef typename PointRange1::iterator InIterator; typedef typename std::iterator_traits::value_type Point; typedef typename CGAL::Kernel_traits::Kernel Kernel; +#ifndef CGAL_HOLE_FILLING_DO_NOT_USE_CDT2 + struct Always_valid{ + bool operator()(const std::vector&, int,int,int)const + {return true;} + }; + Always_valid is_valid; + const typename Kernel::Iso_cuboid_3 bbox = CGAL::bounding_box(points.begin(), points.end()); + typename Kernel::FT default_squared_distance = CGAL::abs(CGAL::squared_distance(bbox.vertex(0), bbox.vertex(5))); + default_squared_distance /= typename Kernel::FT(16); // one quarter of the bbox height + + const typename Kernel::FT threshold_distance = choose_parameter( + get_parameter(np, internal_np::threshold_distance), typename Kernel::FT(-1)); + typename Kernel::FT max_squared_distance = default_squared_distance; + if (threshold_distance >= typename Kernel::FT(0)) + max_squared_distance = threshold_distance * threshold_distance; + CGAL_assertion(max_squared_distance >= typename Kernel::FT(0)); + + if(!use_cdt || + !triangulate_hole_polyline_with_cdt( + points, + tracer, + is_valid, + choose_parameter(get_parameter(np, internal_np::geom_traits)), + max_squared_distance)) +#endif triangulate_hole_polyline(points, third_points, tracer, WC(), use_dt3, choose_parameter(get_parameter(np, internal_np::geom_traits))); diff --git a/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h b/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h index 53c16127926..b1d76c12950 100644 --- a/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h +++ b/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h @@ -729,7 +729,7 @@ private: for (unsigned int i = 0; i < cutp.size(); i++){ const Plane& plane_i = prism[cutp[i]]; - boost::optional op = intersection_point(line, plane_i.eplane); + boost::optional op = intersection_point_for_polyhedral_envelope(line, plane_i.eplane); if(! op){ std::cout << "there must be an intersection 2" << std::endl; } @@ -850,8 +850,8 @@ private: } for (unsigned int j = 0; j < cidl.size(); j++) { - boost::optional op = intersection_point(line, - halfspace[prismindex[queue[i]]][cidl[j]].eplane); + boost::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 (ip, idlist, jump1, check_id); @@ -1034,7 +1034,7 @@ private: const Plane& plane_i = prism[cutp[i]]; const eLine_3& eline = *(seg[k]); - boost::optional op = intersection_point(eline, plane_i.eplane); + boost::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; @@ -1088,7 +1088,7 @@ private: int inter = 0; - boost::optional ipp = intersection_point(tri_eplane, prism[cutp[i]].eplane, prism[cutp[j]].eplane); + boost::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(tri0, tri1, tri2, n, @@ -1528,8 +1528,8 @@ private: if (!cut) continue; for (unsigned int j = 0; j < cidl.size(); j++) { - boost::optional op = intersection_point(eline, - halfspace[prismindex[queue[i]]][cidl[j]].eplane); + boost::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); @@ -1612,8 +1612,8 @@ private: } // now we know that there exists an intesection point - boost::optional op = intersection_point(eline, - halfspace[filtered_intersection[queue[i]]][intersect_face[queue[i]][j]].eplane); + boost::optional op = intersection_point_for_polyhedral_envelope(eline, + halfspace[filtered_intersection[queue[i]]][intersect_face[queue[i]][j]].eplane); const ePoint_3& ip = *op; inter = Implicit_Seg_Facet_interpoint_Out_Prism_return_local_id_with_face_order(ip, idlist, idlistorder, jump1, check_id); @@ -1696,9 +1696,9 @@ private: // We moved the intersection here // In case there is no intersection point we continue boost::optional - op = intersection_point(etriangle_eplane, - halfspace[jump1][intersect_face[queue[i]][k]].eplane, - halfspace[jump2][intersect_face[queue[j]][h]].eplane); + op = intersection_point_for_polyhedral_envelope(etriangle_eplane, + halfspace[jump1][intersect_face[queue[i]][k]].eplane, + halfspace[jump2][intersect_face[queue[j]][h]].eplane); if(! op){ continue; } 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 66db17ed253..c93f3338999 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 @@ -176,6 +176,12 @@ public: : m_free_id(0) {} + //! move constructor + Rigid_triangle_mesh_collision_detection(Rigid_triangle_mesh_collision_detection&& other) + { + *this = std::move(other); + } + ~Rigid_triangle_mesh_collision_detection() { for (std::size_t k=0; k +#include +#include +#include +#include + +#include + +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef K::Point_3 P; +typedef CGAL::Surface_mesh

    Surface_mesh; + +namespace PMP = CGAL::Polygon_mesh_processing; + +int main() +{ +// polyline intersection with a non-manifold edge +{ + std::cout << "running polyline test\n"; + Surface_mesh tm1; + CGAL::make_quad(P(0,0,0), P(4,0,0), P(4,4,0), P(0,4,0), tm1); + CGAL::make_quad(P(0,-4,0), P(4,-4,0), P(4,0,0), P(0,0,0), tm1); + PMP::stitch_borders(tm1); + CGAL::make_quad(P(0,0,0), P(4,0,0), P(4,0,4), P(0,0,4), tm1); + CGAL::make_quad(P(0,0,0), P(4,0,0), P(4,0,-4), P(0,0,-4), tm1); + PMP::triangulate_faces(tm1); + + Surface_mesh tm2; + CGAL::make_quad(P(2,3,-2), P(2,-2,-2), P(2,-2,2), P(2,3,2), tm2); + PMP::triangulate_faces(tm2); + + PMP::Non_manifold_feature_map nm_map_1(tm1, get(boost::vertex_point, tm1)); + + std::vector< std::vector

    > polylines; + PMP::surface_intersection(tm1, tm2, std::back_inserter(polylines), CGAL::parameters::non_manifold_feature_map(nm_map_1)); + + //dump polylines + std::ofstream output("intersection_polylines.cgal"); + for(const std::vector

    & polyline : polylines) + { + output << polyline.size() << " "; + std::copy(polyline.begin(), polyline.end(),std::ostream_iterator

    (output," ")); + output << "\n"; + } +} + +// simple case with only one non-manifold edge +{ + std::cout << "running corefinement test 1\n"; + Surface_mesh tm1; + CGAL::make_quad(P(0,0,0), P(4,0,0), P(4,4,0), P(0,4,0), tm1); + CGAL::make_quad(P(0,-4,0), P(4,-4,0), P(4,0,0), P(0,0,0), tm1); + PMP::stitch_borders(tm1); + CGAL::make_quad(P(0,0,0), P(4,0,0), P(4,0,4), P(0,0,4), tm1); + CGAL::make_quad(P(0,0,0), P(4,0,0), P(4,0,-4), P(0,0,-4), tm1); + PMP::triangulate_faces(tm1); + + Surface_mesh tm2; + CGAL::make_quad(P(2,3,-2), P(2,-2,-2), P(2,-2,2), P(2,3,2), tm2); + PMP::triangulate_faces(tm2); + + PMP::Non_manifold_feature_map nm_map_1(tm1, get(boost::vertex_point, tm1)); + + PMP::corefine(tm1, tm2, CGAL::parameters::non_manifold_feature_map(nm_map_1)); + + std::ofstream("t1_tm1_corefined.off") << tm1; + std::ofstream("t1_tm2_corefined.off") << tm2; +} + +// edge-edge intersection on a non-manifold edge +{ + std::cout << "running corefinement test 2\n"; + Surface_mesh tm1; + CGAL::make_quad(P(0,0,0), P(4,0,0), P(4,4,0), P(0,4,0), tm1); + CGAL::make_quad(P(0,-4,0), P(4,-4,0), P(4,0,0), P(0,0,0), tm1); + PMP::stitch_borders(tm1); + CGAL::make_quad(P(0,0,0), P(4,0,0), P(4,0,4), P(0,0,4), tm1); + CGAL::make_quad(P(0,0,0), P(4,0,0), P(4,0,-4), P(0,0,-4), tm1); + PMP::triangulate_faces(tm1); + + Surface_mesh tm2; + CGAL::make_quad(P(2,2,-2), P(2,-2,-2), P(2,-2,2), P(2,2,2), tm2); //TODO: test me + also test splitting the diagonal + PMP::triangulate_faces(tm2); + + PMP::Non_manifold_feature_map nm_map_1(tm1, get(boost::vertex_point, tm1)); + + PMP::corefine(tm1, tm2, CGAL::parameters::non_manifold_feature_map(nm_map_1)); + + std::ofstream("t2_tm1_corefined.off") << tm1; + std::ofstream("t2_tm2_corefined.off") << tm2; +} + +// coplanar edge and non-manifold edge +{ + std::cout << "running corefinement test 3\n"; + Surface_mesh tm1; + CGAL::make_quad(P(0,0,0), P(8,0,0), P(8,8,0), P(0,8,0), tm1); + CGAL::make_quad(P(8,0,0), P(12,0,0), P(12,8,0), P(8,8,0), tm1); + PMP::stitch_borders(tm1); + CGAL::make_quad(P(8,0,0), P(8,8,0), P(8,8,4), P(8,0,4), tm1); + CGAL::make_quad(P(8,0,0), P(8,8,0), P(8,8,-4), P(8,0,-4), tm1); + PMP::triangulate_faces(tm1); + + Surface_mesh tm2; + CGAL::make_quad(P(6,1,0), P(14,3,0), P(13,7,4), P(5,5,0), tm2); + CGAL::make_quad(P(6,1,0), P(5,5,0), P(5,5,2), P(6,1,3), tm2); + PMP::stitch_borders(tm2); + PMP::triangulate_faces(tm2); + + std::ofstream("t3_tm1.off") << tm1; + std::ofstream("t3_tm2.off") << tm2; + + PMP::Non_manifold_feature_map nm_map_1(tm1, get(boost::vertex_point, tm1)); + + PMP::corefine(tm1, tm2, CGAL::parameters::non_manifold_feature_map(nm_map_1)); + + std::ofstream("t3_tm1_corefined.off") << tm1; + std::ofstream("t3_tm2_corefined.off") << tm2; +} + +//TODO: add more tests nm-edge on vertex, nm-edge vs nm-edge, ... + + +// coplanar face and non-manifold edge +{ + std::cout << "running corefinement test 4\n"; + Surface_mesh tm1; + CGAL::make_quad(P(0,0,0), P(8,0,0), P(8,8,0), P(0,8,0), tm1); + CGAL::make_quad(P(8,0,0), P(12,0,0), P(12,8,0), P(8,8,0), tm1); + PMP::stitch_borders(tm1); + CGAL::make_quad(P(8,0,0), P(8,8,0), P(8,8,4), P(8,0,4), tm1); + CGAL::make_quad(P(8,0,0), P(8,8,0), P(8,8,-4), P(8,0,-4), tm1); + PMP::triangulate_faces(tm1); + + Surface_mesh tm2; + CGAL::make_quad(P(6,1,0), P(14,3,0), P(13,7,0), P(5,5,0), tm2); + CGAL::make_quad(P(6,1,0), P(5,5,0), P(5,5,2), P(6,1,3), tm2); + PMP::stitch_borders(tm2); + PMP::triangulate_faces(tm2); + + std::ofstream("t4_tm1.off") << tm1; + std::ofstream("t4_tm2.off") << tm2; + + PMP::Non_manifold_feature_map nm_map_1(tm1, get(boost::vertex_point, tm1)); + + PMP::corefine(tm1, tm2, CGAL::parameters::non_manifold_feature_map(nm_map_1)); + + std::ofstream("t4_tm1_corefined.off") << tm1; + std::ofstream("t4_tm2_corefined.off") << tm2; +} +// +// // coplanar face and non-manifold edge and regular intersection with incident face +{ + std::cout << "running corefinement test 5\n"; + Surface_mesh tm1; + CGAL::make_quad(P(0,0,0), P(4,0,0), P(4,8,0), P(0,8,0), tm1); + CGAL::make_quad(P(4,0,0), P(12,0,0), P(12,8,0), P(4,8,0), tm1); + PMP::stitch_borders(tm1); + CGAL::make_quad(P(4,0,0), P(4,8,0), P(4,8,4), P(4,0,4), tm1); + CGAL::make_quad(P(4,0,0), P(4,8,0), P(4,8,-4), P(4,0,-4), tm1); + PMP::triangulate_faces(tm1); + + Surface_mesh tm2; + CGAL::make_quad(P(2,1,0), P(14,3,0), P(13,7,0), P(5,5,0), tm2); + CGAL::make_quad(P(2,1,0), P(5,5,0), P(5,5,2), P(2,1,3), tm2); + PMP::stitch_borders(tm2); + PMP::triangulate_faces(tm2); + + std::ofstream("t5_tm1.off") << tm1; + std::ofstream("t5_tm2.off") << tm2; + + PMP::Non_manifold_feature_map nm_map_1(tm1, get(boost::vertex_point, tm1)); + + PMP::corefine(tm1, tm2, CGAL::parameters::non_manifold_feature_map(nm_map_1)); + + std::ofstream("t5_tm1_corefined.off") << tm1; + std::ofstream("t5_tm2_corefined.off") << tm2; +} + +// coplanar face and 2 non-manifold edges +{ + std::cout << "running corefinement test 6\n"; + Surface_mesh tm1; + CGAL::make_quad(P(0,0,0), P(8,0,0), P(8,8,0), P(0,8,0), tm1); + CGAL::make_quad(P(8,0,0), P(12,0,0), P(12,8,0), P(8,8,0), tm1); + PMP::stitch_borders(tm1); + CGAL::make_quad(P(8,0,0), P(8,8,0), P(8,8,4), P(8,0,4), tm1); + CGAL::make_quad(P(8,0,0), P(8,8,0), P(8,8,-4), P(8,0,-4), tm1); + PMP::triangulate_faces(tm1); + + Surface_mesh tm2; + CGAL::make_quad(P(6,1,0), P(14,3,0), P(13,7,0), P(5,5,0), tm2); + CGAL::make_quad(P(6,1,0), P(5,5,0), P(5,5,2), P(6,1,3), tm2); + PMP::stitch_borders(tm2); + CGAL::make_quad(P(6,1,0), P(5,5,0), P(5,5,-2), P(6,1,-3), tm2); + CGAL::make_quad(P(6,1,0), P(5,5,0), P(3,5,0), P(3,1,0), tm2); + PMP::triangulate_faces(tm2); + + std::ofstream("t6_tm1.off") << tm1; + std::ofstream("t6_tm2.off") << tm2; + + PMP::Non_manifold_feature_map nm_map_1(tm1, get(boost::vertex_point, tm1)); + PMP::Non_manifold_feature_map nm_map_2(tm2, get(boost::vertex_point, tm2)); + +#if 0 + std::vector< std::vector

    > polylines; + PMP::surface_intersection(tm1, tm2, std::back_inserter(polylines), + CGAL::parameters::non_manifold_feature_map(nm_map_1), + CGAL::parameters::non_manifold_feature_map(nm_map_2)); + + //dump polylines + std::ofstream output("intersection_polylines.cgal"); + for(const std::vector

    & polyline : polylines) + { + output << polyline.size() << " "; + std::copy(polyline.begin(), polyline.end(),std::ostream_iterator

    (output," ")); + output << "\n"; + } +#else + PMP::corefine(tm1, tm2, CGAL::parameters::non_manifold_feature_map(nm_map_1), + CGAL::parameters::non_manifold_feature_map(nm_map_2)); + + std::ofstream("t6_tm1_corefined.off") << tm1; + std::ofstream("t6_tm2_corefined.off") << tm2; +#endif +} + + +} diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_complex_hole.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_complex_hole.off new file mode 100644 index 00000000000..5498b839df5 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_complex_hole.off @@ -0,0 +1,8192 @@ +OFF +2737 5453 0 +0.262933 0.102269 0.138247 +0.0843142 0.0418575 -0.0419302 +0.0676609 -0.0308717 0.133371 +0.202895 0.468475 0.0802072 +0.113075 -0.465378 -0.0546734 +0.225577 -0.277149 -0.193776 +-0.146525 -0.22403 -0.169286 +-0.0249865 -0.129931 -0.13238 +-0.160965 -0.480027 -0.0707824 +0.0794063 -0.415277 -0.0839096 +0.0469116 -0.050008 0.252355 +-0.0998372 -0.193745 -0.16268 +-0.111131 -0.104825 -0.14166 +-0.061459 -0.0977343 -0.133353 +-0.247783 -0.131539 0.0722694 +-0.145972 -0.486627 -0.0633275 +0.0916759 0.0333604 -0.133002 +-0.184954 -0.325468 -0.133853 +0.0847778 -0.432659 -0.0978527 +-0.210776 -0.299151 0.0751516 +-0.151539 -0.388715 0.01282 +-0.154564 -0.438244 -0.0249412 +-0.123411 -0.0182656 0.0135824 +0.00773278 -0.053391 -0.0428874 +-0.0774524 -0.292395 -0.106335 +0.0201594 -0.263586 0.119859 +-0.105646 -0.0365155 -0.0770751 +-0.113391 -0.41896 -0.0906771 +-0.128213 -0.46259 -0.0994907 +-0.160526 -0.468057 -0.0393445 +0.197609 -0.127492 -0.0574767 +0.0757306 -0.449539 -0.0614557 +0.147148 -0.412461 -0.0801639 +0.103782 -0.333007 0.0288926 +0.108917 -0.401981 -0.00841926 +0.11392 -0.408931 -0.0973654 +0.129733 -0.31331 -0.0672325 +0.0904388 -0.356531 -0.0803906 +0.0359798 -0.255445 -0.113562 +-0.22312 -0.107007 -0.0611904 +-0.163408 -0.433458 -0.0704785 +-0.0915185 -0.473885 -0.0165533 +-0.141417 -0.474418 -0.0834065 +-0.0944539 -0.479454 -0.0663683 +-0.085985 -0.101282 0.158093 +-0.0225438 -0.0889567 -0.0848587 +0.092707 -0.109496 -0.114561 +-0.159213 -0.159272 -0.138793 +-0.24541 -0.230248 -0.110578 +0.183744 -0.231931 0.0176086 +0.294273 -0.0955008 0.116328 +-0.16477 -0.385872 -0.0413331 +-0.185303 -0.313456 -0.00374653 +-0.297084 -0.262835 -0.00415653 +0.167756 -0.128776 0.197921 +-0.0273811 0.0608812 -0.0989637 +0.208303 0.00452459 -0.0746544 +-0.150831 -0.448909 -0.0901866 +-0.0720206 -0.147118 -0.154796 +-0.0197986 -0.210658 -0.154154 +-0.130593 -0.498558 -0.021161 +0.129662 -0.373473 -0.0794411 +-0.120692 -0.481168 -0.0685411 +-0.108692 -0.494274 -0.0429275 +-0.0970902 -0.252938 -0.14843 +-0.0098054 -0.335319 -0.0147292 +0.0769246 -0.410346 -0.0391239 +-0.132409 -0.464154 -0.0197707 +-0.102806 -0.4217 0.00855496 +-0.0760332 -0.34128 0.100617 +-0.104435 -0.377391 0.0553722 +-0.14788 -0.33188 0.0922673 +-0.151409 -0.218926 0.165812 +-0.111518 -0.286925 0.148566 +-0.0458796 -0.210094 0.18627 +0.0439919 -0.147905 0.137964 +-0.0358575 -0.361749 0.0457868 +0.0284346 -0.311464 0.0537885 +0.0409609 -0.0869988 -0.085353 +0.118462 -0.0465078 -0.0483438 +-0.141108 -0.422593 -0.0846889 +-0.129145 -0.379198 -0.0712284 +-0.149426 -0.329507 -0.0473837 +-0.212723 -0.300322 -0.0706413 +-0.156151 -0.403775 -0.0651516 +-0.077704 -0.400019 -0.0437424 +-0.0783601 -0.342543 -0.0687412 +-0.0202922 -0.309739 -0.0758353 +0.0501325 -0.290557 -0.0430839 +0.0954448 -0.256567 0.0733017 +0.144565 -0.158299 0.0913557 +0.0562207 -0.179498 -0.140905 +0.16863 -0.175124 -0.176771 +0.121523 -0.241503 -0.138152 +0.196749 0.136407 0.00365942 +0.14057 0.277481 0.154966 +0.156168 -0.385879 -0.0324162 +-0.146564 -0.288069 -0.168907 +-0.212533 -0.256019 -0.170893 +0.0775241 -0.353084 -0.0221894 +-0.161054 -0.48311 -0.0516067 +-0.151386 -0.488726 -0.0297486 +-0.167299 -0.464731 -0.058517 +-0.167494 -0.44542 -0.0440266 +-0.166175 -0.416312 -0.0405929 +-0.155665 -0.409399 -0.0112037 +-0.130777 -0.428881 -0.00549876 +-0.162855 -0.460869 -0.0783452 +-0.0949104 -0.0628065 -0.118829 +-0.171364 -0.0681205 -0.104606 +-0.189411 -0.0391257 -0.0301772 +-0.201329 -0.0450332 0.0672375 +-0.0621659 -0.0595357 -0.0819357 +-0.0724451 -0.0386843 -0.0212262 +-0.0317016 -0.00827391 0.0812953 +0.125617 -0.445138 -0.086335 +0.16914 -0.45638 -0.0514974 +-0.188699 -0.102786 0.151505 +-0.127982 -0.406882 0.0143939 +-0.130706 -0.384 0.0373578 +-0.17253 -0.34721 0.0442322 +-0.136499 -0.357829 0.0655808 +-0.101729 -0.398953 0.0314689 +-0.06477 -0.393705 0.00175031 +-0.0683606 -0.382507 0.0422398 +-0.0619729 -0.361557 0.0725343 +-0.0129886 -0.329893 0.099078 +-0.0485077 -0.306718 0.14972 +-0.0586671 -0.359537 -0.0297503 +-0.105132 -0.354471 0.0834642 +-0.111953 -0.324339 0.110194 +-0.146952 -0.298663 0.122985 +-0.147935 -0.259899 0.146585 +-0.224685 -0.230598 0.12386 +-0.194785 -0.274899 0.125615 +-0.1144 -0.250007 0.185149 +-0.10665 -0.185071 0.204627 +-0.155805 -0.154327 0.174517 +-0.215755 -0.165279 0.142947 +-0.0743299 -0.277016 0.17853 +-0.0218198 -0.257755 0.16445 +0.000800113 -0.199671 0.138749 +-0.0254547 -0.133829 0.140633 +0.0635315 -0.20852 0.111271 +-0.0256804 -0.0569419 0.140514 +-0.0948894 -0.0414189 0.110395 +-0.0705488 -0.0374163 0.0415111 +-0.00760713 -0.0195458 0.0164934 +0.0499878 0.0289775 0.0673286 +0.140466 0.0718009 0.144428 +-0.00188983 0.0792593 -0.003093 +0.0559872 -0.0140882 -0.011506 +-0.227407 -0.0888195 0.0117762 +-0.273528 -0.167121 -0.0102922 +-0.0402782 -0.263586 -0.140793 +-0.137564 -0.296782 -0.109847 +-0.166109 -0.381665 -0.0120175 +-0.16983 -0.360755 0.0137933 +-0.16456 -0.354211 -0.0308766 +-0.185156 -0.334386 0.0190529 +-0.207978 -0.298552 0.0310885 +-0.252507 -0.243462 0.0511336 +-0.223388 -0.268692 -0.019703 +-0.193938 -0.322649 0.048456 +-0.175095 -0.332532 0.0736524 +-0.176111 -0.310734 0.103586 +-0.147337 -0.494175 -0.0467278 +-0.129359 -0.490613 -0.0537016 +-0.148829 -0.364106 -0.0543963 +-0.120087 -0.343197 -0.0662243 +-0.130345 -0.305692 -0.0722136 +-0.171529 -0.299424 -0.0833938 +-0.181343 -0.292949 -0.0416997 +0.207831 -0.217496 -0.0966998 +0.180453 0.174523 0.151623 +0.0997558 -0.44202 -0.0211251 +0.141829 -0.427452 -0.0246256 +0.231902 -0.0518172 0.0262484 +0.222165 -0.00765217 0.131632 +0.257605 0.0468554 0.0496674 +0.134457 -0.362329 0.00455646 +0.162364 -0.298449 0.0119315 +0.167632 -0.334853 -0.0258239 +0.166781 -0.258058 -0.0451734 +0.196618 -0.203737 -0.0367216 +0.204966 -0.148702 0.029823 +0.188775 -0.0899398 0.0842549 +0.118735 -0.0897053 0.120666 +0.108518 -0.0623755 0.19827 +0.0943505 -0.134977 0.262277 +0.0987744 0.0186293 0.19077 +0.164162 -0.016078 0.17849 +0.217401 -0.0732307 0.174029 +0.244384 -0.159022 0.158735 +0.0938974 -0.414078 -0.0986619 +0.0882094 -0.386204 -0.0874415 +0.110237 -0.433985 -0.106491 +0.0752909 -0.377302 -0.0545033 +0.136893 -0.424401 -0.103861 +0.101623 -0.446793 -0.0879738 +0.0803589 -0.447974 -0.0828166 +0.0955794 -0.458697 -0.0690652 +0.0852254 -0.472952 -0.043714 +0.0423481 -0.131534 -0.117698 +0.0102534 -0.163639 -0.135844 +-0.0294235 -0.16777 -0.154302 +-0.0581903 -0.19678 -0.162941 +-0.0495263 -0.23206 -0.157295 +0.0213258 -0.204668 -0.142847 +0.0591534 -0.221375 -0.128414 +0.094939 -0.204956 -0.158559 +0.102368 -0.149902 -0.152017 +0.161838 -0.127189 -0.119413 +0.0883157 -0.255475 -0.0965547 +0.00337956 -0.243572 -0.138992 +-0.00441584 -0.28038 -0.109802 +0.139454 -0.244447 -0.0884262 +0.17799 -0.253819 -0.13106 +0.239512 -0.249475 -0.139746 +0.239769 -0.199663 -0.201225 +0.139899 -0.220537 -0.184787 +0.188104 -0.214287 -0.208834 +0.241446 -0.186766 -0.139849 +0.209446 -0.161297 -0.101029 +-0.199048 -0.317265 -0.100601 +-0.293252 -0.31357 -0.122798 +-0.243299 -0.355691 -0.130502 +-0.247594 -0.319033 -0.0988683 +-0.291668 -0.287409 -0.0637038 +-0.248832 -0.272185 -0.0865389 +-0.259174 -0.220646 -0.0469428 +-0.282126 -0.263379 -0.124759 +-0.269731 -0.294935 -0.18724 +-0.247297 -0.165961 -0.0866554 +0.0601914 -0.0464014 -0.0549033 +-0.211085 -0.18579 -0.128927 +-0.200721 -0.132547 -0.108259 +-0.0634953 -0.15489 0.179525 +0.153912 -0.0887253 -0.0733484 +0.185145 -0.0471144 -0.0260532 +0.211443 0.0144377 0.0032337 +0.139575 0.0029693 0.000737671 +0.166751 0.0710484 -0.0323169 +0.107842 0.107181 0.0410238 +0.241648 0.0800111 -0.0150955 +-0.140262 -0.4992 -0.033581 +-0.123763 -0.497978 -0.0364981 +-0.108133 -0.495253 -0.0202341 +-0.1219 -0.481038 -0.0158085 +-0.110456 -0.461331 -0.014079 +-0.087635 -0.441699 -0.0445804 +-0.0916102 -0.451765 -0.0239283 +-0.0811529 -0.421697 -0.020421 +-0.0723115 -0.470105 -0.0423155 +-0.102577 -0.44033 -0.0062072 +-0.139118 -0.480546 -0.0199347 +-0.149266 -0.466768 -0.0254061 +0.222317 -0.0925366 -0.0161067 +-0.0417433 -0.361447 0.00632817 +-0.00965295 -0.347119 0.0218202 +0.0216724 -0.318231 0.010836 +-0.00474667 -0.341486 0.0613973 +0.0698488 -0.285166 0.0205835 +-0.108371 -0.29389 -0.0941984 +-0.11094 -0.279255 -0.127432 +-0.0852691 -0.31423 -0.083395 +-0.0516331 -0.309713 -0.0908278 +-0.0463843 -0.329032 -0.0615785 +-0.13427 -0.295211 -0.140976 +-0.16029 -0.312528 -0.151535 +-0.208046 -0.313472 -0.188061 +-0.177638 -0.29982 -0.178676 +-0.173332 -0.259819 -0.179118 +-0.186949 -0.225139 -0.161631 +-0.121077 -0.271737 -0.158365 +-0.222098 -0.229029 -0.143015 +-0.254895 -0.254361 -0.158387 +-0.119307 -0.241249 -0.168619 +-0.0940058 -0.224454 -0.161034 +-0.119452 -0.213541 -0.164903 +-0.133444 -0.181194 -0.153714 +-0.123212 -0.142937 -0.146434 +-0.154852 -0.114002 -0.127562 +-0.16919 -0.193253 -0.151916 +-0.202578 -0.281459 -0.18846 +-0.238459 -0.276537 -0.185897 +-0.240282 -0.308392 -0.197824 +-0.31592 -0.411023 -0.222975 +-0.28556 -0.354091 -0.210885 +-0.235315 -0.349789 -0.176342 +-0.247249 -0.413591 -0.205119 +-0.313616 -0.39085 -0.145549 +-0.265064 -0.38952 -0.162643 +-0.137308 -0.0765217 -0.126585 +-0.138269 -0.043252 -0.101811 +-0.149787 -0.024537 -0.0569204 +-0.190238 -0.325155 -0.164883 +-0.214126 -0.342005 -0.145019 +-0.11169 -0.0249744 -0.0351987 +-0.154494 -0.0206052 -0.0150451 +-0.170024 -0.0235376 0.033341 +-0.149964 -0.0212297 0.0915499 +-0.146292 -0.0570396 0.143171 +-0.204533 -0.050976 0.0222898 +-0.222839 -0.0748301 0.0497298 +-0.218112 -0.0836084 0.106186 +-0.241131 -0.10804 0.0423425 +-0.253857 -0.126023 0.000914005 +-0.268045 -0.155579 0.0359862 +-0.254096 -0.191499 0.0837602 +-0.284127 -0.206805 0.0257642 +-0.255388 -0.139415 -0.0455141 +-0.266486 -0.179542 -0.0496151 +-0.255448 -0.200689 -0.0776309 +-0.238672 -0.192995 -0.107883 +-0.225097 -0.163824 -0.109937 +-0.22995 -0.135947 -0.0896828 +-0.209528 -0.114818 -0.0862766 +-0.197715 -0.0771741 -0.074156 +-0.18152 -0.102481 -0.104911 +-0.212552 -0.0754645 -0.0336012 +-0.179069 -0.0426745 -0.0757348 +-0.191113 -0.0400122 0.118805 +0.0761558 -0.344791 -0.0536197 +0.0734921 -0.316433 -0.0291825 +0.0865869 -0.298841 -0.0691012 +0.0805876 -0.328744 0.0029047 +0.0952029 -0.361348 0.00820626 +0.11906 -0.273469 -0.0673767 +0.0841053 -0.310717 0.0264162 +0.125408 -0.292597 0.041066 +0.0878905 -0.285295 0.052224 +0.0491288 -0.272854 0.0806291 +0.143869 -0.242882 0.0528378 +0.117789 -0.207199 0.0870858 +0.169353 -0.193132 0.0552639 +0.0969256 -0.166289 0.115505 +0.054006 -0.288058 0.0505697 +0.0199581 -0.301066 0.0971587 +-0.00766116 -0.296894 0.132807 +0.0766599 -0.302889 0.00259846 +0.0459981 -0.299327 0.00649094 +0.0275534 -0.307808 -0.0222832 +0.0149271 -0.300169 -0.0594622 +0.0407712 -0.276916 -0.0798141 +0.0598138 -0.291021 -0.0166231 +0.105499 -0.310063 0.042044 +0.129965 -0.318676 0.0271739 +-0.0843085 -0.494264 -0.0321529 +-0.0752323 -0.238787 0.196776 +-0.295928 -0.43397 -0.176216 +0.0851801 -0.382062 -0.0130588 +0.0187394 -0.0952484 0.145146 +0.0700063 -0.10227 0.135872 +0.0221841 -0.0461712 0.144279 +0.0234739 0.0145751 0.123876 +-0.00955997 -0.0145334 0.135796 +-0.0455413 -0.0274983 0.116817 +-0.0630042 -0.0646849 0.123712 +-0.0996182 -0.0685448 0.139479 +-0.129134 -0.0937854 0.159793 +-0.112763 -0.133107 0.183753 +-0.0586283 -0.0384282 0.0801443 +-0.0976008 -0.0306336 0.0712047 +-0.187313 -0.236737 0.146886 +-0.186919 -0.194456 0.158247 +-0.276732 -0.200888 -0.0224537 +-0.291326 -0.23573 -0.0313163 +-0.262172 -0.26119 -0.0228289 +-0.244304 -0.258186 0.0138536 +-0.238049 -0.253808 -0.053252 +-0.278468 -0.245353 0.0237178 +-0.250374 -0.233381 -0.0762153 +-0.317786 -0.266287 -0.0397057 +-0.29694 -0.227134 0.00135872 +-0.28761 -0.282597 -0.0302299 +-0.0768305 -0.203891 0.202176 +-0.107975 -0.220055 0.202264 +-0.134773 -0.20066 0.190676 +-0.13214 -0.167949 0.192848 +-0.157713 -0.187173 0.17141 +-0.0792541 -0.17391 0.197354 +-0.103166 -0.157466 0.196315 +-0.0861693 -0.139966 0.183699 +-0.0642112 -0.126048 0.16286 +-0.0525585 -0.0978366 0.139755 +0.124762 -0.0100876 0.132612 +0.0801162 0.0231847 0.117816 +0.0903158 0.0691509 0.0824377 +0.111706 0.138719 0.113497 +0.109897 0.0476799 0.0291314 +0.0568194 0.0789592 0.018431 +0.166721 0.186565 0.0672199 +0.252858 0.160254 0.0700128 +0.103948 0.0891733 -0.0142249 +0.151331 0.103958 0.00831307 +0.156258 0.148984 0.0332697 +0.195526 0.176469 0.0301312 +0.246249 0.159404 0.0147221 +0.272985 0.107792 0.0403664 +0.220496 0.208803 0.0718273 +0.172006 0.242405 0.105809 +0.284857 0.213191 0.163319 +0.220004 0.262975 0.168971 +0.243752 0.187223 0.124992 +0.303317 0.156118 0.132187 +0.124557 0.160014 0.070217 +0.145476 0.178627 0.113721 +0.143822 0.145597 0.146983 +0.199699 0.112576 0.148784 +0.221259 0.0552492 0.134196 +0.124553 0.109697 0.139987 +0.100062 0.0751807 0.125633 +0.107686 0.0453443 0.15701 +0.152453 0.0251604 0.154394 +0.160741 0.1045 0.158385 +0.183054 0.0708926 0.1447 +0.188656 0.0314673 0.13741 +0.286002 0.0789154 0.0896861 +0.044874 0.0868553 -0.0397086 +0.0292084 0.0351428 -0.0773123 +-0.00652383 0.0868322 -0.0563984 +0.153395 -0.330946 0.00521793 +0.165687 0.227811 0.159326 +0.176713 -0.253714 -0.180764 +0.276141 0.126578 0.0974557 +-0.0329659 -0.0648403 -0.0508016 +-0.022748 -0.0460692 -0.0136176 +-0.0397109 -0.0394184 0.0195973 +0.00993129 -0.0278328 -0.0155697 +0.0270531 -0.00832198 0.0106523 +0.0103826 0.00500549 0.0538795 +0.0666135 0.0125544 0.0261568 +0.103369 0.00889595 0.155654 +0.11659 -0.0298082 0.170544 +0.153029 -0.0696813 0.168481 +0.113461 -0.0186162 0.216944 +0.10035 -0.0580327 0.251516 +0.150235 -0.084971 0.233939 +0.0675669 -0.0946043 0.253879 +0.0719166 -0.0391569 0.214813 +0.10687 -0.103697 0.22877 +0.136543 -0.144876 0.235107 +0.1197 -0.0491892 0.122959 +0.148505 -0.0696344 0.112799 +0.152678 -0.114026 0.101195 +0.181641 -0.136376 0.0700095 +0.219377 -0.0856118 0.124697 +0.177363 -0.0676828 0.147605 +0.177944 -0.101552 0.169756 +0.213844 -0.114113 0.199683 +0.250347 -0.109904 0.165803 +0.259893 -0.130195 0.122038 +0.180633 -0.0723966 0.203599 +0.114076 -0.0955963 0.272717 +0.201886 -0.0333539 0.161782 +0.240288 -0.0485439 0.141813 +0.261312 -0.0227503 0.104643 +0.273982 -0.0593402 0.119899 +0.280362 -0.074792 0.0701015 +0.238595 0.0177583 0.0951404 +0.14643 -0.0478943 0.212489 +-0.227331 -0.265687 0.0979085 +-0.244646 -0.230401 0.0887962 +-0.293688 -0.268968 -0.164669 +-0.297979 -0.308788 -0.162348 +-0.312868 -0.346598 -0.144794 +-0.344082 -0.367401 -0.192127 +-0.317302 -0.337357 -0.184462 +-0.280828 -0.350074 -0.123607 +0.105148 0.105807 0.112878 +0.112708 0.122082 0.0774818 +0.133565 0.128779 0.0503619 +-0.153371 -0.370618 0.0324641 +0.254239 -0.0926281 0.0998171 +-0.0128437 0.0136567 0.10826 +0.0175667 0.0217155 0.0871281 +0.0477136 0.0340255 0.104217 +0.0750182 0.0489044 0.100742 +0.0776037 0.0433948 0.0700673 +0.0973389 0.0603657 0.0539823 +0.0861821 0.0686274 0.0252903 +0.0735784 0.0589072 -0.0094551 +0.0829016 0.102631 0.0164944 +0.0811061 0.0911963 0.0569078 +0.0940457 0.0476479 0.121838 +0.105428 0.0231317 0.131003 +0.0916425 -0.00738665 0.126455 +0.0604145 5.34629e-05 0.128347 +0.10359 0.0595398 0.00049955 +0.144344 0.0457444 0.00327488 +0.122523 0.0419513 -0.0300499 +0.11811 0.0162342 -0.0830375 +0.170091 0.0155571 -0.145681 +0.138389 0.0626357 -0.0743287 +0.165069 0.0235027 -0.0532363 +0.177768 0.0409007 -0.100742 +0.136707 0.0380317 -0.122381 +0.124141 0.00775387 -0.157586 +0.154959 -0.000810753 -0.105169 +0.105591 0.0562623 -0.100272 +0.0594242 0.0548004 -0.106957 +0.201162 -0.0168583 -0.120783 +0.0976411 0.0972697 0.0801317 +0.0943337 0.0848541 0.102457 +0.0890479 0.0650811 0.109825 +0.0389773 0.0745551 -0.0779593 +0.0138551 0.0593589 -0.108474 +0.0773146 0.0765993 -0.0629692 +0.118409 0.00125651 -0.11931 +0.14578 -0.0101392 -0.137264 +0.178622 -0.0192175 -0.148664 +0.15461 0.0388676 -0.0266866 +0.193622 0.0322602 -0.0272748 +0.1942 0.050466 -0.0642106 +0.173634 0.0303747 -0.00069076 +0.179101 -0.0110744 -0.00523936 +0.230507 0.0422098 -0.0173425 +0.202418 0.070871 -0.0135348 +0.22302 0.0184239 -0.0441485 +0.215157 -0.0248187 0.00288885 +0.233855 -0.00344678 0.0259658 +0.238719 0.033163 0.0205233 +0.25481 0.0672767 0.0179763 +0.222129 -0.0581209 -0.00731524 +0.227145 -0.0819987 0.0145053 +0.219253 -0.118982 0.0109807 +0.211654 -0.158762 -0.0192499 +0.210611 -0.101269 0.0490966 +0.200451 -0.190104 0.0116714 +0.203938 -0.0712158 -0.0282028 +0.173774 -0.0735362 -0.0475631 +0.2027 -0.10102 -0.0400541 +0.212795 -0.129107 -0.0298945 +0.206091 -0.151217 -0.0455168 +0.202467 -0.150775 -0.0745887 +0.209378 -0.187531 -0.0743719 +0.181149 -0.126003 -0.0892617 +0.205972 -0.177843 -0.0383337 +0.188301 -0.142819 -0.114464 +0.208779 -0.164491 -0.140437 +0.171227 -0.151151 -0.147387 +0.136617 -0.138704 -0.143839 +0.131975 -0.166643 -0.169617 +0.128263 -0.113939 -0.11894 +0.116875 -0.0858965 -0.091059 +0.0786764 -0.0829677 -0.090746 +0.187859 -0.214057 -0.0686071 +0.175679 -0.237132 -0.0957975 +0.178163 -0.10588 -0.0665832 +0.269129 0.0763722 0.0451229 +0.27889 0.058723 0.0679827 +0.267652 0.0453551 0.105512 +0.2613 0.0363273 0.0775663 +0.250278 0.0199214 0.0566543 +0.250269 0.00638094 0.0769677 +0.262967 -0.0160504 0.0796628 +0.285344 -0.0433845 0.0872574 +0.210073 -0.0746435 0.0657137 +0.221889 -0.0775407 0.0410909 +0.302572 -0.0710887 0.0949218 +0.21774 0.0486965 -0.0445342 +0.224846 0.0339602 -0.0740774 +0.244042 0.0044793 -0.10874 +0.254336 0.102378 0.0100739 +0.220262 0.108437 -0.00385435 +0.184431 0.103867 -0.0063665 +0.227766 0.138272 0.00117268 +0.21603 0.168687 0.00560537 +0.214962 0.252952 4.36931e-05 +0.24674 0.211475 0.00674743 +0.208103 0.206716 0.00898043 +0.198252 0.239152 0.0425261 +0.241235 0.183275 -0.00372162 +0.24846 0.187657 0.0253371 +0.236173 0.217937 0.0406376 +0.208251 0.202717 0.0430183 +0.190765 0.204953 0.0676283 +0.199822 0.228771 0.0907818 +0.212055 0.262964 0.121847 +0.167888 0.20936 0.0941323 +0.230768 0.216285 0.106419 +0.226441 0.220307 0.1523 +0.160904 0.217518 0.126833 +0.151535 0.251202 0.133586 +0.158786 0.306935 0.0984538 +0.193903 0.396086 0.195106 +0.119767 0.364922 0.154966 +0.158434 0.284691 0.125614 +0.188265 0.327264 0.175224 +0.139712 0.323472 0.144742 +0.247398 0.226772 0.208026 +0.162628 0.357991 0.158091 +0.132463 0.334186 0.215838 +0.184892 0.418747 0.128073 +0.148158 0.405567 0.1589 +0.116952 0.392105 0.208798 +0.128904 0.307582 0.18276 +0.173163 0.280669 0.197839 +0.237808 0.190239 0.0542196 +0.242415 0.187695 0.0885314 +0.257589 0.159811 0.105872 +0.25799 0.149475 0.1552 +0.249199 0.167605 0.0439231 +0.270589 0.141138 0.0478035 +0.291007 0.120776 0.0668204 +0.27986 0.0943457 0.0648346 +0.262028 0.128688 0.0220064 +0.283888 0.104244 0.08796 +0.278117 0.09277 0.114653 +0.296211 0.119268 0.134225 +0.25745 0.0686993 0.129638 +0.231499 0.0874258 0.144645 +0.23624 0.121986 0.150481 +0.21822 0.158716 0.152133 +0.276736 0.0681718 0.110294 +0.286087 0.0545245 0.0921962 +0.114064 0.342002 0.184102 +0.184346 0.361594 0.187357 +0.161147 0.378013 0.229421 +0.186402 0.32651 0.232026 +0.224199 0.278314 0.231623 +0.178684 0.387524 0.165454 +0.207571 0.416517 0.162223 +0.115261 0.360345 0.210089 +0.111327 0.375408 0.183082 +0.123148 0.405595 0.17979 +0.161317 0.441861 0.200022 +0.134075 0.42215 0.208124 +0.166581 0.413272 0.221996 +0.184888 0.467555 0.155941 +0.139501 0.435526 0.173911 +0.158717 0.435906 0.144337 +0.167498 0.45215 0.103084 +0.137763 0.359978 0.22921 +0.165611 0.348074 0.227085 +0.15984 0.318857 0.217125 +0.185554 0.304169 0.211919 +0.205103 0.278784 0.204981 +0.244841 0.279219 0.196675 +0.226891 0.25345 0.209087 +0.216714 0.31142 0.225032 +0.18164 0.33693 0.20427 +0.203702 0.303717 0.18726 +0.193627 0.296232 0.146589 +0.191637 0.257284 0.18429 +0.157803 0.257523 0.177293 +0.175634 0.311565 0.125155 +0.161107 0.457828 0.173386 +0.194169 0.447882 0.185268 +0.194408 0.477711 0.118315 +0.219599 0.449898 0.13857 +0.135294 0.387364 0.228733 +0.145147 0.282789 0.187345 +0.143956 0.303159 0.203618 +0.177446 0.366384 0.212315 +0.179329 0.391491 0.217312 +0.18672 0.412483 0.210145 +0.202606 0.421792 0.189409 +0.174085 0.42914 0.210627 +0.153641 0.426813 0.21312 +0.144424 0.408706 0.223131 +0.190464 0.428693 0.201747 +0.178837 0.441581 0.19921 +0.169704 0.452082 0.187978 +0.180705 0.459908 0.173619 +0.202088 0.458198 0.166952 +0.151672 0.449754 0.186725 +0.142475 0.436806 0.198199 +0.127991 0.425256 0.188222 +0.210178 0.437176 0.172385 +0.119636 0.410278 0.199562 +0.206557 0.46857 0.145869 +0.215386 0.468035 0.123827 +0.207969 0.436894 0.106764 +0.212477 0.477963 0.10116 +0.128023 0.4054 0.215288 +0.223073 0.454408 0.0921651 +0.184017 0.321535 0.149004 +0.164058 0.339436 0.133054 +0.141763 0.356765 0.138374 +0.138767 0.331395 0.111494 +0.18387 0.5 0.0894472 +0.178253 0.341112 0.15974 +0.158692 0.397227 0.229447 +0.261987 0.258572 0.22454 +0.209557 0.191204 0.156985 +0.19703 0.220129 0.168363 +0.114158 0.395299 0.191384 +0.237163 0.239354 0.0176536 +0.22873 0.228755 -0.0079498 +0.204237 0.229854 -0.000985107 +0.191898 0.248869 0.0164149 +0.195144 0.299533 0.0501168 +0.211408 0.277777 0.0261684 +0.181525 0.269092 0.042102 +0.232338 -0.0296485 0.018274 +0.220704 0.448894 0.117889 +0.211836 0.430361 0.128709 +0.200007 0.22745 0.0221073 +0.206622 0.221816 0.0395427 +0.223655 0.239447 0.0484776 +0.206846 0.263872 0.061817 +0.192412 0.289403 0.0880222 +0.1998 0.487191 0.0879627 +0.178418 0.478766 0.0726805 +0.171907 0.478 0.098484 +0.179607 0.4432 0.070784 +0.215421 0.44036 0.0572748 +0.206111 0.438517 0.081171 +0.184196 0.432818 0.0953164 +0.172787 0.433405 0.115219 +0.16681 0.454422 0.128591 +0.158037 0.463512 0.080819 +0.300027 -0.106441 0.0798503 +0.301565 -0.138608 0.110073 +0.294284 -0.0698767 0.0795338 +0.293906 -0.0887216 0.0736412 +0.275743 -0.101071 0.0877101 +0.309738 -0.0894098 0.0874741 +0.287014 -0.123527 0.0945964 +0.311125 -0.118131 0.0991123 +0.298899 -0.117613 0.118193 +0.276193 -0.109289 0.135451 +0.270493 -0.137621 0.153632 +0.286312 -0.136798 0.132025 +0.257826 -0.0797919 0.144654 +0.303792 -0.0864306 0.104131 +0.28817 -0.0747287 0.113826 +0.276632 -0.0878111 0.128274 +0.30695 -0.103289 0.107245 +0.287682 -0.0559229 0.10414 +0.272738 -0.0407993 0.108633 +0.253435 -0.0365139 0.124117 +0.295415 -0.0573592 0.0898843 +0.263375 -0.0783235 0.0820667 +-0.216962 -0.20051 0.140681 +-0.236047 -0.180496 0.115013 +-0.230292 -0.136771 0.112494 +-0.247625 -0.159292 0.0914591 +-0.209896 -0.129892 0.141237 +0.222682 0.288177 0.190351 +0.233778 0.296853 0.212089 +0.209365 0.287061 0.167624 +0.208618 0.271128 0.146657 +0.223776 0.247151 0.14266 +0.250594 0.280585 0.221005 +0.215525 0.238928 0.164607 +0.248724 0.243405 0.176599 +0.282927 0.23674 0.194658 +0.253819 0.208937 0.178714 +0.265424 0.184312 0.155732 +0.308614 0.169998 0.183237 +0.273365 0.179729 0.192265 +0.265912 0.204786 0.204674 +0.300509 0.203464 0.194384 +0.281969 0.151677 0.177526 +0.279246 0.127373 0.158699 +0.31079 0.143896 0.162421 +0.30954 0.171009 0.155179 +0.288086 0.1804 0.137744 +0.264265 0.175268 0.132545 +0.241184 0.168571 0.143536 +0.282052 0.162312 0.123541 +0.290218 0.138764 0.11928 +0.232003 0.191432 0.146429 +0.237199 0.211128 0.131059 +0.175486 0.13591 0.157401 +0.244193 0.0453066 0.121153 +0.216838 0.0295154 0.115567 +0.0778181 0.0182774 -0.0959304 +0.132697 0.385267 0.165833 +0.155812 0.38306 0.160495 +-0.00373338 0.0386319 -0.0871428 +0.0052284 0.0508015 -0.0521262 +-0.0272532 0.0521944 -0.0650671 +-0.0417118 0.0760468 -0.0274796 +0.0432101 0.0478592 -0.0430105 +0.0360437 0.064037 -0.0095129 +0.0264403 0.0878588 0.0105855 +0.0200841 0.0963175 -0.0204482 +0.0508265 0.0939603 -0.0091335 +0.0753367 0.087282 -0.0290458 +-0.0114666 0.0989277 -0.0268583 +0.189464 0.426182 0.111762 +-0.04038 -0.0265907 0.0536548 +0.188037 0.19051 0.048384 +0.170897 0.170857 0.0404072 +0.180803 0.154042 0.0195245 +0.168583 0.128396 0.0100026 +0.150344 0.161847 0.0580756 +0.146195 0.173828 0.0846654 +0.123104 0.163389 0.100752 +0.131952 0.158423 0.126057 +0.154039 0.169296 0.137953 +0.163282 0.191526 0.127822 +0.170691 0.206066 0.147249 +0.123979 0.136658 0.135 +0.136161 0.125537 0.148878 +0.153818 0.131557 0.161379 +0.111897 0.12133 0.126074 +0.111889 0.144276 0.0890707 +0.11658 0.140768 0.0690434 +0.119959 0.124948 0.0613596 +0.107779 0.107117 0.0626571 +0.122618 0.115267 0.0466942 +0.127454 0.104238 0.0219653 +0.136258 0.119892 0.0320023 +0.129073 0.0915077 -0.00265103 +0.130797 0.0780035 -0.0369633 +0.10768 0.094992 0.00979378 +0.163926 0.154671 0.152149 +0.0894836 0.0909923 0.00058556 +0.0689505 0.0963924 0.00171312 +0.0612997 0.100634 0.0224348 +0.0675451 0.0846698 0.038694 +0.0795109 0.103357 0.0384133 +0.0848094 0.0754581 0.0444653 +0.110567 0.10366 0.130086 +0.12281 0.0864143 0.139975 +0.117855 0.062854 0.143513 +0.13666 0.0472165 0.155281 +0.128164 0.0235742 0.176647 +0.163067 0.0498951 0.143567 +0.143932 0.0949004 0.145284 +0.179917 0.317727 0.0742859 +0.183725 0.275085 0.0676723 +0.16838 0.29297 0.0787056 +0.0930951 0.102542 0.05002 +0.100339 0.0681106 0.0373411 +0.102886 0.0622715 0.0197467 +0.121511 0.0540863 0.0117598 +0.124719 0.0242285 0.0166428 +0.0967861 -0.00310471 -0.0020113 +0.12138 0.0519179 -0.0102922 +0.0990646 0.0492208 -0.022422 +0.0873807 -0.0275369 -0.03209 +0.200694 -0.191636 -0.0546067 +0.206298 -0.170055 -0.0598788 +0.209964 -0.168421 -0.0791806 +0.221182 -0.183261 -0.0963771 +0.222775 -0.172837 -0.120159 +0.235715 -0.195921 -0.115182 +0.253933 -0.218526 -0.134037 +0.311213 -0.253911 -0.191866 +0.279294 -0.244732 -0.16099 +0.266185 -0.201338 -0.169529 +0.285572 -0.216415 -0.213382 +0.273765 -0.285731 -0.187819 +0.259679 -0.265381 -0.248632 +0.24894 -0.227823 -0.231771 +0.232153 -0.25966 -0.225227 +0.254118 -0.290735 -0.220386 +0.336364 -0.328047 -0.241676 +0.281317 -0.319577 -0.26697 +0.295033 -0.317038 -0.218433 +0.327766 -0.263669 -0.27537 +0.320681 -0.238904 -0.235706 +0.333487 -0.28367 -0.222752 +0.25789 -0.299076 -0.25318 +0.280382 -0.278404 -0.287734 +0.262726 -0.334272 -0.234674 +0.315714 -0.303377 -0.28762 +0.358898 -0.298323 -0.270079 +0.292961 -0.250812 -0.263064 +0.260427 0.269097 0.206442 +0.273912 0.251948 0.207483 +0.274266 0.226866 0.218876 +0.254508 0.262332 0.186312 +0.268737 0.247011 0.182676 +0.278883 0.230014 0.174886 +0.292676 0.216891 0.181537 +0.301666 0.196568 0.170643 +0.235991 0.25839 0.179999 +0.216996 0.262302 0.191107 +0.233602 0.240223 0.192553 +0.26623 0.217767 0.166603 +0.291208 0.219735 0.206357 +0.285626 0.200003 0.208179 +0.295054 0.181857 0.198439 +-0.119559 -0.0454446 0.130205 +-0.148541 -0.0288065 0.124554 +-0.122421 -0.0280036 0.104512 +-0.169628 -0.0428483 0.136658 +-0.192691 -0.0700149 0.138018 +-0.165949 -0.0805689 0.151606 +-0.157867 -0.111652 0.162619 +-0.182289 -0.134815 0.160033 +-0.171616 -0.0265274 0.119564 +-0.182821 -0.0294707 0.089096 +-0.207158 -0.0941133 0.130893 +-0.0813687 -0.408143 0.0168626 +-0.0493082 -0.255289 0.183439 +-0.0417823 -0.281988 0.16825 +-0.0232624 -0.242141 -0.150317 +0.237084 0.148575 0.150278 +0.21825 0.135883 0.152701 +0.196547 0.147262 0.152063 +0.248839 0.134889 0.149793 +0.25417 0.116897 0.146677 +0.154738 -0.248351 -0.113516 +0.149894 -0.252291 -0.14374 +0.127807 -0.247316 -0.112579 +0.100037 -0.239188 -0.118127 +0.171952 -0.258325 -0.155783 +0.206243 -0.267544 -0.164319 +0.152779 -0.244265 -0.170212 +0.238869 -0.271194 -0.164355 +0.19948 -0.240785 -0.114164 +0.228533 -0.228656 -0.117975 +0.0806348 -0.448964 -0.0364622 +0.092817 -0.46403 -0.0236687 +0.131465 -0.464547 -0.0186627 +0.111576 -0.45856 -0.0162136 +0.12236 -0.437795 -0.0167687 +0.116113 -0.473014 -0.0333379 +0.141834 -0.466374 -0.0462667 +0.15629 -0.45187 -0.0265272 +0.162053 -0.430562 -0.0436087 +0.170805 -0.433786 -0.074571 +0.150694 -0.440322 -0.089161 +0.142403 -0.453672 -0.0687084 +0.20922 0.0225383 -0.118012 +0.245897 0.00269769 -0.0710137 +-0.0868896 -0.445579 -0.0827631 +-0.0899978 -0.418668 -0.0662628 +-0.0919895 -0.382051 -0.0731611 +-0.286076 -0.18977 0.00251657 +0.166397 -0.235956 -0.0665238 +0.18289 -0.231659 -0.0402536 +0.183601 -0.256036 -0.0114407 +0.19304 -0.222737 -0.0114233 +0.168396 -0.264129 0.0198747 +0.175145 -0.292863 -0.0261367 +0.159612 -0.311932 -0.0502102 +0.151795 -0.349231 -0.058414 +0.168467 0.120276 0.165442 +0.179322 0.109989 0.151163 +0.191745 0.091503 0.1476 +0.207409 0.0731218 0.143583 +0.170472 0.088013 0.148441 +0.198308 0.0526608 0.137187 +-0.288444 -0.322548 -0.196751 +-0.258254 -0.336596 -0.201797 +-0.260706 -0.370334 -0.191889 +-0.262012 -0.38355 -0.234182 +0.169409 0.331718 0.106522 +-0.0883279 -0.427369 -0.00320489 +-0.0757242 -0.410706 -0.00350047 +-0.0694098 -0.396348 -0.0215868 +-0.339105 -0.28249 -0.133907 +0.14338 -0.190029 -0.185968 +0.113197 -0.189729 -0.178573 +0.161752 -0.208101 -0.1989 +0.163143 -0.233988 -0.192556 +0.187542 -0.24244 -0.20457 +0.214342 -0.231174 -0.221761 +0.200695 -0.263551 -0.191549 +0.0888974 -0.174918 -0.165344 +0.0728578 -0.155488 -0.148655 +0.0857975 -0.13271 -0.133069 +0.0496654 -0.153477 -0.133288 +0.208417 -0.252602 -0.211864 +0.214499 -0.20684 -0.209109 +0.212326 -0.182246 -0.176825 +0.196622 -0.193456 -0.194925 +-0.0366034 0.0848157 -0.0747335 +-0.0106036 0.0767347 -0.0825468 +-0.248014 -0.143811 -0.0711582 +0.156176 -0.353723 -0.00967102 +0.161881 -0.35946 -0.0354879 +0.154192 -0.374021 -0.054565 +0.153835 -0.401954 -0.0551512 +0.147106 -0.376782 -0.0111704 +0.141013 -0.401853 -0.0175381 +0.127378 -0.38782 -0.00428773 +0.152558 -0.410563 -0.0345712 +0.144573 -0.387551 -0.0699167 +0.129797 -0.395951 -0.0860393 +0.110844 -0.383365 -0.0877166 +0.111358 -0.362136 -0.0828181 +0.10863 -0.332992 -0.0757964 +0.131091 -0.348484 -0.0736181 +0.114528 -0.372564 0.00601769 +0.116893 -0.350867 0.0177725 +0.143657 -0.369483 -0.0686154 +0.0433039 -0.239647 0.0998892 +-0.318832 -0.357055 -0.211401 +-0.299837 -0.377374 -0.238049 +-0.340344 -0.383626 -0.224893 +-0.356366 -0.419986 -0.188103 +-0.285529 -0.404192 -0.228972 +-0.356375 -0.393121 -0.201407 +-0.349321 -0.392013 -0.165399 +-0.328811 -0.42272 -0.163607 +-0.345548 -0.417553 -0.216974 +-0.322795 -0.427865 -0.195551 +-0.33518 -0.363207 -0.161311 +-0.0812327 -0.396788 0.0342935 +-0.065289 -0.38943 0.0224745 +-0.0508718 -0.371639 0.0298172 +-0.260668 -0.216401 0.0653687 +-0.2704 -0.185201 0.0538295 +0.187032 0.486356 0.0996338 +0.279593 -0.136382 0.110973 +0.26837 -0.117918 0.105466 +0.248285 -0.109463 0.116456 +0.232397 -0.125931 0.141691 +0.210603 -0.141776 0.171116 +0.137574 -0.108705 0.207737 +0.169921 0.29167 0.0522744 +0.00992085 -0.113945 -0.0964453 +0.258261 -0.257702 -0.154872 +0.275321 -0.267702 -0.17038 +0.295633 -0.272896 -0.184932 +0.295815 -0.294739 -0.20199 +0.314713 -0.27743 -0.201437 +0.327332 -0.256197 -0.214678 +0.340385 -0.261017 -0.241446 +0.313356 -0.232789 -0.209684 +0.296344 -0.226073 -0.182212 +0.31592 -0.301772 -0.216769 +0.318635 -0.326842 -0.222796 +0.307178 -0.325937 -0.251416 +0.274745 -0.303144 -0.21295 +0.263287 -0.308346 -0.232527 +0.255382 -0.319889 -0.248754 +0.332002 -0.310475 -0.229091 +0.353636 -0.307458 -0.245121 +0.335859 -0.313851 -0.265914 +0.340499 -0.300896 -0.286697 +0.344989 -0.280039 -0.276203 +0.327449 -0.28026 -0.295194 +0.304942 -0.268737 -0.28762 +0.34983 -0.283684 -0.251927 +0.343136 -0.265469 -0.261534 +0.326713 -0.248963 -0.256716 +0.307917 -0.24034 -0.252462 +0.279159 -0.231625 -0.241522 +0.300353 -0.229376 -0.234338 +0.311358 -0.251222 -0.26759 +0.299024 -0.289572 -0.301481 +0.279907 -0.305571 -0.290358 +0.263002 -0.29286 -0.276914 +0.260616 -0.313748 -0.268771 +0.275922 -0.322371 -0.224156 +0.284975 -0.33259 -0.244221 +0.303023 -0.336946 -0.233483 +0.289605 -0.333838 -0.221905 +0.166435 0.39886 0.154509 +0.189152 0.404825 0.153461 +0.197133 0.400723 0.1737 +0.17424 0.413608 0.143911 +0.169142 0.426834 0.132439 +0.188725 0.386035 0.180698 +0.186219 0.378081 0.198788 +-0.267025 -0.372115 -0.138391 +-0.248022 -0.367522 -0.158602 +0.174505 0.292586 0.0990952 +0.186251 0.309263 0.0928235 +0.181697 0.30513 0.109614 +0.189499 0.279776 0.119317 +0.172647 0.294457 0.120787 +0.158057 0.303956 0.130265 +0.143476 0.291331 0.139139 +0.131312 0.30031 0.159002 +0.186095 0.298863 0.131041 +0.198975 0.28677 0.132576 +0.172236 0.277192 0.117866 +0.184313 0.260452 0.109718 +0.15755 0.265746 0.122578 +0.145983 0.269471 0.137935 +0.151234 0.256355 0.155644 +0.124293 0.323596 0.164277 +0.126678 0.342635 0.150186 +0.129524 0.341544 0.128525 +0.146576 0.349856 0.118779 +0.192269 0.30374 0.0759625 +0.202728 0.285813 0.0690781 +0.210479 0.281567 0.0483558 +0.222196 0.26209 0.0407369 +0.224073 0.261141 0.0186008 +0.162756 0.306191 0.114529 +0.149682 0.318744 0.121136 +0.152677 0.341974 0.100993 +0.164071 0.331208 0.0841361 +0.146523 0.323278 0.093798 +0.15695 0.312461 0.0714443 +0.22266 -0.203518 -0.100877 +0.262076 -0.292278 -0.202356 +0.249754 -0.28212 -0.183581 +0.242451 -0.284733 -0.203885 +0.229725 -0.273053 -0.211906 +0.243386 -0.275428 -0.225419 +0.255999 -0.283472 -0.239546 +-0.261873 -0.405224 -0.222848 +-0.280772 -0.420055 -0.201182 +-0.274389 -0.414773 -0.173401 +-0.298626 -0.411672 -0.158377 +-0.28738 -0.389898 -0.148508 +-0.300008 -0.369107 -0.135836 +-0.257381 -0.39915 -0.185758 +-0.257531 -0.421709 -0.186727 +-0.319983 -0.369357 -0.146016 +-0.25404 -0.39271 -0.206532 +-0.269186 -0.375948 -0.213104 +0.171129 0.312683 0.0555484 +0.186538 0.309469 0.0612947 +0.17697 0.322584 0.0897939 +0.180094 0.317456 0.102692 +0.0389455 -0.294719 0.0707663 +0.19085 0.129482 0.148059 +0.26893 -0.330546 -0.250405 +0.261495 -0.324416 -0.260179 +0.163955 0.0845671 -0.00775852 +0.172992 0.467003 0.114773 +0.17962 0.47069 0.135115 +0.167392 0.460661 0.148013 +0.0927702 -0.0102964 0.178794 +0.0791092 -0.00358862 0.211868 +0.0484002 -0.0727004 0.143042 +0.0857054 -0.0664246 0.132462 +0.170606 0.462905 0.162683 +0.107346 -0.291576 0.0507084 +0.123054 -0.26548 0.0555752 +0.1033 -0.273351 0.0618915 +-0.217347 -0.0684085 0.0793768 +-0.232534 -0.1003 0.0785864 +0.160705 0.203815 0.112095 +0.157448 0.189802 0.0951937 +0.163855 0.222961 0.107992 +0.178039 0.226994 0.0939715 +0.157779 0.236558 0.121407 +0.156862 0.233096 0.141593 +0.254115 0.147478 0.0328869 +0.246739 0.139758 0.0163119 +-0.313249 -0.26088 -0.138114 +-0.319034 -0.272336 -0.0954566 +-0.312031 -0.286413 -0.151154 +-0.318615 -0.301412 -0.127758 +-0.31358 -0.30952 -0.0911544 +-0.342054 -0.297563 -0.104135 +-0.285707 -0.289103 -0.098473 +-0.332554 -0.290038 -0.0650158 +0.224391 0.444149 0.0748945 +0.224127 0.466497 0.0733316 +0.00933378 -0.0890982 -0.073455 +-0.196836 -0.0544369 -0.0547609 +-0.268852 -0.35939 -0.204575 +-0.134821 -0.144762 0.184037 +-0.134018 -0.119846 0.172991 +-0.108849 -0.110436 0.169417 +-0.142893 -0.258813 -0.176858 +0.163435 0.422628 0.144619 +0.149105 0.425301 0.157986 +0.151653 0.445126 0.160854 +0.205634 0.453218 0.0682861 +0.196116 0.437078 0.0613117 +0.305429 0.136514 0.131635 +0.304223 0.128705 0.150462 +0.294739 0.1352 0.16485 +0.29983 0.148475 0.176204 +0.293633 0.16134 0.186506 +0.312816 0.146868 0.144611 +0.290574 0.119539 0.149687 +0.280449 0.10933 0.137413 +0.285959 0.112117 0.117297 +0.154398 0.116961 0.162863 +0.147042 0.108372 0.152274 +0.179394 0.214392 0.162515 +0.185651 0.194518 0.157404 +0.180628 0.232354 0.173507 +0.198969 0.238329 0.174545 +0.207694 0.253512 0.177641 +0.203869 0.264161 0.186147 +0.189501 0.273156 0.193533 +0.17312 0.263127 0.188581 +-0.206119 -0.0619918 0.116346 +-0.201545 -0.0465532 0.095691 +0.256266 0.152102 0.0503785 +0.264034 0.143148 0.0672501 +0.26342 0.152022 0.0867622 +0.269601 0.144159 0.103885 +0.281713 0.137095 0.0629023 +0.296165 0.127981 0.0376256 +0.300117 0.13462 0.0559043 +0.287642 0.140563 0.0456708 +0.278661 0.132147 0.0309413 +0.271646 0.118273 0.028754 +0.262921 0.1025 0.0261376 +0.261118 0.0855637 0.0169037 +0.25422 0.0767023 0.000233527 +0.237362 0.0575218 0.00198963 +0.283388 0.119704 0.0383643 +0.282941 0.112062 0.0540402 +0.249937 0.0937398 -0.00575339 +0.231931 0.0954578 -0.0107377 +0.210437 0.0914748 -0.0140972 +0.239252 0.109782 0.000233887 +0.191402 0.0870306 -0.0134669 +0.184376 0.0704441 -0.0225342 +0.184719 0.0606504 -0.044543 +0.166145 0.0578967 -0.0668264 +0.200251 0.061117 -0.0313226 +0.217304 0.057967 -0.0199728 +0.227686 0.12158 0.00370932 +0.20937 0.123042 0.000300618 +0.244333 0.124524 0.00810813 +0.295429 0.120597 0.0522453 +0.178132 0.0791963 -0.0112798 +0.177197 -0.279627 -0.000252101 +0.173639 -0.299787 -0.00606886 +0.172196 -0.313975 -0.0223573 +0.166117 -0.326159 -0.00858114 +0.168079 -0.321719 -0.0379096 +0.162521 -0.339731 -0.0445028 +0.151373 -0.32895 -0.0576036 +0.312369 -0.105021 0.0899766 +0.306 -0.11652 0.0866674 +0.301418 -0.129182 0.0942967 +0.290875 -0.135236 0.101483 +0.289966 -0.143698 0.1109 +0.295915 -0.13953 0.122573 +0.279108 -0.148197 0.122497 +0.27841 -0.152315 0.142258 +0.265867 -0.157983 0.158785 +0.256687 -0.14661 0.137703 +0.25422 -0.140442 0.172759 +0.232237 -0.161116 0.192798 +0.192807 -0.160413 0.202508 +0.178601 -0.140578 0.237092 +0.154384 -0.117167 0.24831 +0.13004 -0.134226 0.269277 +0.17845 -0.105479 0.223698 +0.247464 -0.158843 0.179106 +0.226891 -0.158442 0.171794 +0.209982 -0.159856 0.187271 +0.217821 -0.141328 0.207646 +0.23745 -0.141109 0.186416 +0.229503 -0.142546 0.156329 +0.214657 -0.125289 0.155947 +0.193847 -0.12199 0.171057 +0.217246 -0.105649 0.140104 +0.198069 -0.0856194 0.142621 +0.193693 -0.14343 0.18682 +0.198045 -0.145975 0.222277 +0.178989 -0.164931 0.225321 +0.158831 -0.146831 0.218292 +0.158889 -0.159611 0.244735 +0.138513 -0.154491 0.257842 +0.156487 -0.13924 0.256434 +-0.290841 -0.208347 -0.00770324 +-0.29533 -0.224009 -0.017137 +-0.30561 -0.24462 -0.0155011 +-0.278365 -0.220452 -0.0277869 +-0.267819 -0.241114 -0.0357093 +-0.286737 -0.259306 -0.0462551 +-0.310093 -0.264404 -0.0203987 +-0.307167 -0.250649 -0.0341839 +-0.307612 -0.281242 -0.0310235 +-0.321036 -0.286281 -0.0471544 +-0.310491 -0.270102 -0.0639157 +-0.311345 -0.301149 -0.0633156 +-0.297683 -0.291436 -0.0450671 +-0.294949 -0.304108 -0.0790095 +-0.285459 -0.27779 -0.0488974 +-0.296472 -0.275126 -0.0168658 +-0.276222 -0.270671 -0.00788631 +-0.246454 -0.248267 -0.0329014 +-0.244456 -0.252303 -0.00937036 +-0.304286 -0.259682 -0.0492577 +-0.294933 -0.27203 -0.0604957 +-0.300998 -0.278796 -0.0743602 +-0.316674 -0.274623 -0.0789273 +-0.337714 -0.280945 -0.0853892 +-0.325825 -0.275251 -0.0655092 +-0.332977 -0.302425 -0.0833069 +-0.293564 -0.290291 -0.0772666 +-0.298024 -0.281309 -0.0905074 +-0.293634 -0.272694 -0.109468 +-0.270428 -0.274072 -0.107657 +-0.256077 -0.253991 -0.120812 +-0.261078 -0.296954 -0.0999473 +-0.2381 -0.297373 -0.0849839 +-0.232752 -0.278906 -0.0645746 +-0.272041 -0.319246 -0.10842 +-0.21032 -0.284441 -0.0448701 +-0.256436 -0.341131 -0.11181 +-0.225098 -0.336223 -0.113241 +-0.200175 -0.288996 -0.0158483 +-0.223009 -0.317757 -0.0905879 +-0.301096 -0.262202 -0.123506 +-0.32405 -0.263071 -0.116908 +-0.292477 -0.257052 -0.14263 +-0.270149 -0.255918 -0.142108 +-0.275486 -0.258003 -0.162669 +-0.259523 -0.2674 -0.178244 +-0.251069 -0.250018 -0.0970302 +-0.24056 -0.260706 -0.172311 +-0.232499 -0.247239 -0.154361 +-0.34182 -0.274562 -0.107339 +-0.294559 -0.307923 -0.0994756 +-0.275844 -0.269552 -0.0355918 +-0.227344 -0.270897 -0.045083 +0.25093 0.170443 0.120028 +0.248384 0.184009 0.106523 +0.235777 0.198062 0.103222 +0.23641 0.211305 0.086191 +0.221152 0.226047 0.0898201 +0.223243 0.24123 0.111495 +0.203883 0.250541 0.105061 +0.226958 0.225862 0.123117 +0.219737 0.240254 0.12789 +0.214138 0.253162 0.132941 +0.232275 0.224561 0.138088 +0.109391 -0.247931 -0.0995264 +0.104952 -0.262437 -0.0820427 +0.080763 -0.274056 -0.0783487 +0.0604155 -0.262392 -0.0950373 +-0.227936 -0.329497 -0.190147 +-0.214125 -0.337031 -0.170051 +0.237261 -0.0846396 0.108485 +0.245187 0.0234669 0.0372413 +0.250061 0.17416 0.133813 +0.259114 0.167602 0.148828 +0.26511 0.166925 0.171546 +0.238618 0.181672 0.138204 +0.229669 0.176644 0.149535 +0.262049 0.187134 0.176237 +0.261795 0.200868 0.165371 +0.276513 0.199318 0.153854 +0.292677 0.199982 0.157209 +0.302715 0.186361 0.157188 +0.308755 0.181779 0.171774 +0.305926 0.190608 0.185482 +0.312423 0.167782 0.169221 +0.31381 0.157653 0.158921 +0.310783 0.154703 0.171639 +0.301108 0.177938 0.144841 +0.293264 0.189309 0.147256 +0.279322 0.188458 0.145304 +0.262483 0.193127 0.192418 +0.274289 0.192768 0.20161 +0.254841 0.206509 0.193978 +0.245154 0.222549 0.189318 +0.253012 0.22552 0.174345 +0.265429 0.23121 0.17081 +-0.253206 -0.236908 -0.0443888 +0.149428 0.386275 0.232451 +0.147867 0.371017 0.232576 +0.152926 0.356705 0.229375 +0.149032 0.338169 0.225131 +0.166114 0.363727 0.223417 +0.172256 0.353426 0.215568 +0.179541 0.338962 0.221969 +0.181625 0.354174 0.201921 +0.186426 0.343494 0.187951 +0.192075 0.328517 0.215563 +0.192453 0.320313 0.195502 +0.17815 0.351274 0.174302 +0.17655 0.370022 0.172318 +0.165276 0.33179 0.225541 +0.00939661 -0.323412 0.0804555 +0.117561 -0.144032 0.250595 +0.120353 -0.125008 0.233582 +0.111251 -0.145731 0.271784 +0.11093 -0.120815 0.285658 +0.0754192 -0.0921393 0.301481 +0.0769558 -0.124739 0.290267 +0.0748528 -0.117401 0.265004 +0.0426218 -0.103655 0.282975 +0.0504123 -0.0659143 0.287583 +0.0836935 -0.0669285 0.279976 +0.0588543 -0.11803 0.279938 +0.0586609 -0.105277 0.297458 +0.0557269 -0.0839063 0.29826 +0.0381914 -0.083198 0.286361 +0.0371995 -0.0680895 0.266535 +0.047335 -0.0888232 0.265922 +0.05563 -0.0732275 0.247968 +0.0616189 -0.0543441 0.232231 +0.0811821 -0.0784737 0.231059 +0.0764784 -0.0353683 0.254905 +0.0689625 -0.0703705 0.29266 +0.0661415 -0.0548095 0.278244 +0.0608765 -0.028919 0.235586 +0.087271 -0.018263 0.234864 +0.0756435 -0.10953 0.298971 +0.0951645 -0.0988538 0.288259 +0.0930654 -0.116235 0.295574 +0.0947803 -0.133863 0.284699 +0.0966033 -0.0830131 0.273711 +0.113798 -0.076403 0.258582 +0.127442 -0.0600385 0.234949 +0.132794 -0.0953943 0.252522 +0.0489111 -0.0556973 0.272686 +0.0606107 -0.0431898 0.263976 +0.0971312 -0.036293 0.245012 +0.110687 -0.0488392 0.23675 +0.126176 -0.0414728 0.221378 +0.136057 -0.0243951 0.201716 +0.122078 0.00127519 0.196707 +0.142291 0.00027007 0.178375 +0.0664164 -0.0191578 0.217877 +0.0802696 -0.0234954 0.199319 +0.0910082 -0.0454502 0.20083 +0.0798776 -0.132726 0.273919 +0.102454 0.00166634 0.210465 +0.0802091 -0.00534582 0.192641 +0.0863635 0.00814252 0.179895 +0.0946306 0.0282399 0.168655 +0.0981336 0.029523 0.148764 +0.101777 0.0395859 0.135111 +0.102082 0.0581642 0.134881 +0.0956437 0.0321468 0.122829 +0.0938658 0.0161985 0.122282 +0.107901 0.00369122 0.128399 +0.078491 0.00576055 0.124425 +0.0841199 0.0382034 0.11313 +0.0659972 0.0331947 0.109714 +0.0520056 0.0196069 0.12098 +0.108345 -0.0142416 0.126349 +0.0915975 -0.0313276 0.129913 +0.122833 -0.0287943 0.124051 +0.142658 -0.0228961 0.131632 +0.132595 -0.0194368 0.150249 +0.060233 0.0422739 0.0970401 +0.0469107 0.0353785 0.0851224 +0.0330985 0.0252247 0.0760721 +0.0344131 0.0145341 0.0525338 +0.0185411 0.0141735 0.0691085 +-0.00651953 0.00766464 0.081092 +0.0314926 0.0314677 0.0951056 +0.0155266 0.0258059 0.107793 +0.11957 0.0050674 0.144577 +0.11348 -0.010764 0.15919 +0.0864989 0.00930931 0.196192 +0.112679 0.0343949 0.172228 +0.110056 0.0172326 0.144505 +-0.231861 -0.256194 -0.0373807 +-0.233847 -0.249852 -0.0220477 +-0.230235 -0.258784 -0.00973726 +-0.217151 -0.280061 0.00814621 +-0.228026 -0.273051 0.0389012 +-0.222798 -0.271648 -0.00409819 +-0.229682 -0.268052 0.0118625 +-0.212876 -0.279385 -0.0140325 +-0.214439 -0.277583 -0.0303969 +-0.199886 -0.285356 -0.0320197 +-0.187179 -0.295224 -0.0255156 +-0.167219 -0.315028 -0.0304058 +-0.156845 -0.302235 -0.0544314 +-0.236758 -0.254924 0.00227314 +0.0884351 -0.404348 -0.0195924 +0.0722252 -0.268984 0.0670772 +0.070147 -0.245252 0.0862941 +0.0966471 -0.229612 0.0882203 +0.0926053 -0.203806 0.103764 +0.0777673 -0.186021 0.118999 +0.0417862 -0.182948 0.126604 +0.0709209 -0.158179 0.128709 +0.095465 -0.128791 0.124296 +0.0102764 -0.16375 0.133447 +-0.0233099 -0.171526 0.153541 +-0.0499934 -0.0465621 -0.00582837 +-0.0749973 -0.0355191 0.0101971 +-0.0645299 -0.324704 -0.077104 +0.221779 0.470802 0.0892895 +0.219761 0.464582 0.1032 +0.246597 0.0246927 0.0795416 +0.253586 0.0320272 0.0977802 +0.252394 0.0305168 0.0670227 +0.261064 0.0424817 0.0637394 +0.267205 0.0556508 0.058182 +0.262106 0.0615289 0.0436471 +0.250683 0.0500973 0.0298185 +0.272972 0.0454164 0.0731281 +0.274554 0.0385023 0.090004 +0.285852 0.0505507 0.0780368 +0.287544 0.066644 0.0791877 +0.280213 0.0764884 0.0661465 +0.226162 0.0537579 -0.00800313 +0.231726 0.0372941 0.00212281 +0.226833 0.070796 -0.0125112 +-0.0228881 0.0822405 -0.0141151 +-0.0164496 0.062439 -0.0353807 +-0.0311204 0.09353 -0.0291259 +-0.0468617 0.0890411 -0.0503417 +-0.0192694 0.0958145 -0.0445491 +-0.0451838 0.0631149 -0.0497516 +-0.0349277 0.0970377 -0.0439657 +-0.0281121 0.0908295 -0.0597278 +-0.0422149 0.0875756 -0.0360098 +-0.0493018 0.0748281 -0.0407497 +-0.0508974 0.0756362 -0.0555946 +-0.045787 0.0616401 -0.0714534 +-0.0463878 0.0860458 -0.0643425 +-0.0469 0.0754389 -0.0734442 +-0.0361876 0.0721397 -0.0877453 +-0.0344753 0.0506229 -0.0835042 +-0.0209274 0.0429352 -0.0951495 +-0.00835098 0.0548898 -0.109767 +-0.0439408 0.0675081 -0.0809412 +-0.0384794 0.0604865 -0.0888934 +-0.0325578 0.0529818 -0.0938199 +-0.0250287 0.0507859 -0.100857 +-0.0171358 0.0586173 -0.103485 +-0.00108771 0.0669554 -0.09638 +0.0141047 0.0764389 -0.0789872 +-0.0166767 0.0687863 -0.0931008 +-0.0154196 0.0443974 -0.106822 +0.00804033 0.0334573 -0.118139 +-0.00353356 0.0420783 -0.115203 +0.00267945 0.0333406 -0.10199 +0.0284162 0.0260832 -0.102463 +0.0140719 0.0342408 -0.0876383 +0.01206 0.042083 -0.0690778 +0.0262722 0.0834922 -0.057317 +0.052314 0.0257381 -0.0888721 +0.0550064 0.0153199 -0.121681 +0.0742668 0.0307726 -0.0684202 +0.0254542 0.0462258 -0.0537161 +0.0192751 0.0579365 -0.0299961 +0.043388 0.0389601 -0.0621497 +0.0632571 0.0407552 -0.0511604 +0.0628168 0.0511918 -0.0295138 +-0.00769957 0.0468719 -0.0674097 +0.0356439 0.036944 -0.129564 +0.00985644 0.0486694 -0.11871 +0.0293481 0.0500299 -0.116265 +0.034304 0.0639803 -0.0982281 +0.0203799 0.0394103 -0.126099 +0.0274107 0.0238815 -0.120304 +-0.00989932 0.038173 -0.0977698 +0.0409915 0.0204434 -0.130582 +0.0603476 0.0361414 -0.135064 +0.0745924 0.0111822 -0.144256 +0.0995383 0.0164619 -0.152082 +0.079494 0.0098491 -0.119596 +0.109969 -0.00178903 -0.14121 +0.128369 -0.00667529 -0.145234 +0.147176 -0.000628591 -0.159936 +0.143478 0.0207956 -0.143584 +0.15945 -0.0140125 -0.151421 +0.167046 -0.013357 -0.130058 +0.175024 -0.000463673 -0.161193 +0.200548 0.00730904 -0.144289 +0.228188 0.00606999 -0.13371 +0.232374 -0.0225206 -0.12062 +0.217352 -0.0205681 -0.149989 +0.196446 -0.0094088 -0.159916 +0.0468892 0.0318746 -0.136603 +0.0588847 0.0194871 -0.141629 +0.0497176 0.0425705 -0.12546 +0.067316 0.0466181 -0.121528 +0.0829023 0.0554408 -0.10632 +0.0702884 0.0671402 -0.0864572 +0.0736048 0.0280122 -0.141966 +-0.0393368 0.0927115 -0.058201 +-0.074253 -0.462729 -0.0674302 +-0.0882268 -0.46748 -0.0836924 +-0.10265 -0.454789 -0.102517 +-0.100302 -0.434985 -0.0953132 +-0.123508 -0.439573 -0.0964816 +0.30376 -0.329009 -0.220778 +-0.34576 -0.287787 -0.1184 +-0.333412 -0.299886 -0.118936 +-0.318278 -0.306436 -0.109371 +-0.342798 -0.273541 -0.122349 +-0.330946 -0.265681 -0.13448 +-0.32759 -0.278136 -0.147142 +-0.313986 -0.269795 -0.152301 +-0.304937 -0.277784 -0.160852 +-0.289134 -0.290053 -0.171285 +-0.300398 -0.29313 -0.159904 +-0.305136 -0.304081 -0.143109 +-0.303823 -0.326091 -0.148763 +-0.297334 -0.338307 -0.131821 +-0.0297344 -0.320795 0.126249 +-0.0440833 -0.337561 0.102751 +-0.0635963 -0.3222 0.124646 +-0.0820192 -0.303394 0.145977 +-0.0280108 -0.346215 0.0792887 +0.190023 -0.166658 -0.160984 +0.187606 0.489479 0.0788413 +0.169798 0.492699 0.0805537 +0.160239 0.479513 0.0724411 +0.160997 0.477019 0.0876359 +0.167909 0.48647 0.0907839 +0.168839 0.465921 0.0685027 +0.185848 0.461592 0.0756332 +0.163713 0.449815 0.0719867 +0.171034 0.442192 0.0868531 +0.172622 0.439121 0.100638 +0.191763 0.435033 0.0761478 +0.150024 0.450095 0.173316 +0.142684 0.444609 0.180888 +0.134925 0.435737 0.185852 +0.0901553 -0.0455623 0.257862 +0.0764097 -0.0467149 0.266788 +0.218445 0.190081 -0.00453558 +0.212983 0.187132 0.0158667 +0.234912 0.203072 -0.0090602 +0.217724 0.208098 -0.00630956 +0.209095 0.231498 0.0538229 +0.223398 0.222537 0.0510417 +0.229495 0.205818 0.051858 +0.241614 0.200114 0.0387668 +0.245196 0.212463 0.0252865 +0.232616 0.199508 0.066443 +0.245867 0.187445 0.0704899 +0.218046 0.211438 0.0580939 +0.206013 0.207163 0.0667587 +0.208167 0.217137 0.0808695 +0.189985 0.216171 0.0819923 +-0.328288 -0.282754 -0.0562593 +-0.321215 -0.270892 -0.0527491 +-0.321885 -0.294532 -0.0580289 +-0.324301 -0.301836 -0.070993 +-0.309665 -0.294095 -0.0515043 +-0.298437 -0.298535 -0.0585809 +-0.293755 -0.297175 -0.0685565 +-0.301865 -0.303693 -0.0670723 +-0.312242 -0.307406 -0.0760424 +0.113855 0.0103494 0.135894 +0.117356 -0.000872108 0.134011 +0.24192 0.231796 0.179613 +0.236568 0.24336 0.180529 +0.226028 0.250706 0.186633 +0.280884 -0.220307 -0.163899 +0.26654 -0.211351 -0.150233 +0.265056 -0.233891 -0.14678 +0.318482 -0.331697 -0.239506 +0.324395 -0.322699 -0.253479 +0.31194 -0.314679 -0.269415 +0.329739 -0.334727 -0.229668 +0.336703 -0.323152 -0.229076 +0.344428 -0.313085 -0.23571 +0.342498 -0.293727 -0.236916 +0.350543 -0.322922 -0.2465 +0.353252 -0.314 -0.261759 +0.347047 -0.326986 -0.235121 +0.0827363 -0.465408 -0.0592863 +0.0757733 -0.45735 -0.0483001 +0.0758332 -0.442944 -0.0486429 +0.0763754 -0.427162 -0.064874 +0.0810297 -0.429275 -0.0354104 +0.0760881 -0.402196 -0.0628009 +0.0803331 -0.462498 -0.0366385 +0.075746 -0.427719 -0.0496393 +0.213629 0.454927 0.154222 +0.216172 0.433851 0.152191 +0.213875 -0.163106 0.208849 +0.228479 0.0837143 -0.0171959 +0.214862 0.0777937 -0.0178642 +0.203914 0.0820668 -0.0169156 +0.213551 0.066976 -0.0133462 +-0.291696 -0.291685 -0.053913 +-0.288445 -0.286967 -0.0453936 +-0.283457 -0.280518 -0.0392925 +0.198493 0.267303 0.113918 +-0.00816198 -0.315253 0.11742 +0.312224 -0.337685 -0.224702 +0.0776115 -0.0114015 0.225043 +0.094616 -0.00802053 0.222738 +0.212523 -0.00317223 -0.153514 +0.228944 -0.0069181 -0.146501 +0.230166 -0.0223035 -0.138067 +0.212902 -0.0238532 -0.132712 +0.194522 -0.0219296 -0.138137 +0.240306 -0.00819778 -0.130311 +0.24497 -0.0122967 -0.113875 +0.221562 -0.0094445 -0.0973672 +0.242491 -0.00970392 -0.0927411 +-0.195428 -0.293105 -0.0588105 +-0.174639 -0.293714 -0.0615636 +-0.159198 -0.295096 -0.0708856 +-0.150745 -0.297027 -0.0916319 +-0.165094 -0.309633 -0.116063 +-0.129532 -0.293794 -0.0901166 +-0.12154 -0.29002 -0.105668 +-0.103655 -0.284754 -0.110478 +-0.083304 -0.273535 -0.126518 +-0.126229 -0.291149 -0.124142 +-0.0551206 -0.282297 -0.123125 +-0.0279253 -0.280704 -0.123568 +-0.0254074 -0.296918 -0.100527 +-0.143636 -0.296672 -0.0765836 +0.228772 0.249576 0.00807469 +0.246793 0.197559 -0.000456927 +0.249351 0.185655 0.00965958 +0.077471 -0.38535 -0.0716786 +0.0780138 -0.366405 -0.0698751 +0.0796117 -0.349597 -0.0694382 +0.0817673 -0.324046 -0.067713 +0.0920794 -0.339278 -0.0766687 +0.0745961 -0.308674 -0.0513846 +0.0686559 -0.285979 -0.0584538 +0.0701691 -0.296007 -0.0346939 +0.0958416 -0.324563 -0.0739969 +0.111686 -0.315208 -0.0712996 +0.118212 -0.295045 -0.0671537 +0.145789 -0.285221 -0.0572786 +0.142444 -0.258951 -0.0651148 +0.125807 -0.256448 -0.0777825 +0.0725557 -0.302564 -0.0188272 +0.0757738 -0.318738 -0.0113816 +0.0755625 -0.334153 -0.022547 +0.0716925 -0.292684 -0.00740334 +0.0574002 -0.292216 -0.00131701 +0.0442788 -0.29974 -0.0118635 +0.0322898 -0.309073 -0.00126775 +0.0158934 -0.319374 -0.00927168 +0.00270388 -0.318254 -0.036966 +0.00321031 -0.33353 0.006095 +0.0101246 -0.330737 0.0331595 +0.0571801 -0.291727 0.0142738 +0.0411549 -0.302632 0.0323113 +0.0568056 -0.290026 0.0325413 +0.0726196 -0.279494 0.0399911 +0.0843075 -0.293947 0.0355701 +0.0802412 -0.296732 0.0208207 +0.0757523 -0.290551 0.00911073 +0.0904109 -0.307387 0.0401159 +0.0937218 -0.321431 0.0333001 +0.0876185 -0.332554 0.0196986 +-0.261918 -0.356193 -0.123562 +-0.274572 -0.363058 -0.128675 +-0.283885 -0.374671 -0.137095 +0.0993425 -0.475253 -0.0345906 +0.105878 -0.470302 -0.022596 +0.161209 0.00758193 -0.157082 +0.162861 -0.00496129 -0.160125 +0.14622 0.0234899 0.00861402 +0.16407 0.00688456 0.00334424 +0.187476 0.0108016 -0.000104135 +0.198618 0.0267239 -0.00776275 +0.213159 0.032032 -0.0211609 +0.229764 0.0271876 -0.0288068 +0.229938 0.0432028 -0.0342052 +0.231973 0.0361819 -0.05417 +0.241585 0.0230077 -0.0674939 +0.235826 0.0200922 -0.0913851 +0.229532 0.00831192 -0.0604593 +0.228417 0.0182383 -0.11087 +0.214387 0.0313739 -0.095916 +0.23826 0.0319925 -0.0407356 +0.240603 0.0153722 -0.0478262 +0.185434 0.0390225 -0.0120783 +0.174046 0.035224 -0.0278333 +0.183039 0.0254835 -0.0435084 +0.185088 0.013208 -0.0664572 +0.184517 -0.00115634 -0.0944301 +0.15883 0.0112792 -0.0789407 +0.166768 0.0454452 -0.0125857 +0.149871 0.0473393 -0.0127261 +0.24097 0.0273212 -0.0523021 +0.244689 0.0183228 -0.0578172 +0.239121 0.00955592 -0.0564169 +0.23067 0.0133196 -0.0511149 +0.217815 0.013095 -0.0555127 +0.202953 0.0215885 -0.0445658 +0.223255 0.0309758 -0.00933388 +0.246338 0.00680161 -0.0920968 +-0.29666 -0.251794 -0.0420083 +-0.282377 -0.246563 -0.0382484 +-0.274248 -0.257163 -0.0411355 +0.121069 0.3764 0.220244 +0.124178 0.361607 0.222425 +0.12316 0.347289 0.21517 +0.120818 0.335014 0.200629 +0.131773 0.318764 0.203442 +0.240354 -0.189104 -0.174254 +0.226426 -0.17846 -0.157236 +0.25469 -0.197929 -0.186668 +0.262527 -0.207499 -0.20859 +0.275709 -0.206748 -0.189755 +0.268196 -0.218714 -0.226562 +0.252109 -0.214264 -0.221034 +0.231966 -0.219863 -0.222417 +0.16439 -0.290409 -0.045741 +0.174232 0.353361 0.161991 +0.167416 0.346038 0.151615 +0.153417 0.351454 0.147309 +0.141711 0.365653 0.160008 +0.174784 0.33351 0.146976 +0.172695 0.32064 0.137876 +0.171538 0.327653 0.122668 +-0.153467 -0.465689 -0.0917447 +-0.142244 -0.458217 -0.0978282 +-0.137315 -0.444624 -0.0945322 +-0.142546 -0.468457 -0.0929801 +-0.130113 -0.470071 -0.0887414 +-0.111868 -0.466578 -0.0912306 +-0.129822 -0.476932 -0.0773011 +-0.116192 -0.47396 -0.0799073 +-0.102072 -0.471199 -0.0816089 +0.0648327 -0.288276 0.006469 +0.290523 -0.14969 0.120852 +0.286341 -0.149084 0.132395 +0.276561 -0.154417 0.131433 +0.266874 -0.144863 0.128327 +0.266123 -0.155511 0.139202 +0.254682 -0.156501 0.14847 +0.243072 -0.144724 0.147014 +0.246658 -0.132891 0.13506 +0.271484 -0.158645 0.148826 +0.262513 -0.161728 0.150556 +0.255383 -0.163883 0.160093 +0.258182 -0.154155 0.170424 +0.247063 -0.165211 0.168804 +0.236375 -0.166699 0.177267 +0.223809 -0.16596 0.182974 +0.219971 -0.167303 0.19665 +0.224247 -0.15536 0.203023 +0.206877 -0.166582 0.198203 +0.201256 -0.167208 0.210293 +0.187949 -0.165778 0.214542 +0.175727 -0.151043 0.207983 +0.205839 -0.156778 0.218275 +0.191606 -0.158183 0.226132 +0.180969 -0.154585 0.235065 +0.170507 -0.150398 0.244702 +0.167678 -0.135398 0.246604 +0.174695 -0.121433 0.234619 +0.192199 -0.123695 0.219574 +0.161002 -0.150315 0.252813 +0.149901 -0.156196 0.25282 +0.145756 -0.15618 0.238445 +0.158231 -0.157867 0.22927 +0.148019 -0.147104 0.261177 +0.14318 -0.132144 0.260892 +0.131504 -0.114456 0.261736 +0.136414 -0.145181 0.266602 +0.124033 -0.152215 0.261533 +0.128756 -0.151616 0.248741 +0.169715 -0.162656 0.235355 +0.125332 -0.145025 0.270918 +0.118124 -0.13431 0.277651 +0.122928 -0.121301 0.271952 +0.113017 -0.148351 0.260498 +0.105868 -0.137752 0.254904 +0.0970603 -0.116879 0.246491 +0.113377 -0.13188 0.244126 +0.102989 -0.14407 0.26402 +0.09993 -0.141861 0.276203 +-0.208269 -0.22401 0.141633 +-0.20692 -0.250284 0.132437 +0.0965268 -0.427234 -0.105996 +0.0991486 -0.439673 -0.0998914 +0.19126 -0.17619 0.0390751 +0.184715 -0.204433 0.0324441 +0.164304 -0.221583 0.0465757 +0.1444 -0.208807 0.0686986 +0.0226172 -0.0147867 0.137076 +-0.142255 -0.49298 -0.0216335 +0.233691 0.0208001 -0.0385404 +-0.192672 -0.315988 0.0839294 +-0.202286 -0.295403 0.104035 +-0.212462 -0.276423 0.111373 +-0.218066 -0.285356 0.0914372 +-0.230517 -0.270625 0.068595 +0.136055 0.0355608 0.0131192 +0.121886 0.0399552 0.0198872 +0.106186 0.0275039 0.0255554 +0.0928691 0.0373146 0.0446539 +0.107832 0.0113031 0.0106037 +0.0853288 0.00897116 0.0135994 +0.0648776 -0.00152148 0.00684991 +0.301901 0.1917 0.196837 +0.304498 0.181718 0.192274 +0.29757 0.171529 0.192207 +0.283611 0.170157 0.190984 +0.17589 0.332048 0.230978 +0.176274 0.318104 0.221305 +0.189786 0.308195 0.22975 +0.199452 0.291101 0.221444 +0.210647 0.278153 0.221165 +0.212403 0.290739 0.232707 +0.229872 0.295702 0.229994 +0.238851 0.283146 0.23072 +0.237981 0.260514 0.227763 +0.248013 0.243086 0.221386 +0.245976 0.271423 0.230129 +0.237201 0.240055 0.208931 +0.239318 0.292509 0.222434 +0.244312 0.28734 0.210021 +0.234086 0.289095 0.199595 +0.221914 0.298769 0.201947 +0.1778 0.322602 0.229777 +0.232474 0.299285 0.221376 +0.223334 0.304746 0.213608 +0.207337 0.311267 0.204764 +0.224642 0.304397 0.226583 +0.214619 0.302742 0.233384 +0.203769 0.313465 0.232857 +0.204968 0.319702 0.218324 +0.201735 0.298965 0.232154 +-0.0492057 -0.0812756 -0.10551 +-0.0710597 -0.075701 -0.12067 +-0.0879497 -0.0905516 -0.13677 +-0.0843511 -0.119489 -0.147588 +-0.0762899 -0.059326 -0.102542 +-0.0985707 -0.0477827 -0.098696 +-0.118275 -0.0536394 -0.113913 +-0.11441 -0.0717159 -0.128365 +0.179503 0.303256 0.0436704 +0.192013 0.290229 0.0290644 +0.17689 0.287515 0.0370015 +0.192038 0.271729 0.0156116 +0.209167 0.267708 0.00969983 +0.200133 0.255704 0.00478026 +-0.247504 -0.392344 -0.224787 +-0.247477 -0.405986 -0.218212 +-0.243099 -0.400741 -0.206484 +-0.246703 -0.405341 -0.193269 +-0.249065 -0.417066 -0.193806 +-0.263856 -0.417281 -0.202583 +-0.253854 -0.410374 -0.185389 +-0.264275 -0.407223 -0.177693 +-0.272044 -0.40206 -0.166216 +-0.284666 -0.409799 -0.163624 +-0.28689 -0.423019 -0.170791 +-0.283285 -0.428723 -0.186577 +-0.301536 -0.424549 -0.197331 +-0.276684 -0.426319 -0.176604 +-0.270204 -0.426002 -0.18843 +-0.267033 -0.421163 -0.178871 +-0.28572 -0.431162 -0.176917 +0.0984334 0.0428629 0.147655 +0.0984512 0.0370662 0.158757 +-0.324734 -0.278381 -0.0492733 +-0.319049 -0.278035 -0.0388895 +-0.314693 -0.271902 -0.0298211 +-0.0814975 -0.486596 -0.0514846 +-0.0716057 -0.47534 -0.0576231 +-0.0807984 -0.475501 -0.0687174 +-0.0782273 -0.46782 -0.0773567 +-0.0794515 -0.454639 -0.076562 +-0.0865219 -0.442019 -0.0638219 +-0.0826697 -0.456554 -0.0896798 +-0.0913604 -0.446861 -0.0969099 +-0.0924184 -0.432044 -0.0753911 +-0.098273 -0.416607 -0.0817744 +-0.111942 -0.395187 -0.0818225 +-0.0923505 -0.401008 -0.0727607 +-0.110463 -0.376831 -0.0757945 +-0.0955645 -0.358515 -0.0727168 +-0.0748788 -0.367775 -0.053732 +-0.099584 -0.336657 -0.0718408 +-0.0617229 -0.346951 -0.0508932 +-0.0372908 -0.340191 -0.0358611 +-0.187209 -0.0514446 0.134371 +-0.172275 -0.062062 0.144345 +-0.181772 -0.0387772 0.12984 +0.27325 0.225257 0.167666 +0.283037 0.221467 0.169903 +0.141164 -0.00931766 -0.150578 +0.223335 -0.262546 -0.149684 +0.199958 -0.258684 -0.141852 +0.218212 -0.249649 -0.131577 +-0.0730224 -0.485274 -0.0383372 +-0.0765985 -0.473674 -0.025717 +-0.0833487 -0.485599 -0.0202509 +-0.0969784 -0.487241 -0.0157338 +-0.106328 -0.475595 -0.0156679 +-0.107519 -0.486132 -0.0147883 +-0.117398 -0.491224 -0.0155421 +-0.11866 -0.497871 -0.0255495 +0.192205 -0.0198585 -0.151725 +0.281772 0.238327 0.210562 +0.269826 0.243309 0.222088 +0.243244 0.207816 -0.00325363 +0.239729 0.221932 -0.000908316 +0.243256 0.225044 0.0142927 +0.235434 0.23543 0.00346349 +0.158954 -0.447934 -0.074517 +0.164 -0.440163 -0.0849532 +0.160645 -0.422992 -0.0839209 +0.160099 -0.41995 -0.0633914 +0.170063 -0.432118 -0.0580684 +0.170775 -0.442201 -0.0470561 +0.167356 -0.452883 -0.036848 +0.157537 -0.464023 -0.0432353 +0.154265 -0.458207 -0.0582632 +0.146921 -0.466798 -0.0291891 +0.17099 -0.445942 -0.0649823 +0.152813 -0.426396 -0.0985179 +0.142833 -0.435406 -0.0989063 +0.126573 -0.436557 -0.100225 +0.120949 -0.42189 -0.103936 +0.130685 -0.411647 -0.0938972 +0.160351 -0.460975 -0.0324222 +0.164884 -0.460693 -0.0398836 +0.167083 -0.430709 -0.0834012 +0.161089 -0.432508 -0.0931652 +0.165433 -0.424956 -0.0749657 +0.155909 -0.417913 -0.0743018 +0.149825 -0.407366 -0.067413 +0.142015 -0.399818 -0.0764637 +0.153043 -0.435416 -0.0966096 +0.148842 -0.431897 -0.101759 +0.145045 -0.424265 -0.10134 +0.147732 -0.418014 -0.0911084 +0.138977 -0.417451 -0.0965307 +0.139635 -0.411036 -0.0878314 +0.14174 -0.430413 -0.104765 +0.134784 -0.434536 -0.101822 +0.135086 -0.440748 -0.0918112 +0.13766 -0.447456 -0.0800542 +0.122938 -0.455334 -0.0698495 +0.127914 -0.428797 -0.106691 +0.135671 -0.430083 -0.106069 +-0.0268041 -0.304928 0.142542 +-0.0182344 -0.281255 0.151927 +0.000262015 -0.258244 0.142866 +0.0151742 -0.229959 0.128466 +-0.00970849 -0.227931 0.154073 +0.0337917 -0.209923 0.115845 +0.0199495 -0.192987 0.125832 +-0.154293 -0.0335699 -0.082135 +-0.129631 -0.0324487 -0.0813475 +-0.120097 -0.027431 -0.0586998 +-0.0956922 -0.0340394 -0.0533561 +-0.0814148 -0.0448428 -0.0722969 +-0.0594432 -0.0515596 -0.0534184 +-0.160793 -0.0482086 -0.0989707 +-0.166155 -0.0307425 -0.0663998 +-0.169924 -0.0270352 -0.0414151 +-0.183311 -0.0375758 -0.0551581 +-0.174206 -0.0274939 -0.0203147 +-0.192353 -0.0397338 -0.00141151 +-0.170447 -0.0249801 0.0063437 +-0.211587 -0.0636911 -0.00501259 +-0.0018753 -0.187141 -0.149775 +0.0183103 -0.182965 -0.142326 +0.0322217 -0.167313 -0.134641 +0.0236675 -0.146992 -0.123167 +-0.00232452 -0.142332 -0.126149 +0.0375806 -0.18533 -0.140019 +0.0530379 -0.201545 -0.137283 +0.0772348 -0.20845 -0.140694 +0.0988175 -0.224384 -0.140468 +0.119251 -0.222512 -0.162731 +0.03788 -0.218276 -0.135529 +0.0772845 -0.19139 -0.155355 +0.080882 -0.225907 -0.127445 +0.0653619 -0.242778 -0.113036 +0.0731805 -0.173068 -0.155239 +0.0897045 -0.191329 -0.166141 +0.102707 -0.199007 -0.171074 +0.119058 -0.208637 -0.176942 +0.127514 -0.196293 -0.185172 +0.13998 -0.205302 -0.190755 +0.149824 -0.215626 -0.194546 +0.161245 -0.221969 -0.199237 +0.175364 -0.230409 -0.20401 +0.173584 -0.215336 -0.204853 +0.178202 -0.198362 -0.197173 +0.188397 -0.22907 -0.211289 +0.202734 -0.22056 -0.215065 +0.199745 -0.239634 -0.214151 +0.0815106 -0.18364 -0.162988 +-0.172104 -0.359269 -0.00938238 +-0.172319 -0.335226 -0.0164663 +-0.16873 -0.368903 -0.0231312 +-0.292266 -0.291505 -0.0889456 +-0.288266 -0.299574 -0.0955502 +-0.280983 -0.308012 -0.105167 +-0.278654 -0.297571 -0.101297 +-0.274336 -0.285615 -0.103446 +-0.260134 -0.28158 -0.0989442 +-0.257005 -0.265144 -0.10215 +-0.26942 -0.305285 -0.10276 +-0.257003 -0.309674 -0.100476 +-0.244993 -0.306014 -0.0938734 +-0.249351 -0.292113 -0.0926885 +-0.25954 -0.322424 -0.104282 +-0.267093 -0.332079 -0.111051 +-0.283312 -0.328944 -0.119574 +-0.249017 -0.331591 -0.10481 +-0.232981 -0.32784 -0.100164 +-0.240291 -0.342062 -0.113719 +-0.229688 -0.345883 -0.126712 +-0.23058 -0.352629 -0.145077 +-0.21352 -0.337371 -0.127344 +-0.269191 -0.344874 -0.117105 +-0.208623 -0.327937 -0.112241 +-0.191793 -0.321843 -0.117022 +-0.180909 -0.311277 -0.104708 +0.11012 0.10505 0.0238496 +0.213679 0.221732 0.163906 +-0.0357839 -0.0025294 0.108473 +-0.0312254 -0.0135193 0.128152 +-0.0238807 -0.033229 0.139313 +-0.00300831 -0.046529 0.144036 +-0.00364169 -0.0760125 0.145155 +-0.0103288 -0.10643 0.141831 +0.015326 -0.129347 0.142131 +-0.041062 -0.0443202 0.130625 +-0.0555252 -0.0465254 0.114753 +-0.0556686 -0.0325657 0.0996413 +-0.0768736 -0.0422105 0.0949058 +-0.0167984 0.000564353 0.123722 +0.00524698 0.0020139 0.129964 +-0.0281137 -0.0861213 0.139333 +-0.0785841 -0.0379469 0.0747431 +-0.0762529 -0.0505618 0.114297 +-0.032521 -0.108383 0.136839 +-0.0633754 -0.0458183 0.101476 +-0.0250298 0.00663901 0.112981 +-0.0219675 0.00393164 0.0935556 +-0.147404 -0.304789 -0.127071 +0.192111 0.473304 0.143665 +0.202701 0.475169 0.131787 +0.206558 0.475874 0.120017 +0.202492 0.480449 0.108775 +0.157654 -0.366957 -0.0205798 +0.26661 -0.307414 -0.281977 +0.270077 -0.295571 -0.288815 +0.283263 -0.291236 -0.297392 +0.290598 -0.279448 -0.297082 +0.304158 -0.276932 -0.29882 +0.315035 -0.2885 -0.301158 +0.307588 -0.298676 -0.297006 +0.297613 -0.307939 -0.283621 +0.293787 -0.301201 -0.295424 +0.318389 -0.297707 -0.296483 +0.328066 -0.301032 -0.289042 +0.324582 -0.309109 -0.276338 +0.33579 -0.291676 -0.2964 +0.346867 -0.288071 -0.287976 +0.353956 -0.299169 -0.28317 +0.345495 -0.307423 -0.274703 +0.352866 -0.288693 -0.277818 +0.351312 -0.284395 -0.265224 +0.355354 -0.294774 -0.257468 +0.360217 -0.304818 -0.260578 +0.35682 -0.308388 -0.269609 +0.359106 -0.312264 -0.252967 +0.356474 -0.316127 -0.245135 +0.351445 -0.319298 -0.237976 +-0.26647 -0.314705 -0.199507 +-0.27426 -0.329739 -0.204261 +-0.290128 -0.337563 -0.206145 +-0.303723 -0.332243 -0.195363 +-0.303858 -0.323407 -0.176279 +-0.302757 -0.349394 -0.210447 +-0.304665 -0.364526 -0.223447 +-0.321319 -0.375627 -0.232938 +-0.285437 -0.371465 -0.224735 +-0.28011 -0.37957 -0.242654 +-0.314609 -0.397575 -0.24523 +-0.31498 -0.344154 -0.199865 +-0.330892 -0.351901 -0.189469 +-0.332902 -0.388937 -0.243068 +-0.348245 -0.402805 -0.233911 +-0.328232 -0.404959 -0.235266 +-0.273541 -0.396265 -0.240028 +-0.293049 -0.39498 -0.245656 +-0.355214 -0.402159 -0.217135 +-0.360108 -0.415844 -0.205721 +-0.346381 -0.42668 -0.201491 +-0.340374 -0.436455 -0.180032 +-0.360217 -0.406031 -0.193698 +-0.356506 -0.391255 -0.182727 +-0.356512 -0.407116 -0.177427 +-0.347384 -0.421732 -0.172779 +-0.348669 -0.37532 -0.17511 +-0.341266 -0.408591 -0.160307 +-0.332592 -0.391247 -0.153464 +-0.323849 -0.407723 -0.153687 +-0.349384 -0.43169 -0.189135 +-0.335815 -0.43119 -0.192046 +-0.324454 -0.435806 -0.181733 +-0.331465 -0.433295 -0.170921 +-0.314528 -0.431132 -0.168412 +-0.260177 -0.397767 -0.235 +-0.252953 -0.401301 -0.227678 +-0.247407 -0.394723 -0.238053 +-0.24372 -0.401046 -0.225417 +-0.243948 -0.396615 -0.216223 +-0.258003 -0.38952 -0.247437 +-0.272162 -0.387844 -0.252537 +-0.287147 -0.384539 -0.255755 +-0.302942 -0.384129 -0.252391 +-0.315505 -0.382766 -0.24459 +-0.323099 -0.390444 -0.249836 +-0.312399 -0.390336 -0.253745 +-0.328503 -0.399215 -0.245058 +-0.340635 -0.398589 -0.24271 +-0.266346 -0.382624 -0.244488 +-0.267321 -0.391914 -0.245578 +-0.0266812 0.0695328 -0.0242573 +-0.00773299 0.0681739 -0.0184911 +0.0122858 0.0669077 -0.0123781 +0.0150035 0.0767227 0.00239352 +0.0141467 0.0954062 -0.00215996 +0.0325338 0.098411 -0.00617133 +0.0450676 0.0983028 0.010086 +0.0314473 0.0730983 0.00401189 +0.0505593 0.0686309 0.00292132 +0.0698817 0.067505 0.00832925 +0.145383 0.180744 0.0984363 +0.132189 0.17376 0.0925198 +0.121241 0.164951 0.0850023 +0.133425 0.169934 0.0774819 +0.11505 0.153676 0.07879 +-0.083942 -0.368893 -0.0674225 +-0.0809876 -0.385027 -0.0581697 +-0.0723248 -0.382058 -0.0416794 +-0.00904893 0.0914446 -0.0120745 +0.00504523 0.0987359 -0.0150796 +0.0060609 0.0932522 -0.034057 +0.0248461 0.0873188 -0.0377031 +0.0363994 0.089055 -0.023789 +0.00213821 0.0914225 -0.00482177 +0.0092558 0.0863088 0.00212053 +0.106375 0.0274106 0.14138 +-0.263884 -0.385451 -0.252252 +0.258755 0.24689 0.225661 +0.259085 0.23306 0.219814 +0.249971 0.25591 0.228242 +-0.322841 -0.345115 -0.164492 +-0.323706 -0.355326 -0.152393 +-0.279169 -0.265328 -0.0439542 +-0.285416 -0.267917 -0.0516616 +-0.294745 -0.263175 -0.0517725 +0.23393 -0.0149701 -0.10397 +0.219738 -0.0165453 -0.112039 +0.204608 -0.00981825 -0.104246 +0.187184 -0.00954937 -0.110855 +0.228145 0.230452 0.102316 +0.214447 0.238029 0.0983297 +0.23229 0.220992 0.0943503 +0.215398 0.247623 0.105271 +0.217938 0.25177 0.117669 +0.210276 0.258003 0.111405 +0.220949 0.241286 0.103103 +0.290344 -0.337843 -0.233955 +0.276226 -0.337233 -0.22831 +0.296573 -0.339782 -0.226215 +0.227663 0.461812 0.0838481 +0.234265 0.455281 0.0718225 +0.229698 0.445794 0.0603386 +0.225781 0.470182 0.0813133 +0.214396 0.4698 0.0788369 +0.208406 0.478123 0.0862021 +0.214031 0.460896 0.0711899 +0.217085 0.451741 0.0628259 +0.219354 0.474333 0.0827819 +0.21619 0.47758 0.0903862 +0.217994 0.472178 0.097233 +0.209525 0.481852 0.0939712 +0.227208 0.456115 0.0633709 +0.234329 0.451682 0.0642008 +0.23166 0.462658 0.0759848 +0.273713 -0.249314 -0.252993 +0.274317 -0.268417 -0.267071 +0.263304 -0.282613 -0.260934 +-0.240326 -0.404033 -0.2139 +-0.241182 -0.408607 -0.207233 +0.243855 0.194683 0.113624 +0.235959 0.206195 0.114609 +-0.329827 -0.30598 -0.098469 +-0.057071 -0.0425853 0.0117122 +-0.0551192 -0.0420888 0.0309046 +-0.0534835 -0.0402863 0.0500454 +-0.0435993 -0.0469165 0.00748095 +-0.0255629 -0.0374196 0.00481763 +-0.00817324 -0.0328811 -0.0061182 +-0.00350439 -0.0437548 -0.0255784 +-0.0349503 -0.0490115 -0.00492533 +-0.0419875 -0.0536475 -0.0293419 +-0.0139014 -0.0607747 -0.0378374 +-0.0105205 -0.0780801 -0.0585195 +-0.0335249 -0.0540562 -0.0180409 +-0.0278411 -0.0595083 -0.0313207 +0.193253 0.49569 0.0858481 +0.189805 0.494474 0.0949255 +0.179559 0.491992 0.0947812 +0.19709 0.487808 0.0978913 +0.174576 0.497081 0.0879734 +0.179584 0.496616 0.0784813 +0.175502 0.48892 0.0725035 +0.169475 0.481635 0.069206 +0.164994 0.474033 0.0669237 +0.155945 0.469227 0.0714265 +0.159639 0.459314 0.0671634 +0.0454737 -0.0938547 0.293886 +0.0481458 -0.104952 0.292926 +0.0550885 -0.114349 0.29062 +0.0654216 -0.120788 0.289843 +0.0691263 -0.126298 0.278339 +0.0372417 -0.0943784 0.286279 +0.0377118 -0.088702 0.274623 +0.179652 -0.262284 0.0054219 +0.186087 -0.244472 0.00347757 +0.246807 -0.00615903 -0.103541 +0.242297 -0.0135206 -0.100916 +0.240802 -0.0172339 -0.108388 +0.232593 -0.0188607 -0.112191 +0.240348 -0.0194541 -0.117278 +0.238974 -0.018297 -0.127651 +-0.164632 -0.397326 -0.024693 +0.0813645 -0.458079 -0.0716845 +0.302397 0.127887 0.0470846 +0.298473 0.138148 0.0455108 +0.292313 0.136477 0.0386335 +0.288054 0.130079 0.0326142 +0.28271 0.137427 0.0379629 +0.271939 0.136706 0.038053 +0.261008 0.14116 0.0404912 +0.28194 0.12422 0.0312108 +0.300876 0.126279 0.0551937 +0.295306 0.129324 0.0632115 +0.286846 0.130603 0.0706512 +0.282604 0.11846 0.0804122 +0.273418 0.134767 0.0747422 +0.296205 0.121995 0.0600976 +0.289869 0.116278 0.0576534 +0.283444 0.108666 0.0679441 +0.208186 0.435058 0.0678801 +0.218992 0.437774 0.0675136 +0.20517 0.444041 0.0615 +0.195457 0.447135 0.0675955 +0.224157 0.438328 0.0597838 +0.221367 0.446069 0.0584788 +0.168291 -0.443724 -0.076199 +-0.239169 -0.248023 -0.0426243 +-0.246509 -0.244281 -0.0523825 +-0.245933 -0.250709 -0.0701381 +-0.252213 -0.23035 -0.0598084 +-0.256922 -0.212794 -0.063622 +-0.26443 -0.20039 -0.048456 +-0.236601 -0.248665 -0.0331221 +-0.248238 -0.244973 -0.04299 +-0.257005 -0.243536 -0.0363368 +-0.264619 -0.253098 -0.0324677 +-0.260909 -0.234911 -0.0387305 +-0.270856 -0.228969 -0.0335016 +-0.268106 -0.214873 -0.0367573 +-0.255525 -0.250409 -0.0291707 +-0.246354 -0.252152 -0.0213798 +-0.25421 -0.258055 -0.0140562 +-0.253371 -0.258976 0.00135493 +-0.263391 -0.256528 0.0180325 +-0.264412 -0.265611 -0.0106557 +-0.268835 -0.263918 0.00476582 +-0.24972 -0.252323 0.0327963 +-0.239732 -0.259608 0.0493553 +-0.242639 -0.251027 0.0706418 +-0.27192 -0.270836 -0.02103 +-0.264888 -0.241199 0.0366373 +-0.279792 -0.22631 0.033251 +-0.274206 -0.207933 0.0474852 +-0.283361 -0.276288 -0.0174295 +-0.267659 -0.226048 0.0482271 +0.202151 0.274483 0.19338 +0.194908 0.283204 0.198963 +-0.157532 -0.273615 -0.179435 +-0.176899 -0.279729 -0.184503 +-0.188947 -0.290942 -0.187096 +-0.192598 -0.3074 -0.18306 +-0.203551 -0.297799 -0.190929 +-0.222085 -0.288246 -0.191352 +-0.217908 -0.303036 -0.194268 +-0.355074 -0.426501 -0.195973 +-0.354866 -0.423993 -0.205337 +-0.355569 -0.419108 -0.214528 +-0.353763 -0.412061 -0.224887 +-0.346029 -0.286085 -0.1062 +-0.341227 -0.288967 -0.0947058 +-0.336277 -0.278132 -0.0971269 +-0.328988 -0.269127 -0.105169 +-0.340297 -0.292656 -0.0831052 +-0.335578 -0.266756 -0.115188 +-0.339311 -0.299368 -0.0917431 +0.212569 0.261061 0.18216 +0.216886 0.255854 0.175009 +0.219484 0.251322 0.162982 +0.212289 0.247584 0.170006 +0.218513 0.26322 0.154269 +0.225667 0.261532 0.178216 +0.218436 0.276817 0.178562 +0.234042 0.273996 0.185236 +0.223426 0.242038 0.154678 +0.21181 0.288948 0.181391 +0.220498 0.257755 0.18435 +0.211254 0.266563 0.187703 +0.211739 0.26954 0.199826 +0.278409 -0.209413 -0.174692 +0.233056 0.457965 0.0658843 +0.227063 0.46182 0.0682472 +0.220168 0.458063 0.0666597 +-0.0481392 -0.0447802 0.0166181 +0.131516 0.0530135 0.000672445 +0.12038 0.0567042 0.000376152 +0.134766 0.046581 0.0097546 +0.0956782 -0.141364 0.26837 +0.0877085 -0.13595 0.269242 +0.0854698 -0.124959 0.261926 +0.0839071 -0.111836 0.253439 +0.0904091 -0.099649 0.239147 +0.0872053 -0.136949 0.279095 +0.085161 -0.130401 0.287023 +0.0763801 -0.13103 0.282851 +-0.00884361 -0.0890856 -0.0728998 +-0.00654069 -0.102279 -0.0895079 +-0.0290648 -0.104665 -0.111248 +-0.0100257 -0.116287 -0.107029 +0.0875054 -0.104584 0.297054 +0.191386 -0.264049 -0.175252 +0.190045 -0.262732 -0.156889 +0.204589 -0.269071 -0.178679 +0.222111 -0.273266 -0.172895 +0.189235 0.0753918 -0.0129238 +0.0782752 -0.467624 -0.0498343 +0.0759673 -0.46177 -0.0555898 +0.0772195 -0.460605 -0.0642783 +0.151932 0.323656 0.079912 +0.153175 0.313215 0.0881136 +0.161272 0.302381 0.0857396 +0.163146 0.324848 0.0718597 +0.151557 0.334415 0.0880604 +0.142886 0.334889 0.0972586 +0.140662 0.34411 0.107021 +0.133598 0.347717 0.117582 +0.131314 0.355467 0.129074 +0.127988 0.361743 0.142546 +0.123763 0.348981 0.138438 +0.119822 0.353337 0.149718 +0.116288 0.351928 0.168204 +0.226419 0.174912 -0.00671405 +0.232006 0.15884 0.00199041 +0.243933 0.169091 0.00253819 +0.237571 0.172786 -0.00612936 +0.183717 0.142245 0.147062 +0.183533 0.157982 0.153224 +0.200684 0.169917 0.154336 +0.175927 0.14817 0.154877 +0.164064 0.143191 0.159694 +0.181391 0.132744 0.149775 +0.177453 0.123521 0.157312 +0.108424 0.0602759 0.0311611 +0.101691 0.0511896 0.042029 +0.297187 0.12858 0.124591 +0.286869 0.125817 0.115842 +0.279264 0.13651 0.11071 +0.277464 0.150893 0.114839 +0.267972 0.163015 0.116989 +0.29066 -0.215317 -0.195858 +-0.0439761 -0.143405 -0.149346 +0.0959309 0.0199379 0.158053 +0.0941358 0.00844127 0.16726 +0.273991 -0.158318 0.138404 +0.280108 -0.155995 0.136908 +0.28311 -0.154668 0.131232 +0.287165 -0.152142 0.126309 +0.291082 -0.145525 0.127381 +0.258354 -0.329753 -0.2515 +0.256649 -0.327468 -0.240856 +0.265642 -0.321399 -0.233195 +0.269005 -0.32965 -0.227653 +0.204877 0.287044 0.0357487 +0.289139 -0.339472 -0.226774 +0.282728 -0.335989 -0.224475 +0.283065 -0.327384 -0.221193 +0.28398 -0.316486 -0.219293 +0.289461 -0.305296 -0.210924 +0.2738 -0.310998 -0.221733 +0.2646 -0.301502 -0.221281 +0.282981 -0.339471 -0.231684 +0.275544 -0.336339 -0.239462 +0.259131 -0.2954 -0.232139 +0.281853 -0.296955 -0.202405 +0.287258 -0.287693 -0.192682 +0.301236 -0.282638 -0.194913 +0.23745 0.0270265 -0.0333549 +0.234865 0.0358956 -0.0292661 +0.240774 0.0243245 -0.0402136 +0.034599 -0.0884904 0.28182 +0.0345637 -0.0787252 0.277243 +0.0422003 -0.0728232 0.283477 +0.048607 -0.0763619 0.292696 +0.0395236 -0.0802562 0.266836 +0.0486856 -0.0788086 0.257578 +0.044992 -0.0647291 0.254151 +0.0587204 -0.0731238 0.296598 +0.068389 -0.0812067 0.300077 +0.0829644 -0.0808872 0.290453 +0.0435251 -0.0559756 0.262078 +0.20354 0.276522 0.016541 +-0.0980428 -0.240155 0.197738 +-0.0924965 -0.26196 0.186819 +-0.109853 -0.270124 0.168775 +-0.253582 -0.386742 -0.238773 +-0.0267016 0.0982672 -0.0374627 +0.214024 0.433945 0.0622105 +0.204736 0.432758 0.058829 +0.201109 0.433103 0.0655996 +0.201809 0.436011 0.073894 +0.193477 0.433855 0.0682907 +0.185218 0.436354 0.0703184 +0.180836 0.436291 0.0819631 +0.191166 0.440882 0.0659291 +0.187348 0.447071 0.070626 +0.179215 0.453739 0.0726364 +0.193028 0.454826 0.0736221 +0.173421 0.440644 0.0776765 +-0.147031 -0.496444 -0.028386 +-0.151597 -0.495421 -0.0374969 +-0.157627 -0.484775 -0.0397619 +-0.140246 -0.499465 -0.0256815 +-0.132401 -0.5 -0.0296698 +-0.132703 -0.497498 -0.0384881 +-0.126331 -0.494492 -0.0452588 +-0.11646 -0.490117 -0.0524448 +-0.101295 -0.487303 -0.0547567 +-0.136101 -0.494007 -0.0471871 +-0.13938 -0.490039 -0.0561432 +-0.133381 -0.483866 -0.0661423 +-0.15577 -0.492035 -0.0446482 +-0.153261 -0.490282 -0.0555144 +0.197755 0.272342 0.0690149 +0.190382 0.263313 0.0560052 +0.0686632 -0.292912 -0.0237205 +0.056243 -0.29127 -0.0303266 +0.0398126 -0.298058 -0.030698 +0.0315681 -0.295788 -0.0489563 +0.043708 -0.285681 -0.061727 +0.0621136 -0.289132 -0.040881 +0.0722108 -0.295077 -0.0484755 +0.0577034 -0.286988 -0.0524253 +0.0569935 -0.281989 -0.0659264 +0.064236 -0.290328 -0.0328163 +-0.0127838 0.0757233 -0.00921143 +0.0935192 0.0772038 0.0642915 +0.169714 0.302879 0.0497006 +0.163659 0.300165 0.0640716 +0.172929 0.295611 0.0434924 +0.049865 0.0913802 0.0221499 +0.0418831 0.0808731 0.013212 +0.0368549 0.0913191 0.0145569 +0.0319565 0.0968433 0.00544037 +0.310435 0.13526 0.142507 +0.026474 0.0305763 -0.129196 +0.017822 0.0292426 -0.122273 +0.0163904 0.0280919 -0.108702 +0.0350495 0.0278097 -0.132911 +0.178361 0.286185 0.0866978 +0.184473 0.288229 0.0959947 +0.0746028 -0.0119842 0.202652 +0.0770488 -0.00198153 0.201878 +0.0861829 0.00359659 0.206228 +0.0964676 0.00912576 0.20305 +0.110414 0.00821695 0.200752 +0.119478 0.0159283 0.18886 +-0.0749585 -0.470198 -0.0703816 +-0.0722579 -0.469101 -0.0627931 +-0.0775597 -0.45771 -0.0519849 +-0.0725204 -0.466379 -0.0530837 +-0.0822617 -0.458336 -0.0360309 +0.11796 -0.00196684 -0.151498 +0.110489 0.008862 -0.155734 +0.119387 0.0273131 -0.141295 +0.100036 0.00317869 -0.149099 +0.0946498 0.00360487 -0.130289 +0.0996271 0.00897841 -0.108462 +0.0876406 0.00969553 -0.149119 +0.0889673 0.0239205 -0.144401 +0.103773 0.0275171 -0.140968 +0.112143 0.0407687 -0.122665 +0.128275 -0.00210722 -0.155193 +0.136944 0.00690927 -0.158099 +0.1315 0.01712 -0.150046 +0.148823 0.0111196 -0.154092 +0.137878 -0.00286061 -0.157253 +0.0812501 0.0180999 -0.148671 +0.0723702 0.0199576 -0.146504 +0.0894465 0.0177562 -0.14994 +-0.244247 -0.411744 -0.197734 +0.0532101 -0.0425986 0.239458 +0.0614299 -0.034607 0.250277 +0.0718515 -0.0264935 0.244569 +0.0612036 -0.0408317 0.227838 +0.211416 0.21985 0.0506815 +0.209629 0.209187 0.0516229 +0.197715 0.200596 0.0531448 +0.210711 0.212673 0.041983 +0.209533 0.205981 0.0261421 +0.207685 0.214484 0.0320655 +0.204793 0.215907 0.019768 +0.207322 0.190012 0.0316877 +0.210424 0.206724 0.0353988 +0.209086 0.197885 0.0355421 +0.19948 0.191764 0.0420701 +0.206287 0.1798 0.0239909 +0.199532 0.162119 0.0159658 +0.0889829 0.0153312 0.187549 +0.0895058 0.0194699 0.175832 +0.0997882 0.0258376 0.180178 +0.0912633 -0.43583 -0.104962 +0.0893849 -0.44209 -0.0966632 +0.0818551 -0.438899 -0.0891003 +0.0775492 -0.435915 -0.0759439 +0.0805228 -0.426773 -0.087989 +0.0848008 -0.421093 -0.0971385 +0.0844397 -0.410175 -0.0930928 +0.0796444 -0.399052 -0.082153 +0.096306 -0.399151 -0.0928503 +0.0992866 -0.434977 -0.10667 +-0.038871 -0.095203 0.134909 +-0.0453136 -0.074362 0.132403 +-0.0642973 -0.0816285 0.135216 +0.128958 0.371237 0.164377 +0.114324 0.368213 0.169385 +0.110394 0.358489 0.182698 +0.119359 0.382173 0.172221 +0.244566 0.0274799 0.091132 +0.236517 0.0321023 0.108593 +0.228129 0.0154777 0.110489 +0.243652 -0.0044318 0.106704 +0.215089 0.0116198 0.126655 +0.193164 -0.00203925 0.149761 +0.295901 -0.145148 0.11649 +0.181002 0.326878 0.162405 +0.192626 0.308402 0.164847 +0.180295 0.335983 0.171005 +0.215019 0.222685 -0.0085752 +0.216226 0.238327 -0.00679645 +0.204842 0.243639 -0.00108745 +0.197086 0.237151 0.00943393 +0.207737 0.21475 -0.00125832 +0.200663 0.225332 0.00994825 +0.227239 0.239308 -0.00361834 +0.210369 0.205349 -0.000451507 +0.212421 0.195338 0.00658041 +0.0965367 0.0723068 0.0490018 +-0.263237 -0.382248 -0.20077 +-0.334935 -0.395374 -0.246716 +0.0666968 0.0983382 0.0352739 +0.0735768 0.104043 0.0256427 +0.0854137 0.105714 0.0280147 +0.0966684 0.103408 0.0197312 +-0.293219 -0.246559 0.00868918 +-0.284829 -0.260543 0.00656712 +0.231694 -0.239358 -0.229883 +0.249173 -0.248287 -0.23972 +-0.313753 -0.278534 -0.156686 +-0.167921 -0.0222432 0.100354 +-0.166557 -0.0217484 0.0804222 +-0.137191 -0.0189498 0.0544508 +-0.183157 -0.0297007 0.0652393 +-0.193717 -0.0386652 0.0428719 +-0.162262 -0.0205653 0.0563587 +-0.148465 -0.0201145 0.071316 +-0.122512 -0.0229086 0.0762312 +-0.112808 -0.0225311 0.0535636 +-0.15755 -0.0225071 0.112728 +-0.13968 -0.0242143 0.109228 +-0.128528 -0.0323847 0.121144 +-0.137944 -0.0426964 0.133983 +0.338353 -0.331842 -0.233 +0.197716 0.0369013 -0.0158252 +0.225598 0.0269623 0.107608 +0.227611 0.0352699 0.116368 +0.216481 0.0416846 0.126455 +0.20366 0.0291575 0.127785 +0.197706 0.0139181 0.138946 +0.177004 0.0154396 0.15063 +0.196436 0.0406475 0.130552 +0.183582 0.0465791 0.137895 +0.171962 0.0340634 0.144092 +0.209838 0.0350513 0.1214 +0.122018 -0.0147207 0.202688 +0.134625 -0.010294 0.190699 +0.150345 -0.0204184 0.190322 +0.171467 -0.0443352 0.191435 +0.124137 -0.0275222 0.21069 +0.115004 -0.0324307 0.220668 +0.103488 -0.0235525 0.230568 +-0.234966 -0.250492 -0.00657503 +0.230136 -0.0629922 0.010065 +0.22781 -0.0439028 0.0052695 +0.226758 -0.0758146 -0.00318988 +0.218119 -0.0755566 -0.0185995 +0.210925 -0.0881128 -0.0299059 +0.195391 -0.0835698 -0.0397083 +0.187049 -0.0970928 -0.0513544 +0.215909 -0.10623 -0.0275177 +0.221663 -0.111792 -0.00835326 +0.21689 -0.135734 -0.006698 +0.187289 -0.0668273 -0.0361071 +0.170089 -0.0549841 -0.0384156 +0.158135 -0.0292105 -0.0224101 +0.144698 -0.0631652 -0.0561794 +0.210349 -0.156804 0.00619425 +0.122465 -0.0210506 -0.020971 +0.25102 0.0827579 -0.00901225 +0.246076 0.0717907 -0.00732438 +0.248146 0.0653429 0.00439784 +0.245544 0.0538898 0.0151974 +0.255748 0.0868229 -0.000826293 +-0.125725 -0.258433 -0.170214 +0.151089 -0.0268375 0.140451 +0.244155 0.0131187 -0.0533056 +0.246127 0.0105937 -0.0612737 +0.239403 0.00492409 -0.0645919 +0.228547 -0.00190445 -0.0800819 +0.236042 0.000460551 -0.073323 +0.244455 -0.00400961 -0.0816292 +0.225173 0.00380285 -0.0703884 +0.247885 -0.00234363 -0.0902777 +0.247838 0.00379159 -0.0839495 +0.243353 0.0148187 -0.0838177 +0.236031 0.0244971 -0.0791546 +0.225616 0.0291453 -0.0875646 +-0.29518 -0.390079 -0.254006 +-0.303646 -0.394416 -0.248506 +-0.302477 -0.403327 -0.233435 +-0.298023 -0.412267 -0.217588 +-0.29425 -0.38151 -0.250683 +-0.302074 -0.390767 -0.254186 +0.191342 0.435898 0.0636941 +-0.0964353 -0.460913 -0.0144457 +0.137532 -0.0116873 0.139128 +0.343547 -0.294973 -0.292923 +0.137424 0.0947211 0.0118894 +0.147115 0.0902563 -0.00271409 +0.147874 0.0802052 -0.0226835 +0.255027 -0.310713 -0.257667 +0.257498 -0.300887 -0.266482 +0.220835 -0.0105204 -0.15317 +0.210403 -0.014095 -0.156518 +0.204562 -0.0228168 -0.148776 +-0.117774 -0.20207 0.202016 +3 566 1199 1209 +3 886 137 1150 +3 2085 17 2088 +3 1317 1316 328 +3 1015 1021 1016 +3 1219 1218 721 +3 970 1215 182 +3 526 528 185 +3 528 446 185 +3 1552 1534 1551 +3 665 666 630 +3 1114 1209 242 +3 279 6 280 +3 6 283 280 +3 612 938 939 +3 235 273 275 +3 2527 1710 2528 +3 2188 2187 2186 +3 11 206 278 +3 906 93 2043 +3 524 2685 2686 +3 2107 2109 2102 +3 1341 1343 750 +3 1328 1341 750 +3 1738 519 1856 +3 2588 1612 2587 +3 2300 2228 2301 +3 976 96 974 +3 103 21 104 +3 1644 1645 31 +3 1649 1645 1644 +3 2027 2028 295 +3 732 733 458 +3 588 1068 1070 +3 987 2154 2153 +3 2147 987 2153 +3 214 38 215 +3 2165 2168 467 +3 2687 257 2690 +3 216 548 928 +3 548 547 928 +3 970 2117 96 +3 452 1006 1005 +3 945 1912 2496 +3 616 1478 1479 +3 1749 1754 512 +3 1550 2735 1969 +3 52 1449 1450 +3 2064 52 1450 +3 2330 2336 1347 +3 2017 1463 74 +3 329 326 1725 +3 917 918 176 +3 1967 247 1966 +3 413 1929 1930 +3 837 538 184 +3 1120 354 352 +3 1859 1858 134 +3 5 962 1092 +3 80 27 1563 +3 1453 1646 175 +3 1915 1916 2581 +3 21 105 104 +3 21 103 29 +3 2143 943 1148 +3 288 2143 1148 +3 294 1903 1904 +3 1247 1828 442 +3 1718 1719 337 +3 687 1171 1169 +3 1170 687 1169 +3 1453 66 1646 +3 68 891 122 +3 260 1711 341 +3 790 396 472 +3 1480 418 1479 +3 279 11 278 +3 277 279 278 +3 226 2083 2082 +3 258 259 76 +3 677 674 709 +3 1216 934 1214 +3 1561 1562 1941 +3 91 2036 961 +3 714 719 1217 +3 714 717 719 +3 47 281 280 +3 85 1945 2209 +3 207 154 64 +3 1963 1961 1962 +3 547 837 184 +3 76 261 1582 +3 259 261 76 +3 673 697 1468 +3 651 697 673 +3 296 17 297 +3 17 2085 297 +3 548 216 900 +3 381 383 382 +3 271 269 296 +3 269 17 296 +3 1066 647 1786 +3 115 199 196 +3 1040 1033 864 +3 1484 2536 2211 +3 212 544 238 +3 1943 1562 27 +3 364 72 365 +3 665 648 664 +3 82 168 158 +3 1117 632 1155 +3 439 1373 1378 +3 788 787 397 +3 178 2624 455 +3 159 2063 157 +3 1620 1622 1621 +3 1622 1264 1621 +3 1463 141 1462 +3 2107 2100 2109 +3 358 2100 2107 +3 559 528 525 +3 64 264 274 +3 137 365 380 +3 379 137 380 +3 117 887 886 +3 377 376 136 +3 88 2528 2529 +3 83 1283 1290 +3 1782 683 1785 +3 1605 575 701 +3 636 593 1771 +3 497 494 496 +3 1818 1247 54 +3 1669 1544 511 +3 1153 1053 1052 +3 42 1788 1791 +3 21 67 106 +3 81 80 84 +3 20 105 118 +3 20 156 105 +3 67 21 256 +3 999 258 1000 +3 259 258 65 +3 640 874 1628 +3 1984 116 1983 +3 1130 401 1131 +3 126 1579 1582 +3 164 1857 163 +3 120 164 163 +3 2736 378 377 +3 1759 1856 519 +3 504 505 412 +3 1127 738 305 +3 1241 1008 1244 +3 850 1779 1778 +3 2647 1779 850 +3 565 1206 1205 +3 1636 1022 1635 +3 158 168 51 +3 777 1524 1525 +3 980 982 61 +3 280 281 11 +3 903 93 902 +3 581 2263 1306 +3 1289 1442 1446 +3 68 122 118 +3 238 531 549 +3 138 365 887 +3 1500 1526 1499 +3 264 1683 268 +3 2042 2043 93 +3 6 273 283 +3 2516 63 246 +3 236 317 319 +3 40 84 80 +3 84 40 104 +3 762 1324 1323 +3 1326 762 1323 +3 170 263 265 +3 1949 170 265 +3 21 106 105 +3 928 183 1703 +3 928 929 183 +3 1857 164 165 +3 67 249 106 +3 283 235 47 +3 63 1968 246 +3 314 235 275 +3 434 435 188 +3 1709 1710 345 +3 1145 2393 2394 +3 2421 585 1086 +3 1448 1289 1446 +3 2 1120 1121 +3 1046 2472 2473 +3 1774 219 1772 +3 1699 981 1695 +3 264 268 274 +3 438 1394 1231 +3 520 2684 524 +3 2684 2683 524 +3 118 105 106 +3 164 120 121 +3 71 131 165 +3 63 247 1968 +3 1857 165 1858 +3 2017 2015 2016 +3 2248 2394 2249 +3 254 106 249 +3 254 68 106 +3 676 652 661 +3 1462 75 2098 +3 973 180 975 +3 263 24 265 +3 1984 1983 916 +3 1687 170 1451 +3 124 1000 76 +3 277 278 64 +3 430 151 429 +3 2188 2719 2152 +3 802 406 472 +3 1463 237 74 +3 1957 1540 2573 +3 2659 888 881 +3 888 883 881 +3 377 378 135 +3 132 72 364 +3 282 109 293 +3 109 282 319 +3 224 83 1290 +3 74 381 376 +3 2017 2016 141 +3 2189 2640 2187 +3 1118 1405 1404 +3 411 798 797 +3 2586 1604 700 +3 126 1582 261 +3 983 34 975 +3 883 1954 1952 +3 98 1299 275 +3 912 1730 915 +3 144 2094 2099 +3 23 234 78 +3 594 784 698 +3 337 1454 332 +3 1454 1455 332 +3 1555 16 1554 +3 541 92 543 +3 2157 2189 2152 +3 2199 2544 2543 +3 378 72 135 +3 1759 1747 1856 +3 278 206 207 +3 170 82 1451 +3 265 24 266 +3 308 153 927 +3 310 308 927 +3 267 1950 1466 +3 236 316 317 +3 1858 165 134 +3 1861 2350 1443 +3 163 159 120 +3 1428 1432 1427 +3 740 887 117 +3 138 887 740 +3 935 1215 970 +3 971 935 970 +3 2632 691 2634 +3 443 187 444 +3 1685 154 894 +3 256 21 29 +3 84 168 81 +3 1267 2348 2646 +3 2698 79 836 +3 146 363 2106 +3 1307 1308 2234 +3 68 118 106 +3 1027 1022 1636 +3 2735 1549 1668 +3 1215 1216 1214 +3 906 901 93 +3 809 394 808 +3 504 388 505 +3 747 1172 2091 +3 817 815 481 +3 554 1322 179 +3 883 888 1954 +3 630 1117 1122 +3 665 630 1122 +3 1234 1227 1238 +3 2677 2676 1400 +3 496 493 497 +3 1653 1197 1196 +3 1364 1009 442 +3 913 912 914 +3 1818 1817 1246 +3 1817 1820 1246 +3 2695 2698 241 +3 985 971 977 +3 2624 2670 191 +3 1434 2726 1425 +3 264 1680 1683 +3 264 1681 1680 +3 346 330 1123 +3 1121 1120 353 +3 1478 551 1479 +3 2008 115 1989 +3 143 1458 1459 +3 1451 1676 1687 +3 211 958 959 +3 319 318 109 +3 319 317 318 +3 2044 2040 209 +3 999 123 258 +3 207 59 894 +3 1733 241 832 +3 841 222 1773 +3 540 841 1773 +3 87 343 1713 +3 612 899 613 +3 392 787 790 +3 961 960 959 +3 1979 976 918 +3 976 176 918 +3 1757 2706 2707 +3 278 207 64 +3 518 1655 1654 +3 2734 1665 2733 +3 1665 2734 1550 +3 1091 1089 1090 +3 190 2555 2556 +3 786 392 577 +3 1740 1746 1756 +3 470 800 389 +3 2122 1033 1032 +3 510 509 1540 +3 321 2020 2026 +3 470 471 503 +3 1164 757 1165 +3 547 184 929 +3 1211 1212 933 +3 1855 255 101 +3 1882 591 2221 +3 124 998 999 +3 273 98 275 +3 225 1576 1577 +3 48 313 314 +3 533 2690 2691 +3 2690 533 532 +3 1860 1859 462 +3 1773 1772 964 +3 778 2201 2200 +3 307 39 311 +3 39 307 320 +3 1495 1497 1502 +3 1547 1665 1546 +3 409 938 612 +3 2481 2295 2294 +3 535 838 839 +3 453 438 1233 +3 523 1475 2702 +3 1243 447 1242 +3 1640 2133 2138 +3 503 388 504 +3 1667 1666 1670 +3 1666 1547 1670 +3 1607 1608 575 +3 457 556 2622 +3 175 913 914 +3 262 1719 1718 +3 1719 262 1720 +3 380 72 378 +3 365 72 380 +3 128 2210 1948 +3 2494 135 2495 +3 128 1948 1950 +3 1105 2150 288 +3 875 1626 1344 +3 135 132 2495 +3 76 1000 258 +3 117 886 885 +3 132 135 72 +3 892 139 893 +3 125 76 1582 +3 76 125 124 +3 722 721 730 +3 30 535 537 +3 30 534 535 +3 394 810 808 +3 260 1714 1712 +3 341 1709 1716 +3 173 547 548 +3 1125 331 1123 +3 1719 1454 337 +3 2630 2629 691 +3 1714 1715 259 +3 230 1347 2339 +3 281 282 12 +3 2100 2101 2109 +3 1652 1815 1813 +3 579 1660 1067 +3 1053 1153 632 +3 1133 423 1072 +3 11 279 280 +3 903 1315 213 +3 1590 705 3 +3 2336 2330 2329 +3 178 2623 2669 +3 2057 2056 2055 +3 320 318 39 +3 318 317 39 +3 738 14 739 +3 6 272 273 +3 2135 1031 1035 +3 1042 2126 2125 +3 237 1463 142 +3 1762 517 1482 +3 582 686 765 +3 687 686 2091 +3 234 23 429 +3 784 710 674 +3 236 282 47 +3 235 236 47 +3 23 1146 2275 +3 2155 2640 2190 +3 2643 2642 816 +3 236 319 282 +3 801 389 792 +3 503 504 470 +3 1624 1438 486 +3 1262 1622 1620 +3 191 2677 2678 +3 1122 1117 1155 +3 819 824 411 +3 824 1168 411 +3 1861 1860 462 +3 138 740 738 +3 22 2032 300 +3 309 739 1002 +3 1614 577 580 +3 1131 1614 580 +3 1734 2695 241 +3 2695 1734 516 +3 379 380 378 +3 1712 1714 65 +3 1692 1691 197 +3 2055 2056 954 +3 300 2032 2031 +3 887 137 886 +3 25 332 986 +3 236 235 315 +3 1146 78 1011 +3 1147 318 320 +3 147 428 785 +3 360 359 302 +3 2248 1156 3 +3 628 660 668 +3 738 1127 14 +3 2668 2671 417 +3 1197 566 565 +3 1199 566 1197 +3 2149 2186 2155 +3 2326 708 2327 +3 529 184 538 +3 601 1181 393 +3 1368 2293 2406 +3 823 149 821 +3 940 149 823 +3 181 330 347 +3 665 1122 648 +3 340 326 329 +3 1397 1382 1598 +3 2626 1785 683 +3 173 548 908 +3 928 547 929 +3 529 538 527 +3 1703 216 928 +3 334 90 336 +3 2437 767 2442 +3 911 1730 913 +3 1251 310 927 +3 2441 936 767 +3 1128 583 1130 +3 913 175 911 +3 323 1694 1693 +3 2243 2255 2392 +3 1774 1776 1775 +3 1696 1698 2532 +3 222 841 842 +3 346 1123 1723 +3 793 792 389 +3 292 1057 1056 +3 1097 1922 1925 +3 1728 1727 1100 +3 2248 2249 1156 +3 1924 996 287 +3 1717 77 1715 +3 503 804 828 +3 416 823 2672 +3 1244 1008 1236 +3 1427 1432 477 +3 2696 2694 531 +3 560 727 719 +3 2023 2022 298 +3 187 1121 353 +3 1405 1381 440 +3 463 133 737 +3 885 886 360 +3 886 1150 360 +3 583 1128 795 +3 151 234 429 +3 2284 705 2285 +3 1611 1606 1605 +3 492 770 2568 +3 1465 2658 146 +3 2661 145 882 +3 373 1933 1257 +3 1213 969 182 +3 384 237 142 +3 1009 1247 442 +3 1257 1259 1266 +3 884 1952 1177 +3 381 237 383 +3 823 821 414 +3 739 737 738 +3 138 738 737 +3 2681 436 1664 +3 773 1526 1500 +3 2566 2569 1537 +3 804 503 471 +3 764 2446 2447 +3 1168 824 415 +3 2679 1400 2675 +3 436 2679 2675 +3 1200 1203 1201 +3 393 1179 603 +3 238 544 545 +3 1190 523 1191 +3 1409 1436 2599 +3 1436 190 2599 +3 1741 1757 2707 +3 1066 1062 647 +3 1672 2229 2228 +3 492 491 1 +3 1219 720 1218 +3 615 611 552 +3 392 580 577 +3 2091 1172 687 +3 495 491 492 +3 607 1188 1189 +3 809 508 782 +3 293 2026 294 +3 215 343 87 +3 837 838 538 +3 838 837 536 +3 2731 1044 1113 +3 212 541 542 +3 121 473 119 +3 768 611 410 +3 1304 601 1305 +3 418 609 615 +3 1482 2702 522 +3 409 937 938 +3 941 2671 2667 +3 1625 1434 1624 +3 610 2446 1158 +3 2634 699 2632 +3 877 755 871 +3 1385 2584 1663 +3 2269 2270 427 +3 521 522 1322 +3 449 435 448 +3 1667 1668 1549 +3 1666 1667 1549 +3 1863 832 1864 +3 1243 1241 449 +3 400 1307 1609 +3 421 2213 1517 +3 2213 421 1488 +3 659 657 662 +3 1433 476 475 +3 1416 1625 1624 +3 613 896 409 +3 828 2643 816 +3 457 733 732 +3 461 1400 2679 +3 720 1005 718 +3 893 2014 140 +3 1200 518 1203 +3 824 940 415 +3 407 795 1128 +3 724 725 723 +3 2693 530 2688 +3 567 1207 1205 +3 455 2678 192 +3 589 2627 2626 +3 1128 1130 580 +3 618 1359 1360 +3 1357 1358 642 +3 1762 1482 240 +3 1073 597 617 +3 1739 1204 517 +3 456 455 192 +3 192 453 450 +3 692 572 695 +3 664 667 627 +3 1006 1321 474 +3 2684 177 2683 +3 456 178 455 +3 602 1325 1324 +3 616 615 552 +3 2285 1585 2284 +3 2689 531 2688 +3 733 178 456 +3 474 718 1005 +3 967 1507 1509 +3 525 528 526 +3 762 602 1324 +3 2569 2566 2567 +3 1427 479 148 +3 733 456 458 +3 411 800 818 +3 728 731 458 +3 558 528 559 +3 597 654 1771 +3 1733 1734 241 +3 818 819 411 +3 419 782 508 +3 1421 1625 1416 +3 2269 427 2272 +3 747 2091 582 +3 616 552 1477 +3 471 470 389 +3 801 471 389 +3 1490 1487 1492 +3 1526 1485 775 +3 545 46 546 +3 691 2632 2631 +3 491 495 512 +3 774 1526 1516 +3 1196 565 1198 +3 1552 1551 1535 +3 2698 833 241 +3 2002 1987 2001 +3 123 128 258 +3 128 123 949 +3 1689 1690 573 +3 544 46 545 +3 274 2704 64 +3 1742 1744 2717 +3 1744 1745 2717 +3 497 500 494 +3 700 1604 572 +3 1527 1553 1551 +3 499 492 509 +3 2201 2202 391 +3 791 2206 2204 +3 802 471 801 +3 1553 1529 501 +3 1699 325 1700 +3 1494 1495 1489 +3 856 1036 1035 +3 1763 2715 2714 +3 528 186 446 +3 594 1053 711 +3 2627 644 678 +3 1477 553 1476 +3 1745 514 562 +3 2435 1690 398 +3 2710 2712 2709 +3 240 1736 1762 +3 1736 1737 1762 +3 737 736 138 +3 1 491 835 +3 1054 618 1360 +3 1055 618 1054 +3 729 728 458 +3 787 396 790 +3 1070 1068 1069 +3 401 1070 1069 +3 1004 452 1005 +3 838 534 538 +3 534 527 538 +3 795 794 174 +3 716 734 560 +3 734 731 560 +3 449 1241 54 +3 1182 2448 425 +3 801 2207 802 +3 239 524 530 +3 242 1209 1200 +3 1546 493 922 +3 50 722 730 +3 720 714 1218 +3 534 533 527 +3 533 534 30 +3 885 1953 884 +3 223 535 839 +3 535 534 838 +3 705 1584 3 +3 212 542 544 +3 539 537 535 +3 223 539 535 +3 2418 2417 1643 +3 539 540 541 +3 223 540 539 +3 1147 110 2029 +3 212 539 541 +3 929 930 183 +3 543 542 541 +3 2710 2709 2711 +3 217 901 904 +3 173 908 909 +3 839 536 840 +3 839 838 536 +3 46 203 546 +3 1065 95 653 +3 173 536 547 +3 149 940 824 +3 1469 554 1471 +3 727 50 730 +3 2711 1673 2713 +3 179 1473 1472 +3 1471 554 179 +3 2536 150 2211 +3 656 629 684 +3 562 1741 2716 +3 696 177 2684 +3 869 866 749 +3 401 1310 578 +3 550 1480 1473 +3 1653 1654 1197 +3 727 730 719 +3 715 1219 721 +3 1341 753 1342 +3 1328 753 1341 +3 698 1050 594 +3 698 623 1050 +3 1060 647 1062 +3 575 1606 1607 +3 696 2684 520 +3 1310 401 1069 +3 1132 1070 401 +3 589 643 2627 +3 2598 2597 568 +3 757 602 898 +3 602 757 756 +3 898 613 899 +3 1888 1887 741 +3 671 688 596 +3 654 637 636 +3 717 714 718 +3 817 484 815 +3 668 660 627 +3 609 608 1166 +3 608 609 418 +3 828 484 503 +3 688 671 626 +3 1054 586 1055 +3 1788 107 57 +3 798 408 797 +3 627 663 664 +3 2311 2310 1187 +3 884 117 885 +3 1190 564 1189 +3 649 670 666 +3 2615 1784 587 +3 409 612 613 +3 2700 2699 1191 +3 640 1628 875 +3 611 0 612 +3 671 669 626 +3 665 649 666 +3 589 2626 2628 +3 1770 593 1769 +3 689 701 575 +3 701 689 1080 +3 394 782 812 +3 1332 1339 1331 +3 1338 1339 1332 +3 408 2441 811 +3 1305 601 600 +3 1135 607 1207 +3 2140 2139 1028 +3 0 899 612 +3 2626 2627 678 +3 2634 2633 571 +3 718 714 720 +3 2699 1195 2703 +3 2313 1193 1188 +3 829 2638 817 +3 2286 705 1589 +3 1135 1134 607 +3 2314 2306 1185 +3 2236 2237 579 +3 606 1480 550 +3 551 1480 1479 +3 729 50 728 +3 1129 1128 580 +3 1165 1166 610 +3 1166 1165 609 +3 2508 2507 1590 +3 611 612 410 +3 1341 1342 754 +3 404 1323 1304 +3 1326 1323 404 +3 145 2107 2102 +3 1433 2104 355 +3 137 379 1149 +3 768 552 611 +3 661 684 629 +3 659 662 663 +3 2715 1742 2716 +3 1053 712 711 +3 645 1171 1172 +3 628 669 671 +3 1650 1651 651 +3 797 389 800 +3 662 658 649 +3 658 670 649 +3 2312 1179 604 +3 598 637 654 +3 656 586 657 +3 629 657 659 +3 702 1080 1079 +3 753 1328 1325 +3 742 1887 1888 +3 588 1070 1071 +3 1952 884 1953 +3 1167 1168 415 +3 699 572 692 +3 1387 1374 2292 +3 628 671 676 +3 663 662 649 +3 660 661 629 +3 627 660 659 +3 660 629 659 +3 628 661 660 +3 1882 1884 591 +3 800 411 797 +3 684 619 656 +3 1066 1061 1062 +3 627 659 663 +3 657 586 658 +3 1604 1605 701 +3 868 639 865 +3 1651 698 651 +3 628 676 661 +3 145 359 2107 +3 1871 1870 879 +3 697 651 698 +3 1824 1231 1823 +3 716 560 719 +3 711 712 633 +3 597 1073 1065 +3 2115 673 1468 +3 841 540 223 +3 707 1591 2507 +3 1743 1760 2712 +3 732 731 557 +3 865 685 866 +3 1117 630 1116 +3 483 813 2642 +3 1512 1501 1528 +3 949 948 252 +3 484 828 816 +3 1159 1160 1164 +3 1521 1523 777 +3 2509 2504 1592 +3 1689 1602 1972 +3 976 974 176 +3 843 222 842 +3 1630 222 843 +3 717 459 716 +3 558 186 528 +3 357 2093 2092 +3 459 717 718 +3 1333 752 1335 +3 731 734 557 +3 716 719 717 +3 728 560 731 +3 560 728 727 +3 1543 510 1957 +3 862 2127 2128 +3 757 1160 756 +3 940 823 416 +3 50 727 728 +3 1217 721 1218 +3 735 718 474 +3 887 365 137 +3 459 718 735 +3 736 365 138 +3 1885 1886 742 +3 1356 2628 1359 +3 566 789 94 +3 865 746 685 +3 1409 2454 1118 +3 871 870 749 +3 405 760 1338 +3 938 416 939 +3 581 1306 1307 +3 2623 178 2621 +3 137 1149 1150 +3 757 1164 1160 +3 613 898 895 +3 438 461 1393 +3 766 582 765 +3 749 877 871 +3 412 819 818 +3 793 797 408 +3 789 807 396 +3 1323 761 1304 +3 1004 1220 1221 +3 777 1522 1521 +3 2648 2647 850 +3 949 123 948 +3 694 1080 1081 +3 2280 1003 2279 +3 1521 420 1523 +3 286 2142 232 +3 1639 2139 2140 +3 354 2096 352 +3 392 786 787 +3 406 790 472 +3 938 940 416 +3 761 2450 1304 +3 1196 1195 244 +3 2201 2542 2200 +3 797 793 389 +3 1168 1167 798 +3 819 149 824 +3 472 805 803 +3 391 2541 2542 +3 1111 2443 937 +3 803 805 804 +3 802 803 471 +3 802 472 803 +3 789 395 807 +3 803 804 471 +3 1195 564 2703 +3 396 807 472 +3 394 809 782 +3 2199 813 781 +3 815 391 481 +3 2643 483 2642 +3 782 813 812 +3 940 937 415 +3 937 940 938 +3 2091 686 582 +3 1168 798 411 +3 1906 2538 1106 +3 481 830 829 +3 1867 1866 833 +3 536 837 547 +3 16 2570 1557 +3 1032 2123 2122 +3 1550 2734 2735 +3 840 223 839 +3 962 851 1092 +3 2157 2152 2720 +3 239 530 2693 +3 2258 2259 849 +3 2133 2129 1030 +3 1122 1155 648 +3 857 1039 1019 +3 2009 2008 920 +3 2097 2108 142 +3 1151 44 360 +3 859 2259 2732 +3 2128 2127 2130 +3 1035 1036 1018 +3 898 899 757 +3 306 14 1127 +3 614 897 896 +3 2657 2656 301 +3 2315 2316 605 +3 685 746 1883 +3 1869 1870 1334 +3 1126 304 1127 +3 890 117 884 +3 740 117 890 +3 915 1730 1729 +3 738 740 890 +3 214 894 59 +3 895 896 613 +3 1113 854 1112 +3 77 337 1110 +3 901 217 900 +3 901 900 902 +3 985 982 935 +3 1359 1781 1360 +3 1702 1703 183 +3 1059 1108 1109 +3 1381 439 1379 +3 948 947 252 +3 1458 1460 1459 +3 2670 2624 2669 +3 1844 1845 2399 +3 395 2728 806 +3 807 395 806 +3 2673 414 2670 +3 416 2672 941 +3 992 467 989 +3 289 1057 944 +3 71 130 131 +3 2186 988 2185 +3 2013 339 2014 +3 1589 705 1590 +3 2482 2295 2481 +3 2369 2160 2370 +3 2160 2369 2161 +3 1210 2296 932 +3 2640 2155 2187 +3 2395 2268 2265 +3 124 999 1000 +3 248 255 60 +3 467 987 989 +3 2154 987 467 +3 2310 604 1186 +3 1999 977 1998 +3 123 891 948 +3 891 123 999 +3 1191 2701 2700 +3 1226 1801 1802 +3 910 1644 1643 +3 1093 849 1094 +3 852 1093 1094 +3 2283 1585 2282 +3 1021 1022 1027 +3 2730 2729 1114 +3 1949 265 86 +3 1947 1949 86 +3 2070 1282 2071 +3 2339 2337 1255 +3 1347 2337 2339 +3 2158 2192 2177 +3 1278 1137 1273 +3 979 61 978 +3 1237 1819 1652 +3 2076 1283 229 +3 2385 873 2383 +3 1258 1257 1253 +3 373 1257 1258 +3 1574 1575 1138 +3 1574 465 1575 +3 2083 226 2084 +3 2497 1488 1490 +3 1342 878 754 +3 2035 204 2036 +3 2563 2566 2564 +3 2563 1539 2566 +3 965 964 963 +3 965 963 221 +3 906 424 904 +3 424 906 954 +3 2105 2108 2097 +3 2612 2108 2105 +3 954 906 220 +3 113 2025 2023 +3 2413 905 1959 +3 1959 217 2413 +3 217 904 2413 +3 57 1789 1788 +3 2131 2134 2132 +3 208 2044 214 +3 754 2221 591 +3 2221 754 867 +3 2048 959 958 +3 543 958 211 +3 335 1851 1850 +3 1318 2047 213 +3 960 542 211 +3 2042 2041 210 +3 1718 337 1717 +3 1316 213 1315 +3 853 1635 1632 +3 281 58 11 +3 58 281 1901 +3 1778 1779 219 +3 1779 963 219 +3 1775 1778 219 +3 982 1216 935 +3 1960 1959 1958 +3 2057 2059 2056 +3 2059 2057 221 +3 2061 962 955 +3 962 957 955 +3 2056 2059 955 +3 2059 2061 955 +3 2061 2059 2060 +3 1583 541 540 +3 1959 905 1958 +3 2059 221 2060 +3 1784 592 1783 +3 1732 1541 1731 +3 1545 1732 1731 +3 909 908 1960 +3 968 316 233 +3 303 2654 2031 +3 2654 300 2031 +3 2092 2093 2110 +3 1493 1489 776 +3 1494 1493 1487 +3 2690 257 2691 +3 2635 690 2630 +3 690 2629 2630 +3 1505 1504 55 +3 1500 1504 1505 +3 1497 1495 1494 +3 348 1934 1961 +3 1487 1496 1494 +3 2213 2214 1517 +3 2214 2213 780 +3 667 648 1595 +3 1596 667 1595 +3 1491 421 967 +3 2211 150 2216 +3 2212 2211 2216 +3 2655 2651 2656 +3 2655 2653 2651 +3 22 298 299 +3 2618 688 626 +3 771 2618 626 +3 2561 1935 2559 +3 1935 1936 2559 +3 316 39 317 +3 316 968 39 +3 968 311 39 +3 1360 1781 592 +3 37 195 1692 +3 2015 2017 140 +3 1104 2181 1912 +3 973 974 96 +3 974 973 975 +3 1647 9 1645 +3 982 985 61 +3 66 1649 1646 +3 974 914 176 +3 914 974 34 +3 914 917 176 +3 298 2022 295 +3 195 980 979 +3 2121 1033 2122 +3 1640 1639 1029 +3 969 180 973 +3 180 969 422 +3 333 89 1124 +3 333 1456 89 +3 686 1170 2439 +3 1170 174 2439 +3 2025 2024 2023 +3 975 34 974 +3 1662 1047 1632 +3 914 912 917 +3 33 347 346 +3 33 984 347 +3 1014 1016 844 +3 1014 2477 1016 +3 1849 2602 2611 +3 2602 1848 2611 +3 1145 2394 2248 +3 977 971 972 +3 971 96 972 +3 143 1455 1456 +3 1457 143 1456 +3 1457 334 336 +3 719 730 1217 +3 38 1318 344 +3 911 910 1648 +3 1830 1249 1827 +3 1642 4 202 +3 2013 127 1578 +3 127 1580 1578 +3 906 904 901 +3 195 37 980 +3 1694 1699 1695 +3 1720 329 1723 +3 351 34 983 +3 327 351 983 +3 758 1163 1336 +3 1217 730 721 +3 1455 986 332 +3 2527 88 2531 +3 323 197 99 +3 980 981 982 +3 983 975 180 +3 984 983 180 +3 984 327 983 +3 2103 356 2104 +3 1706 1705 324 +3 984 180 422 +3 347 984 422 +3 33 327 984 +3 971 985 935 +3 351 99 197 +3 1013 848 1014 +3 2735 1669 1969 +3 2567 2568 1538 +3 944 292 1101 +3 1057 292 944 +3 1922 1921 1098 +3 2235 1310 2237 +3 1965 249 248 +3 249 67 248 +3 2164 990 2166 +3 2163 2173 2174 +3 1902 1898 1899 +3 1902 112 1898 +3 1497 966 1498 +3 1502 1497 1498 +3 2169 2166 2167 +3 70 124 125 +3 998 124 70 +3 1991 978 2005 +3 2004 1991 2005 +3 2155 989 2149 +3 1925 1923 1926 +3 1928 350 1923 +3 2150 945 2151 +3 77 1362 261 +3 41 1963 1962 +3 998 891 999 +3 122 891 998 +3 70 122 998 +3 350 1098 2176 +3 2172 2163 2167 +3 2172 2167 990 +3 2630 691 2631 +3 141 2016 2019 +3 2284 2283 1584 +3 2284 1585 2283 +3 994 2176 2171 +3 2262 1305 1306 +3 404 1305 2262 +3 697 698 674 +3 2264 1141 1566 +3 815 484 2641 +3 484 816 2641 +3 287 996 995 +3 994 2169 2167 +3 997 2154 467 +3 2168 997 467 +3 2523 166 2522 +3 2164 2165 992 +3 2166 2165 2164 +3 2331 2330 2332 +3 1859 1860 1858 +3 102 40 107 +3 2356 1267 53 +3 1267 2356 2352 +3 969 2117 970 +3 2039 2035 2036 +3 2039 208 2035 +3 308 310 1002 +3 739 308 1002 +3 308 739 14 +3 1811 1812 1235 +3 2307 1184 2308 +3 722 725 1222 +3 725 722 723 +3 1004 1005 720 +3 723 722 50 +3 50 729 723 +3 448 1243 449 +3 474 1005 1006 +3 723 729 726 +3 451 723 726 +3 1804 1803 193 +3 1803 1804 1226 +3 1656 1654 1483 +3 1009 441 188 +3 1241 1240 1008 +3 912 915 1985 +3 915 916 1985 +3 2018 2019 2016 +3 2019 2018 1459 +3 336 1461 1460 +3 2663 1641 1636 +3 1635 2663 1636 +3 435 449 1009 +3 188 435 1009 +3 453 461 438 +3 693 1107 1077 +3 1010 826 827 +3 1077 1107 825 +3 1908 2540 1906 +3 2646 2346 371 +3 2346 2646 2348 +3 1490 1488 1491 +3 2499 2500 1157 +3 2215 780 2198 +3 1060 1109 647 +3 682 2279 2278 +3 695 826 1010 +3 342 1710 1711 +3 1710 341 1711 +3 1147 320 110 +3 190 2601 2599 +3 2028 2027 2029 +3 2042 93 903 +3 2041 2040 2045 +3 2040 91 2045 +3 1215 1214 182 +3 1641 2141 1637 +3 1032 2131 2130 +3 1639 2140 2141 +3 2140 1028 2141 +3 2462 2470 1025 +3 190 2556 2557 +3 377 136 2736 +3 858 1017 1016 +3 1673 2228 2299 +3 2298 1673 2299 +3 2121 1041 2120 +3 1041 2126 2120 +3 1220 720 1219 +3 1778 1775 1777 +3 493 1542 497 +3 2278 2279 704 +3 1584 2278 704 +3 382 1149 379 +3 1017 857 1019 +3 1017 1018 857 +3 1222 715 722 +3 845 1014 844 +3 1020 845 844 +3 1019 1020 844 +3 1901 2452 58 +3 845 1013 1014 +3 1269 2682 1452 +3 1764 1270 1258 +3 367 1764 1258 +3 921 1976 1984 +3 1636 1637 1027 +3 1382 1397 2584 +3 1397 1386 2584 +3 2124 1041 2123 +3 1021 855 1022 +3 28 1563 1561 +3 1793 28 1561 +3 1988 2007 2006 +3 2124 2125 2126 +3 2136 2135 1034 +3 2135 2136 863 +3 1079 694 2464 +3 1153 595 1154 +3 1153 1049 595 +3 955 424 954 +3 649 665 664 +3 772 595 1049 +3 622 772 1049 +3 650 2116 1003 +3 2116 2281 1003 +3 424 955 957 +3 1043 2118 2732 +3 852 1089 1091 +3 1093 852 1091 +3 35 1991 1990 +3 1991 198 1990 +3 2095 356 2094 +3 331 1719 1720 +3 1977 1995 1994 +3 1995 1978 1994 +3 1031 2134 2131 +3 1030 2129 2128 +3 1032 1033 856 +3 1797 1722 262 +3 857 1037 1039 +3 1678 155 1677 +3 2471 2470 1024 +3 2693 2688 531 +3 1668 1667 1548 +3 607 2311 1187 +3 238 537 212 +3 1031 856 1035 +3 2134 2135 863 +3 1034 1035 1018 +3 1671 1670 563 +3 2053 2052 951 +3 1644 31 1643 +3 2475 1015 2476 +3 1015 2477 2476 +3 2470 2462 1045 +3 2462 2463 1045 +3 1017 858 1018 +3 1018 1036 857 +3 1036 1037 857 +3 1036 1040 1037 +3 1039 847 1019 +3 1016 1017 844 +3 1017 1019 844 +3 1038 847 1039 +3 1033 2258 864 +3 2258 1033 860 +3 1930 1411 2453 +3 1040 1036 856 +3 1669 502 2231 +3 1544 1669 2231 +3 1777 847 1038 +3 1751 1753 1752 +3 1040 864 1037 +3 1979 1980 1996 +3 1038 1037 864 +3 2157 995 2156 +3 2058 953 951 +3 2054 2055 954 +3 2054 953 2055 +3 2580 2578 2570 +3 2580 2569 2578 +3 2130 1030 2128 +3 2125 2124 862 +3 2606 2605 9 +3 1988 2001 2000 +3 1971 2220 2221 +3 867 1971 2221 +3 988 2148 2150 +3 664 663 649 +3 924 1942 1939 +3 199 1849 196 +3 2731 859 2732 +3 1090 848 1013 +3 907 1090 1013 +3 2468 2470 1045 +3 631 1155 1154 +3 1155 632 1154 +3 2187 2155 2186 +3 2732 2118 1044 +3 2118 854 1044 +3 240 522 521 +3 1482 522 240 +3 220 2051 2053 +3 2051 2052 2053 +3 1998 977 972 +3 2062 2048 958 +3 2526 1705 1708 +3 2128 2129 862 +3 1976 2009 920 +3 921 2009 1976 +3 1647 1649 66 +3 622 1049 1050 +3 1051 622 1050 +3 658 1051 623 +3 1051 1050 623 +3 586 1051 658 +3 1075 2430 2428 +3 1154 632 1153 +3 1050 1052 594 +3 1050 1049 1052 +3 1154 626 631 +3 595 626 1154 +3 1897 1895 1875 +3 1891 1890 742 +3 1051 586 1054 +3 1052 1049 1153 +3 465 1576 1575 +3 1576 225 1575 +3 1051 1054 622 +3 2361 271 2362 +3 656 655 1055 +3 655 656 619 +3 2088 2089 224 +3 102 103 40 +3 703 1059 2551 +3 2550 703 2551 +3 603 398 574 +3 398 603 1134 +3 1060 1062 1058 +3 664 648 667 +3 1068 588 1062 +3 1099 1728 1100 +3 291 1099 1100 +3 644 1067 1066 +3 678 644 1066 +3 647 1787 1786 +3 1061 1066 1067 +3 1059 1109 1060 +3 1078 1077 703 +3 702 701 1080 +3 2237 2236 2235 +3 1078 693 1077 +3 575 1974 689 +3 1974 575 1608 +3 1071 1064 588 +3 1064 1071 95 +3 584 1071 1070 +3 584 1072 1071 +3 1062 1061 1068 +3 1163 1158 405 +3 1874 1361 636 +3 1874 1889 1361 +3 681 2425 1086 +3 1060 1058 2551 +3 1785 1786 679 +3 173 1088 536 +3 1075 1074 2430 +3 1083 590 1075 +3 681 1083 1075 +3 1493 1492 1487 +3 585 1082 1083 +3 1061 1069 1068 +3 2532 325 1696 +3 588 1064 1063 +3 1926 1923 1096 +3 423 646 1072 +3 1063 1064 590 +3 1064 1065 590 +3 2385 2384 741 +3 2384 2385 2383 +3 403 2384 2383 +3 744 644 743 +3 744 1067 644 +3 48 314 275 +3 1133 1072 584 +3 2551 1059 1060 +3 2550 2551 1058 +3 1069 1061 1660 +3 1130 1132 401 +3 1130 583 1132 +3 1604 702 572 +3 702 2525 572 +3 582 766 1314 +3 1130 1131 580 +3 1131 401 578 +3 1071 1072 95 +3 1072 646 95 +3 646 653 95 +3 1783 592 1782 +3 2254 2244 2327 +3 2249 2254 2327 +3 1491 966 1558 +3 946 1108 1085 +3 1187 1188 607 +3 1077 825 1059 +3 1075 590 1074 +3 590 1073 1074 +3 2431 1074 2432 +3 1087 2423 1106 +3 2420 2423 1087 +3 398 2434 2435 +3 2434 398 1135 +3 2023 2024 26 +3 778 2200 2195 +3 590 1065 1073 +3 594 711 784 +3 711 710 784 +3 2080 2077 2078 +3 2428 2430 2429 +3 680 2428 2429 +3 2430 1074 2431 +3 2429 2430 2431 +3 617 2432 1073 +3 679 1076 680 +3 1783 680 1784 +3 1083 1063 590 +3 1110 332 338 +3 332 25 338 +3 697 677 1468 +3 674 677 697 +3 693 1078 1079 +3 946 1084 1076 +3 1062 1063 1082 +3 1063 1062 588 +3 2528 1710 342 +3 1058 1082 585 +3 1058 1062 1082 +3 585 1083 1086 +3 2524 2525 702 +3 825 1108 1059 +3 1082 1063 1083 +3 1723 329 1724 +3 249 1965 2725 +3 254 249 2725 +3 1592 1593 633 +3 1592 710 1593 +3 909 1088 173 +3 1786 1787 679 +3 1109 1108 946 +3 668 1596 1597 +3 1167 799 798 +3 1467 2245 2250 +3 2251 1467 2250 +3 2679 2680 1399 +3 840 536 1088 +3 842 840 1088 +3 842 841 840 +3 842 1088 909 +3 842 909 843 +3 585 2421 2422 +3 1086 1083 681 +3 2540 1010 2538 +3 1634 1023 854 +3 1091 1090 5 +3 1092 1091 5 +3 2240 2467 2463 +3 2240 2466 2467 +3 2467 1045 2463 +3 1635 1022 1662 +3 2329 370 1439 +3 1977 920 1995 +3 515 1754 1748 +3 1777 1038 850 +3 1778 1777 850 +3 1572 1571 464 +3 1571 1572 2649 +3 1138 2649 1572 +3 1092 851 1093 +3 1091 1092 1093 +3 1014 2476 2477 +3 1265 2225 1659 +3 2225 1265 2226 +3 1788 8 107 +3 1919 1918 1101 +3 2148 2147 288 +3 987 2147 2148 +3 2187 2188 2152 +3 2189 2187 2152 +3 88 2527 2528 +3 185 446 1850 +3 1158 764 405 +3 286 232 285 +3 1797 1716 1709 +3 116 1984 1986 +3 1984 1976 1986 +3 1917 1926 1096 +3 1796 1795 1793 +3 611 615 609 +3 2722 988 2151 +3 783 1488 2497 +3 2173 2163 2172 +3 1100 1103 291 +3 2378 1174 1173 +3 1485 2193 1489 +3 8 102 107 +3 1102 1916 1918 +3 1917 1916 1102 +3 991 2159 2158 +3 1100 469 1577 +3 1097 1919 1920 +3 1915 1914 1104 +3 1913 290 1095 +3 866 1970 749 +3 1918 1927 1102 +3 1412 1411 1929 +3 992 2165 467 +3 880 2661 2662 +3 674 698 784 +3 2205 2204 2206 +3 666 1650 672 +3 630 666 672 +3 1489 1493 1494 +3 2508 1590 3 +3 2423 825 1106 +3 896 897 1111 +3 896 1111 409 +3 937 409 1111 +3 794 811 174 +3 811 2438 174 +3 2443 2442 767 +3 2443 1111 2442 +3 829 830 2444 +3 2314 2315 2319 +3 1213 182 1212 +3 182 1214 1212 +3 1053 632 712 +3 632 1117 712 +3 2283 2282 682 +3 712 1116 1115 +3 1116 712 1117 +3 361 383 1151 +3 1865 390 1864 +3 430 147 431 +3 1213 181 422 +3 2279 2281 704 +3 2281 2279 1003 +3 1115 650 1003 +3 1115 1116 650 +3 2678 453 192 +3 1120 2 354 +3 455 2624 191 +3 530 2687 2688 +3 478 479 1426 +3 478 388 479 +3 957 2414 2412 +3 2414 905 2412 +3 2104 1854 355 +3 1407 1664 436 +3 1899 1898 13 +3 1376 2482 2481 +3 355 488 1420 +3 346 1723 1724 +3 329 1721 340 +3 1810 193 1808 +3 1809 1810 1808 +3 1819 1816 1652 +3 1231 1250 1823 +3 1362 1110 338 +3 153 366 927 +3 366 1251 927 +3 1761 519 1737 +3 2658 2652 2657 +3 363 2658 2657 +3 882 2657 301 +3 94 789 788 +3 1178 111 1126 +3 624 1768 1767 +3 1700 981 1699 +3 1481 1192 1482 +3 517 1481 1482 +3 705 2284 1584 +3 573 2436 2433 +3 573 2435 2436 +3 111 304 1126 +3 303 304 2654 +3 111 1178 889 +3 1462 2098 142 +3 2099 357 2100 +3 304 306 1127 +3 152 306 304 +3 407 794 795 +3 2438 2440 2437 +3 897 2438 2437 +3 584 1132 1133 +3 583 1133 1132 +3 792 407 2204 +3 1132 584 1070 +3 585 2422 1058 +3 2421 1087 2422 +3 1522 2194 1485 +3 794 407 793 +3 793 407 792 +3 2238 2233 2235 +3 870 869 749 +3 1133 583 796 +3 583 795 796 +3 2108 385 384 +3 142 2108 384 +3 1181 601 1182 +3 2479 1739 517 +3 2686 2685 257 +3 56 2230 1672 +3 465 2146 1576 +3 227 2075 2074 +3 1572 1573 1574 +3 464 1573 1572 +3 314 313 233 +3 313 312 233 +3 1294 1293 231 +3 276 1294 1281 +3 1276 2375 2377 +3 48 372 313 +3 465 1574 1573 +3 2349 2350 161 +3 2353 2349 161 +3 225 1567 1139 +3 321 2029 2027 +3 1147 2029 321 +3 2224 466 2223 +3 1570 1138 1139 +3 1567 1566 1139 +3 1067 1660 1061 +3 2226 1265 1271 +3 1265 228 1271 +3 1575 225 1139 +3 1294 231 1281 +3 1290 1283 2075 +3 1261 1272 1273 +3 1272 1278 1273 +3 1657 1658 1263 +3 1658 1657 1265 +3 634 652 1767 +3 1349 652 634 +3 1263 1259 1619 +3 1262 1617 1618 +3 1140 1623 1276 +3 1275 1615 1616 +3 1275 1261 1273 +3 228 1272 1271 +3 228 1277 1272 +3 1933 1259 1257 +3 2309 2310 2308 +3 2254 2394 2393 +3 2394 2254 2249 +3 1976 2328 1986 +3 366 153 312 +3 2334 366 312 +3 370 2330 2331 +3 466 2224 1103 +3 1914 2260 2181 +3 2180 2260 1913 +3 2260 2180 2181 +3 1332 1333 759 +3 1150 1151 360 +3 361 1151 1150 +3 2169 2170 993 +3 277 6 279 +3 277 1152 6 +3 268 97 274 +3 805 807 806 +3 989 2190 2156 +3 2122 1041 2121 +3 1882 2221 2220 +3 2132 1030 2727 +3 710 711 1593 +3 648 1155 1595 +3 1591 2509 1592 +3 2428 2427 1075 +3 2428 1076 2427 +3 1487 1558 1496 +3 425 2447 1166 +3 608 425 1166 +3 1180 2318 1183 +3 2318 1180 1181 +3 1165 0 609 +3 0 611 609 +3 1164 610 1159 +3 726 192 451 +3 1234 1238 1228 +3 1160 758 1161 +3 757 899 1165 +3 1599 1372 1598 +3 610 1164 1165 +3 456 192 726 +3 637 1874 636 +3 1874 637 1875 +3 755 1334 872 +3 620 1354 1873 +3 1889 620 1873 +3 1338 759 405 +3 1163 405 759 +3 1336 1163 759 +3 1407 2554 1664 +3 2552 1404 1403 +3 703 1077 1059 +3 1160 1159 758 +3 2446 610 1166 +3 2447 2446 1166 +3 2448 2449 764 +3 763 764 2449 +3 764 763 405 +3 98 272 284 +3 272 2361 284 +3 423 1171 646 +3 38 2047 1318 +3 488 487 1417 +3 1176 645 1175 +3 783 2497 1486 +3 796 1169 423 +3 1133 796 423 +3 1771 654 636 +3 796 1170 1169 +3 796 174 1170 +3 795 174 796 +3 1371 1395 2483 +3 1629 1631 845 +3 1173 645 1172 +3 2379 1173 2381 +3 868 2385 639 +3 638 1876 2359 +3 646 1171 1176 +3 2388 874 2378 +3 645 1173 1174 +3 270 2364 2363 +3 1177 890 884 +3 271 2360 97 +3 2379 2378 1173 +3 2388 2378 2379 +3 1175 2359 598 +3 645 1174 1175 +3 305 890 1177 +3 890 305 738 +3 645 1176 1171 +3 1899 108 1902 +3 1176 653 646 +3 598 653 1176 +3 653 598 654 +3 2408 1011 2410 +3 1534 2549 1551 +3 2549 1527 1551 +3 638 1877 1876 +3 1126 1127 305 +3 1177 1126 305 +3 2557 2601 190 +3 1437 2601 2557 +3 322 889 1178 +3 1178 1126 1177 +3 1180 393 1181 +3 899 0 1165 +3 2638 480 2537 +3 606 550 399 +3 1190 1189 550 +3 523 1190 550 +3 1189 399 550 +3 2174 350 2176 +3 2174 1924 350 +3 568 2433 2434 +3 567 568 2434 +3 789 396 788 +3 1179 393 1180 +3 2448 2447 425 +3 897 614 2439 +3 2598 568 94 +3 1594 709 710 +3 709 1594 2501 +3 1179 1180 604 +3 1180 1183 604 +3 607 2312 2311 +3 607 1134 2312 +3 522 2702 1475 +3 1193 1208 1194 +3 1208 2320 1194 +3 2205 406 2207 +3 83 1674 1286 +3 1284 83 1286 +3 1690 1689 570 +3 1608 570 1974 +3 1480 551 1473 +3 1205 1206 567 +3 1206 94 567 +3 604 1183 1186 +3 170 1679 263 +3 1322 522 1475 +3 1194 399 1193 +3 2729 2730 808 +3 2184 2159 2718 +3 2159 2184 2183 +3 561 1201 1203 +3 1201 561 514 +3 2701 1191 523 +3 1203 1656 1204 +3 1203 518 1656 +3 207 894 154 +3 1196 1197 565 +3 2320 1208 2319 +3 1188 399 1189 +3 1188 1193 399 +3 604 2311 2312 +3 2313 1187 2309 +3 1187 2310 2309 +3 398 1690 574 +3 495 1751 1750 +3 1934 1936 1935 +3 395 566 1114 +3 566 1209 1114 +3 2314 2319 1208 +3 1602 1689 573 +3 514 1202 1201 +3 491 512 1755 +3 2310 1186 2308 +3 242 1201 1202 +3 1192 2701 2702 +3 2701 523 2702 +3 277 2704 1152 +3 513 1748 1749 +3 1735 516 1734 +3 1202 809 242 +3 809 1202 494 +3 1986 2328 919 +3 242 1200 1201 +3 766 1311 1314 +3 56 1751 1752 +3 2593 2595 2590 +3 2593 2596 2595 +3 233 312 968 +3 1749 1748 1754 +3 1756 1747 1757 +3 561 1204 1739 +3 1207 607 564 +3 607 1189 564 +3 1739 2479 1746 +3 565 1205 1198 +3 1183 2318 2316 +3 1198 1207 564 +3 1207 1198 1205 +3 1195 1198 564 +3 418 615 616 +3 1479 418 616 +3 1134 1179 2312 +3 2417 1648 1643 +3 2249 2324 1156 +3 1658 1659 375 +3 1203 1204 561 +3 2321 606 1194 +3 2320 2321 1194 +3 1473 551 1476 +3 1220 715 1221 +3 933 930 1210 +3 183 930 933 +3 36 1216 982 +3 981 36 982 +3 858 1021 1027 +3 1210 1211 933 +3 1210 181 1211 +3 1107 693 1906 +3 725 724 1224 +3 1799 725 1224 +3 354 2 1854 +3 1213 1211 181 +3 1213 1212 1211 +3 1872 753 1325 +3 756 1872 1325 +3 907 1013 1012 +3 2141 1028 1637 +3 1216 36 934 +3 843 909 218 +3 909 1960 218 +3 908 217 1959 +3 1780 933 1214 +3 929 184 931 +3 2007 2011 2012 +3 2011 2007 1989 +3 2696 531 238 +3 1799 2458 2459 +3 1220 1004 720 +3 18 2604 2606 +3 1807 1802 1806 +3 1802 1807 1803 +3 1219 715 1220 +3 1227 1809 724 +3 1235 193 1810 +3 1333 1332 872 +3 1809 1234 1810 +3 1006 1805 1007 +3 452 1801 1226 +3 1805 1226 1804 +3 724 451 1227 +3 722 715 721 +3 2345 2348 2347 +3 2344 2345 2347 +3 1808 193 1803 +3 1239 193 1235 +3 184 529 931 +3 931 529 49 +3 529 1851 49 +3 1221 1223 1004 +3 1802 1801 1800 +3 1227 1234 1809 +3 192 450 451 +3 452 1226 1805 +3 1235 1236 1008 +3 339 2015 2014 +3 110 2028 2029 +3 1580 1581 130 +3 69 1580 130 +3 446 90 335 +3 1805 1804 1007 +3 2584 1385 2583 +3 1252 1254 367 +3 893 2013 2014 +3 2013 893 127 +3 1239 1804 193 +3 1231 1832 1831 +3 450 1238 451 +3 2514 60 2513 +3 1237 1238 450 +3 450 453 1233 +3 1233 438 1231 +3 1798 2458 1223 +3 2458 1798 2459 +3 1227 451 1238 +3 1460 1458 336 +3 2380 2381 747 +3 1261 1275 1616 +3 1872 1871 879 +3 1461 187 353 +3 2536 2193 2194 +3 1827 1828 1248 +3 1827 1249 1828 +3 439 2486 1379 +3 1238 1814 1228 +3 2271 2270 429 +3 1654 1655 1197 +3 1655 1199 1197 +3 1654 1653 1483 +3 447 1006 1242 +3 1872 1162 1871 +3 1247 1818 1246 +3 1008 1239 1235 +3 90 446 445 +3 446 186 445 +3 1240 1239 1008 +3 1239 1240 1007 +3 1241 1244 54 +3 1007 1242 1006 +3 1007 1240 1242 +3 1240 1241 1242 +3 1242 1241 1243 +3 1229 1244 1236 +3 1452 2345 1269 +3 2345 1452 369 +3 1237 450 1825 +3 1824 1230 1825 +3 1334 752 1333 +3 1870 752 1334 +3 2726 1424 2705 +3 1425 2726 2705 +3 25 2015 339 +3 1247 1246 1829 +3 1483 1653 244 +3 1653 1196 244 +3 1282 2073 2074 +3 1370 2289 2294 +3 2295 1370 2294 +3 2177 2182 2496 +3 2192 2182 2177 +3 2337 2342 2338 +3 140 74 892 +3 74 140 2017 +3 338 25 339 +3 514 561 562 +3 2560 250 2562 +3 1662 1022 1564 +3 1445 1443 369 +3 56 1752 2230 +3 1251 1254 1252 +3 1254 1251 366 +3 374 1251 1252 +3 432 1868 430 +3 988 2149 2148 +3 351 1453 34 +3 1256 1764 1765 +3 2341 230 2340 +3 230 2339 2340 +3 1266 2356 53 +3 371 2645 2646 +3 1280 2070 2071 +3 1621 1277 228 +3 1298 98 285 +3 375 1266 1259 +3 1263 375 1259 +3 463 462 133 +3 1001 463 309 +3 1002 1001 309 +3 2355 1001 1002 +3 2646 2645 53 +3 2695 2694 2696 +3 545 2696 238 +3 549 531 2689 +3 2070 1280 1279 +3 1142 2070 1279 +3 1143 1275 1274 +3 1275 1273 1274 +3 1257 1266 53 +3 1253 1257 53 +3 1276 1143 2375 +3 312 153 311 +3 2088 17 1678 +3 2082 2083 1288 +3 2363 271 296 +3 1272 1261 1271 +3 2085 2088 2087 +3 375 1263 1658 +3 1619 1620 1263 +3 1619 1262 1620 +3 373 1932 1933 +3 423 1169 1171 +3 706 1587 633 +3 1115 706 633 +3 288 2147 2144 +3 2147 2145 2144 +3 1327 762 1326 +3 369 2346 2345 +3 1991 35 978 +3 370 1284 1303 +3 158 2063 2064 +3 227 2081 1290 +3 812 483 2644 +3 52 160 1442 +3 1289 52 1442 +3 1020 2391 1629 +3 1254 2340 367 +3 2340 1254 2341 +3 2692 2697 527 +3 1255 2337 2338 +3 1765 1255 1766 +3 1255 2338 1766 +3 1136 1291 1293 +3 1291 231 1293 +3 315 314 233 +3 231 1291 1279 +3 2074 2077 227 +3 1765 1766 1256 +3 2522 166 2511 +3 1142 2067 2069 +3 1142 2066 2067 +3 1137 1274 1273 +3 968 312 311 +3 1673 1672 2228 +3 1293 1295 464 +3 1137 1278 1279 +3 289 1320 2084 +3 2346 2348 2345 +3 1320 297 2084 +3 1284 229 1283 +3 83 1284 1283 +3 1571 1293 464 +3 48 1281 1297 +3 2235 1309 2238 +3 1309 2235 2236 +3 1389 1390 1366 +3 1098 1099 291 +3 1567 2264 1566 +3 1569 1292 1136 +3 996 2174 2173 +3 371 2346 2353 +3 1100 1727 469 +3 1290 2075 227 +3 1264 1277 1621 +3 1567 225 1301 +3 1140 1567 1301 +3 469 1727 1726 +3 162 1440 1439 +3 2647 956 1779 +3 962 956 2647 +3 2077 2074 1285 +3 1299 1298 276 +3 1299 1281 275 +3 275 1281 48 +3 1299 276 1281 +3 2039 91 2040 +3 91 2039 2036 +3 2184 2722 2151 +3 1303 1286 1447 +3 369 1443 2349 +3 2346 369 2349 +3 160 52 159 +3 463 737 309 +3 1952 1954 322 +3 537 549 30 +3 549 2689 30 +3 189 1844 2399 +3 2358 1175 1174 +3 993 2166 2169 +3 2069 2070 1142 +3 2070 2069 1282 +3 1274 2372 2375 +3 367 1765 1764 +3 1137 1279 1292 +3 1292 1279 1291 +3 1292 1291 1136 +3 47 280 283 +3 372 48 1297 +3 230 2332 1347 +3 1574 1138 1572 +3 1295 1293 1294 +3 235 314 315 +3 283 273 235 +3 2073 1285 2074 +3 98 1298 1299 +3 1295 276 1296 +3 276 1295 1294 +3 1623 1264 1622 +3 1296 1298 285 +3 1298 1296 276 +3 1285 2079 2078 +3 2078 2086 1287 +3 2086 1726 1287 +3 994 2171 2169 +3 2372 2377 2375 +3 2613 2612 2105 +3 2374 2373 1137 +3 950 1139 1566 +3 1288 2083 2085 +3 1566 1141 1565 +3 2264 1276 2377 +3 1300 2371 2373 +3 2718 2159 2719 +3 638 2359 2358 +3 1324 761 1323 +3 1324 751 761 +3 895 762 614 +3 896 895 614 +3 602 895 898 +3 578 1613 1614 +3 789 566 395 +3 2440 767 2437 +3 936 2441 799 +3 404 1304 1305 +3 766 765 404 +3 2224 997 1103 +3 1327 614 762 +3 1100 466 1103 +3 1306 1305 600 +3 1026 1113 2460 +3 1026 2731 1113 +3 2334 2341 366 +3 2341 1254 366 +3 2047 903 213 +3 1975 2635 1688 +3 1307 1306 600 +3 766 2262 2263 +3 1048 1564 855 +3 2237 1660 579 +3 2467 2468 1045 +3 1308 578 2233 +3 2362 284 2361 +3 2364 284 2362 +3 2037 961 2036 +3 961 2037 203 +3 2233 2232 1308 +3 403 2379 2380 +3 2379 2381 2380 +3 2525 2524 826 +3 2358 2359 1175 +3 1782 1785 679 +3 1314 1311 1312 +3 745 1314 1312 +3 1764 2227 1270 +3 2335 1439 1440 +3 902 1315 903 +3 1315 902 216 +3 1695 1693 1694 +3 2178 1913 1095 +3 77 1110 1362 +3 1720 1723 331 +3 1723 1123 331 +3 324 323 1707 +3 296 1320 270 +3 297 1320 296 +3 1022 855 1564 +3 1502 1498 1503 +3 2131 2132 2727 +3 939 941 410 +3 502 2230 2231 +3 731 732 458 +3 457 2622 733 +3 2679 1399 461 +3 2622 178 733 +3 2621 178 2622 +3 726 458 456 +3 726 729 458 +3 447 1321 1006 +3 765 1327 1326 +3 410 2667 768 +3 990 2164 2161 +3 491 1755 834 +3 871 872 402 +3 418 1480 606 +3 516 1735 520 +3 457 732 557 +3 760 405 763 +3 2405 1390 1389 +3 1346 869 870 +3 1329 1330 751 +3 1361 1873 635 +3 1873 1354 635 +3 1328 750 1329 +3 1540 1957 510 +3 581 1307 2234 +3 1324 1325 751 +3 1325 1328 751 +3 1374 1387 1367 +3 895 602 762 +3 602 756 1325 +3 1890 1885 742 +3 2293 1373 1369 +3 751 1328 1329 +3 872 1332 1331 +3 876 1330 1329 +3 1330 876 402 +3 1331 1330 402 +3 872 1331 402 +3 1161 756 1160 +3 750 876 1329 +3 758 1336 1337 +3 1161 758 1337 +3 1337 1335 752 +3 1162 1337 752 +3 1162 1161 1337 +3 1333 1335 759 +3 756 1161 1162 +3 2137 863 2136 +3 2137 2138 863 +3 2245 1145 2246 +3 2242 2245 1467 +3 1336 759 1335 +3 1337 1336 1335 +3 765 1326 404 +3 751 1330 1340 +3 700 699 2591 +3 1613 578 1308 +3 1609 599 1606 +3 1696 323 324 +3 1330 1331 1339 +3 2262 1306 2263 +3 751 1340 761 +3 1340 760 761 +3 1310 1660 2237 +3 1340 1330 1339 +3 1338 760 1339 +3 760 1340 1339 +3 1327 2439 614 +3 754 591 1343 +3 1341 754 1343 +3 1345 748 1346 +3 748 869 1346 +3 591 1344 1343 +3 1343 1344 750 +3 1218 714 1217 +3 1344 1345 750 +3 687 1170 686 +3 591 875 1344 +3 1012 1631 218 +3 548 217 908 +3 1345 1346 876 +3 750 1345 876 +3 1956 870 871 +3 1348 619 684 +3 661 1348 684 +3 1348 661 652 +3 1877 621 1878 +3 621 1879 1878 +3 1395 1384 1396 +3 1904 293 294 +3 1349 619 1348 +3 652 1349 1348 +3 2470 2471 1025 +3 2471 2474 1025 +3 964 219 963 +3 1772 219 964 +3 655 1355 1055 +3 642 1354 1357 +3 636 1351 593 +3 1056 1728 1099 +3 620 1357 1354 +3 620 1896 1357 +3 1833 1834 1249 +3 1837 1834 1833 +3 634 1767 1768 +3 2486 1377 2487 +3 635 1353 1352 +3 635 1354 1353 +3 619 1352 655 +3 635 1352 1350 +3 1350 1352 1349 +3 1352 619 1349 +3 1350 1349 634 +3 2485 1378 2295 +3 642 1355 1353 +3 1354 642 1353 +3 1897 1894 1895 +3 1894 641 1895 +3 2616 2615 587 +3 2616 2618 2615 +3 1579 1580 69 +3 1724 33 346 +3 635 1350 1351 +3 1892 1891 1888 +3 1358 1892 643 +3 589 1358 643 +3 589 1356 1358 +3 1355 1356 618 +3 1055 1355 618 +3 592 1781 1782 +3 1360 772 622 +3 1360 592 772 +3 290 1913 2261 +3 1355 655 1353 +3 1873 1361 1889 +3 1355 642 1356 +3 1374 2291 2292 +3 620 1889 1875 +3 1889 1874 1875 +3 629 656 657 +3 1356 642 1358 +3 439 1369 1373 +3 1629 846 1630 +3 846 1629 2391 +3 2634 691 2633 +3 92 1583 965 +3 1359 618 1356 +3 1361 635 1351 +3 1886 746 865 +3 1632 1635 1662 +3 200 2603 199 +3 126 261 1362 +3 260 1717 1715 +3 2086 469 1726 +3 469 2086 2079 +3 1247 1829 1828 +3 1460 353 75 +3 1461 353 1460 +3 1879 1885 1890 +3 1399 1398 1393 +3 1440 2682 1269 +3 2682 1440 1441 +3 2104 356 1854 +3 1408 1409 1118 +3 893 139 127 +3 822 821 1437 +3 306 152 307 +3 25 986 2016 +3 189 1841 1844 +3 2290 2291 1374 +3 1403 440 2585 +3 2093 2094 356 +3 1378 1370 2295 +3 383 384 44 +3 1024 2475 1089 +3 1581 1580 127 +3 2411 1388 2490 +3 1377 2483 1395 +3 2483 1377 2482 +3 1774 846 1776 +3 1378 1373 1370 +3 1881 2222 1883 +3 621 1881 1883 +3 904 424 2412 +3 1406 2293 1369 +3 2293 1406 2406 +3 10 1380 2487 +3 1380 1379 2487 +3 1392 1391 454 +3 381 74 237 +3 1831 1832 1232 +3 2289 1375 2484 +3 1381 1380 440 +3 1385 1403 2585 +3 2663 1635 853 +3 1598 1382 1599 +3 2361 2360 271 +3 1376 2483 2482 +3 1383 1384 1371 +3 2277 2271 2274 +3 2292 1368 1387 +3 147 429 2270 +3 147 430 429 +3 1371 1384 1395 +3 353 1120 352 +3 1149 361 1150 +3 2294 2289 1376 +3 237 384 383 +3 2293 1368 2292 +3 188 441 1381 +3 349 74 376 +3 737 133 736 +3 133 1846 736 +3 1391 437 1372 +3 437 1391 1392 +3 2018 986 143 +3 2016 986 2018 +3 1842 2403 441 +3 570 574 1690 +3 2094 2093 2099 +3 1599 1382 1396 +3 1404 1408 1118 +3 1368 2405 1389 +3 438 1393 1394 +3 1393 1392 1394 +3 2223 2154 997 +3 2405 2406 2404 +3 1770 1771 593 +3 1398 437 1393 +3 1398 1397 437 +3 2679 436 2680 +3 2676 2675 1400 +3 364 365 1846 +3 2487 2491 10 +3 2487 1377 2491 +3 1841 1843 1363 +3 822 2557 1402 +3 1842 189 2401 +3 454 1391 1388 +3 1844 1840 1365 +3 1840 1844 1841 +3 1401 2675 2676 +3 356 2103 2093 +3 1843 442 1363 +3 1364 442 1843 +3 441 1009 1364 +3 461 1399 1393 +3 1366 1390 1838 +3 1830 1833 1249 +3 1833 1830 1831 +3 1394 1392 454 +3 1232 1839 1838 +3 1393 437 1392 +3 2486 2487 1379 +3 2492 1910 1909 +3 1910 2492 694 +3 1770 624 617 +3 2096 2095 144 +3 2366 286 2365 +3 108 1899 1900 +3 1386 1664 1663 +3 591 1884 875 +3 1663 1664 1119 +3 1384 1599 1396 +3 1373 2293 2292 +3 2582 2585 1380 +3 1876 1877 1878 +3 704 2253 2247 +3 2253 704 2281 +3 1666 2733 1665 +3 1372 1599 1384 +3 1383 1372 1384 +3 1882 1881 640 +3 2222 1881 1882 +3 2678 461 453 +3 66 351 197 +3 351 66 1453 +3 132 73 2495 +3 1405 434 188 +3 1425 434 1435 +3 440 1404 1405 +3 2614 44 385 +3 2406 1406 2404 +3 265 266 1466 +3 266 267 1466 +3 1464 2265 2268 +3 2402 2401 1369 +3 1404 440 1403 +3 1414 485 1418 +3 188 1381 1405 +3 1118 434 1405 +3 2555 1407 2556 +3 2164 992 2161 +3 2613 2099 358 +3 2614 2613 358 +3 2454 2453 433 +3 1940 1560 1561 +3 2599 2600 1409 +3 433 1438 1434 +3 1417 487 1415 +3 2 487 488 +3 1412 485 1414 +3 486 1412 1414 +3 2557 822 1437 +3 2601 2600 2599 +3 2601 1410 2600 +3 412 485 1413 +3 412 505 485 +3 1413 820 412 +3 412 820 819 +3 413 820 1413 +3 485 1412 1413 +3 1414 1415 486 +3 1415 1416 486 +3 443 1422 1121 +3 479 388 480 +3 910 1643 1648 +3 387 1414 1418 +3 2560 2562 253 +3 1436 2554 2555 +3 190 1436 2555 +3 487 1416 1415 +3 479 480 1865 +3 1415 387 1417 +3 1421 1422 1423 +3 1118 2454 1435 +3 1418 505 478 +3 505 1418 485 +3 505 388 478 +3 1414 387 1415 +3 476 1431 475 +3 1929 1411 1930 +3 1418 478 1419 +3 1421 1416 487 +3 387 1420 1417 +3 387 1419 1420 +3 2447 2448 764 +3 1423 386 1421 +3 1422 2 1121 +3 545 79 2696 +3 546 79 545 +3 1869 1334 755 +3 1423 1422 443 +3 1865 480 2445 +3 764 1158 2446 +3 1424 386 1423 +3 1419 1426 477 +3 1419 478 1426 +3 515 1748 1736 +3 1308 2232 2234 +3 2232 581 2234 +3 1435 1434 1425 +3 1118 1435 434 +3 1434 1435 433 +3 2728 810 806 +3 2706 1747 1758 +3 923 2708 2710 +3 1757 1747 2706 +3 1419 477 1420 +3 1426 1427 477 +3 1433 355 1432 +3 476 1433 1432 +3 479 1427 1426 +3 610 2545 1159 +3 1158 2545 610 +3 814 813 2199 +3 2642 813 814 +3 391 2542 2201 +3 1430 1431 476 +3 926 1947 2208 +3 2218 1412 486 +3 1525 2201 778 +3 1429 430 431 +3 432 430 1429 +3 1430 431 1431 +3 60 2514 1968 +3 2514 246 1968 +3 1429 1428 148 +3 1422 487 2 +3 255 1855 60 +3 414 821 822 +3 355 1420 477 +3 1432 355 477 +3 476 1432 1428 +3 2096 2105 2097 +3 470 818 800 +3 470 412 818 +3 470 504 412 +3 1268 2336 2329 +3 2131 2727 2130 +3 2727 1030 2130 +3 2104 475 2103 +3 1433 475 2104 +3 1627 873 748 +3 2651 301 2656 +3 487 1422 1421 +3 2600 2454 1409 +3 2454 2600 2453 +3 2453 2600 1410 +3 820 149 819 +3 413 821 820 +3 413 1437 821 +3 821 149 820 +3 1675 171 1676 +3 2360 1152 97 +3 1152 2360 272 +3 1289 1449 52 +3 2228 2229 2301 +3 1440 162 1441 +3 66 197 1647 +3 2330 1347 2332 +3 370 2329 2330 +3 1286 1448 1447 +3 1303 162 1439 +3 1439 370 1303 +3 1865 2445 390 +3 2357 1001 2355 +3 19 1861 1443 +3 2351 161 2350 +3 1442 1443 1445 +3 1442 160 1443 +3 2685 525 257 +3 2712 1760 56 +3 914 34 175 +3 34 1453 175 +3 2331 2332 372 +3 1446 1447 1448 +3 1446 162 1447 +3 1679 1677 155 +3 1680 1679 155 +3 1289 1448 1449 +3 1448 172 1449 +3 2692 2691 526 +3 2266 1465 146 +3 2266 2265 1465 +3 147 2270 2269 +3 1530 1508 506 +3 1465 1464 113 +3 220 2043 2051 +3 2688 2687 532 +3 2354 2357 2355 +3 1441 1444 1452 +3 172 1450 1449 +3 1450 172 1451 +3 1001 2351 463 +3 161 2351 1001 +3 1675 1451 172 +3 1451 1675 1676 +3 1444 1445 1452 +3 2689 532 30 +3 532 533 30 +3 2689 2688 532 +3 530 2686 2687 +3 2686 257 2687 +3 1457 1456 334 +3 1821 1230 1822 +3 1009 54 1247 +3 1457 336 1458 +3 143 1457 1458 +3 2269 2272 2268 +3 2272 1464 2268 +3 26 2021 2022 +3 140 892 893 +3 1842 1841 189 +3 429 23 2271 +3 1462 1459 75 +3 90 1461 336 +3 234 151 836 +3 445 187 1461 +3 90 445 1461 +3 1009 449 54 +3 1459 1462 2019 +3 1462 141 2019 +3 2099 2093 357 +3 2271 2277 427 +3 2101 114 362 +3 755 872 871 +3 2257 2258 849 +3 2257 864 2258 +3 2285 2286 1586 +3 2648 849 1093 +3 457 557 556 +3 1470 1477 552 +3 1477 1470 553 +3 460 555 1469 +3 553 1469 1471 +3 1322 1475 179 +3 517 1204 1481 +3 2092 2111 114 +3 2666 2665 2620 +3 2667 2666 768 +3 2619 1470 2620 +3 1470 768 2620 +3 1407 2675 1401 +3 2556 1407 1401 +3 2622 460 2621 +3 550 1474 523 +3 1473 1474 550 +3 1473 179 1474 +3 1472 1476 553 +3 1473 1476 1472 +3 2665 460 2620 +3 2665 2621 460 +3 1689 1972 570 +3 570 1972 1973 +3 1206 565 566 +3 2669 417 2670 +3 2667 769 2666 +3 551 1478 1476 +3 2397 2396 831 +3 1749 495 1750 +3 1474 1475 523 +3 179 1475 1474 +3 524 2683 2685 +3 2683 525 2685 +3 530 524 2686 +3 616 1477 1478 +3 1478 1477 1476 +3 2092 2110 2111 +3 1191 2703 1190 +3 2214 419 1517 +3 295 2021 2020 +3 790 2206 791 +3 392 790 791 +3 269 268 2112 +3 480 388 2537 +3 388 503 2537 +3 1525 482 2201 +3 407 1129 2203 +3 407 1128 1129 +3 144 2095 2094 +3 771 1784 2615 +3 1412 2218 1411 +3 1518 1523 420 +3 776 1484 1486 +3 2670 1402 191 +3 1509 1506 55 +3 1506 1505 55 +3 2185 2718 2723 +3 1510 1505 1506 +3 1500 1505 1510 +3 2194 2193 1485 +3 2653 889 2651 +3 2477 1015 1016 +3 2288 1591 713 +3 1492 776 1486 +3 574 1608 1607 +3 1491 1488 421 +3 303 152 304 +3 2652 2656 2657 +3 2659 301 2650 +3 1148 1105 288 +3 2639 1105 1148 +3 1496 966 1497 +3 1494 1496 1497 +3 433 2453 1438 +3 2020 2021 294 +3 299 298 295 +3 775 1489 1495 +3 2503 1594 2504 +3 1519 1534 1552 +3 1536 1519 1552 +3 1962 253 2562 +3 420 1515 1514 +3 2547 2546 1532 +3 2546 2547 1531 +3 773 1500 1533 +3 695 1010 1908 +3 966 967 1498 +3 2022 2021 295 +3 2503 2502 1594 +3 2027 2020 321 +3 1495 1503 1499 +3 1503 1495 1502 +3 2020 2027 295 +3 1900 1905 108 +3 1373 2291 1370 +3 2291 2290 1370 +3 282 281 47 +3 1686 215 87 +3 1510 1512 1533 +3 1515 773 1513 +3 2632 1911 2631 +3 1526 775 1499 +3 1551 1553 1535 +3 1507 1508 507 +3 1516 1521 774 +3 1081 569 1910 +3 569 1081 1688 +3 1511 1512 1528 +3 1512 1511 1513 +3 1524 777 1523 +3 1586 2287 1587 +3 2287 713 1587 +3 492 1 1520 +3 1510 1501 1512 +3 668 669 628 +3 668 1597 669 +3 507 1501 1507 +3 1905 12 293 +3 293 12 282 +3 1504 1503 55 +3 1507 1506 1509 +3 1507 1501 1506 +3 1509 55 1498 +3 1503 1498 55 +3 782 419 781 +3 421 1508 967 +3 506 1517 419 +3 1521 1522 774 +3 1900 1901 12 +3 420 1516 1515 +3 131 132 134 +3 1508 1507 967 +3 1038 864 2257 +3 1498 967 1509 +3 1504 1499 1503 +3 1500 1499 1504 +3 827 826 2550 +3 1529 1528 507 +3 1501 1510 1506 +3 506 419 508 +3 1531 1529 1527 +3 1529 1531 1528 +3 1555 2572 16 +3 1520 1 1524 +3 492 1520 770 +3 1909 1911 692 +3 2286 2287 1586 +3 321 2026 109 +3 1516 420 1521 +3 1543 1544 510 +3 1533 1500 1510 +3 1146 23 78 +3 2549 2546 1527 +3 2549 1532 2546 +3 1515 1516 773 +3 1155 631 1595 +3 421 1517 1508 +3 1522 1485 774 +3 2217 779 2197 +3 1104 1914 2181 +3 506 1508 1517 +3 1513 773 1533 +3 2571 16 2572 +3 2244 2326 2327 +3 234 546 78 +3 1105 945 2150 +3 1518 1514 1519 +3 2422 2539 827 +3 493 2576 1542 +3 2576 493 1731 +3 488 1417 1420 +3 476 1428 1430 +3 778 2195 1522 +3 780 2215 2214 +3 777 778 1522 +3 498 2563 2564 +3 2575 498 2564 +3 482 2202 2201 +3 1868 151 430 +3 1 1525 1524 +3 1 835 1525 +3 1525 835 482 +3 2026 2020 294 +3 1516 1526 773 +3 774 1485 1526 +3 500 1555 1556 +3 1514 1515 2548 +3 2548 2547 1532 +3 1534 1532 2549 +3 1514 1532 1519 +3 1519 1538 770 +3 1533 1512 1513 +3 2565 2575 2564 +3 1538 2568 770 +3 771 772 1784 +3 1518 420 1514 +3 1529 1530 501 +3 1530 1529 507 +3 1508 1530 507 +3 827 2550 1058 +3 2548 1532 1514 +3 966 1496 1558 +3 281 12 1901 +3 1531 1527 2546 +3 1534 1519 1532 +3 2453 1411 1438 +3 1519 1536 1538 +3 960 211 959 +3 2566 1539 2567 +3 501 1555 1554 +3 46 960 203 +3 510 499 509 +3 1537 2580 2570 +3 1546 1545 493 +3 675 2252 2251 +3 935 1216 1215 +3 1539 509 2567 +3 1753 499 1752 +3 2282 2280 682 +3 2250 2245 2246 +3 1742 2715 1763 +3 563 1742 1763 +3 206 205 59 +3 1541 2574 2576 +3 1731 1541 2576 +3 2573 2563 498 +3 69 129 125 +3 1547 1546 922 +3 2704 277 64 +3 1544 499 510 +3 218 1958 907 +3 1545 1731 493 +3 1671 2303 1670 +3 2621 769 2623 +3 1735 240 520 +3 240 521 520 +3 2133 1029 2129 +3 1048 855 2467 +3 238 549 537 +3 1214 933 1212 +3 860 2121 2120 +3 1772 1773 222 +3 846 1772 222 +3 963 956 2060 +3 956 2061 2060 +3 956 962 2061 +3 1780 1702 183 +3 2250 2246 2247 +3 1034 2135 1035 +3 2127 2123 2130 +3 2123 1032 2130 +3 832 1863 1862 +3 2319 2315 605 +3 2304 2065 51 +3 2304 156 2065 +3 183 933 1780 +3 569 1911 1910 +3 1584 704 3 +3 2633 2636 571 +3 1672 2709 56 +3 1105 2639 1104 +3 511 1544 1543 +3 1549 2734 2733 +3 1284 1286 1303 +3 1670 1547 563 +3 1752 499 2231 +3 1744 1547 922 +3 537 539 212 +3 1184 1208 1193 +3 1527 1529 1553 +3 501 1530 1556 +3 1554 1553 501 +3 1535 1553 1554 +3 770 1518 1519 +3 501 1556 1555 +3 1518 770 1520 +3 595 772 771 +3 1518 1520 1523 +3 1520 1524 1523 +3 1552 1535 1557 +3 1554 1557 1535 +3 1554 16 1557 +3 2180 2179 1912 +3 1491 1558 1490 +3 1558 1487 1490 +3 2362 2363 2364 +3 2287 2286 2288 +3 1116 630 2113 +3 1941 1562 924 +3 1562 1942 924 +3 1943 1942 1562 +3 910 1646 1644 +3 1801 452 1004 +3 1140 1276 2264 +3 924 1939 1938 +3 1562 1563 27 +3 853 1632 1633 +3 2559 1559 2561 +3 2605 31 1645 +3 1791 1788 1789 +3 1792 28 1793 +3 1097 1920 1921 +3 1926 1917 1102 +3 2521 42 1794 +3 1563 1562 1561 +3 101 2512 2511 +3 2227 1271 1270 +3 1764 1256 2227 +3 1261 1270 1271 +3 1278 1142 1279 +3 1575 1139 1138 +3 2157 2190 2189 +3 206 58 205 +3 58 2452 205 +3 950 1569 1570 +3 950 1570 1139 +3 2050 2049 952 +3 2049 958 952 +3 2047 2046 903 +3 311 153 307 +3 942 465 1573 +3 232 942 1573 +3 997 2170 1103 +3 1568 950 1565 +3 950 1566 1565 +3 2190 989 2155 +3 1571 1136 1293 +3 1136 1571 1569 +3 1570 1569 1571 +3 143 986 1455 +3 1573 1296 232 +3 464 1296 1573 +3 1295 1296 464 +3 997 2224 2223 +3 1581 127 139 +3 1971 867 1970 +3 497 2572 500 +3 1578 1580 1579 +3 125 1579 69 +3 1579 125 1582 +3 1727 1056 1726 +3 2736 136 379 +3 685 1971 866 +3 2220 1971 685 +3 1978 1996 1994 +3 73 1581 139 +3 73 132 131 +3 2177 2496 2179 +3 2496 1912 2179 +3 130 73 131 +3 130 1581 73 +3 129 69 130 +3 71 129 130 +3 1965 248 1966 +3 2631 1911 569 +3 2630 2631 569 +3 126 1578 1579 +3 217 548 900 +3 318 321 109 +3 141 1463 2017 +3 2496 2182 2191 +3 945 2496 2191 +3 2247 2246 3 +3 680 1076 2428 +3 2427 681 1075 +3 1597 1596 631 +3 668 667 1596 +3 667 668 627 +3 1595 631 1596 +3 466 1576 2223 +3 2506 2507 2508 +3 2325 2506 2508 +3 713 1592 633 +3 711 633 1593 +3 1588 1587 706 +3 1086 2425 2424 +3 2420 1086 2424 +3 1157 2505 2325 +3 946 1085 1084 +3 1085 2424 1084 +3 947 68 254 +3 712 1115 633 +3 1587 713 633 +3 1087 2421 2420 +3 2421 1086 2420 +3 2541 814 2199 +3 2030 299 2028 +3 2033 2031 110 +3 2031 2033 303 +3 2030 2028 110 +3 2653 300 2654 +3 2408 45 2407 +3 152 2033 320 +3 320 2033 110 +3 111 2653 2654 +3 2324 2325 1156 +3 669 1597 631 +3 1585 1586 1587 +3 2146 2223 1576 +3 2220 2222 1882 +3 2220 685 2222 +3 437 1598 1372 +3 2629 2633 691 +3 1883 2222 685 +3 1380 1381 1379 +3 1598 437 1397 +3 1402 1401 2676 +3 1308 1307 400 +3 1613 1308 400 +3 1129 392 791 +3 702 1604 701 +3 1275 1143 1615 +3 496 922 493 +3 400 1609 1611 +3 1612 400 1611 +3 1610 599 1609 +3 2521 62 167 +3 2596 786 2588 +3 1610 1609 1307 +3 1611 1609 1606 +3 599 603 574 +3 1607 599 574 +3 1605 1606 575 +3 576 2596 2588 +3 2589 2591 2594 +3 576 2589 2594 +3 577 1612 2588 +3 786 577 2588 +3 1610 393 603 +3 603 599 1610 +3 393 1610 600 +3 2451 1020 1019 +3 604 2310 2311 +3 600 1610 1307 +3 400 1612 1613 +3 1617 1619 1260 +3 1612 577 1614 +3 1612 1614 1613 +3 2526 1698 1705 +3 2370 995 2369 +3 1261 1616 1270 +3 1259 1260 1619 +3 1143 1617 1615 +3 1615 1617 1260 +3 157 473 120 +3 159 157 120 +3 473 121 120 +3 2064 82 158 +3 1277 1278 1272 +3 1623 1622 1262 +3 1862 490 1733 +3 1617 1262 1619 +3 1618 1623 1262 +3 1933 1932 1259 +3 1313 579 744 +3 2063 159 2064 +3 159 52 2064 +3 1450 82 2064 +3 2080 227 2077 +3 1278 2066 1142 +3 1625 1421 386 +3 1438 1624 1434 +3 2087 1288 2085 +3 1623 1618 1276 +3 1434 1625 386 +3 1626 1345 1344 +3 1345 1626 748 +3 2387 2384 743 +3 2387 741 2384 +3 1627 875 1628 +3 875 1627 1626 +3 1627 748 1626 +3 2383 2379 403 +3 873 868 748 +3 2379 2383 2388 +3 1630 1631 1629 +3 1631 1630 843 +3 1777 1775 847 +3 1629 845 1020 +3 2648 1093 851 +3 1013 845 1012 +3 1631 843 218 +3 1338 1332 759 +3 845 1631 1012 +3 1640 2138 2137 +3 2139 1640 2137 +3 1633 1632 1023 +3 1028 1638 1637 +3 1638 1027 1637 +3 942 232 2142 +3 46 544 960 +3 1638 1034 1018 +3 1808 1225 1809 +3 2125 1634 854 +3 856 1033 1040 +3 1634 1633 1023 +3 2258 1043 2259 +3 1043 2258 860 +3 1079 2464 693 +3 1685 1684 154 +3 858 1638 1018 +3 2137 2136 1028 +3 2139 2137 1028 +3 1106 1107 1906 +3 1021 858 1016 +3 1029 1633 1634 +3 858 1027 1638 +3 1797 262 1716 +3 1633 1639 853 +3 1633 1029 1639 +3 2297 930 931 +3 930 929 931 +3 201 4 1642 +3 1636 1641 1637 +3 1981 116 1986 +3 513 1737 2664 +3 653 654 597 +3 2626 683 2628 +3 1853 90 334 +3 1650 651 672 +3 1692 197 323 +3 2530 2529 343 +3 386 1424 2726 +3 2605 1645 9 +3 200 199 201 +3 2305 200 201 +3 119 118 122 +3 250 925 85 +3 250 1939 925 +3 1962 1961 253 +3 672 651 673 +3 2609 195 2610 +3 1971 1970 866 +3 175 1646 910 +3 911 175 910 +3 1649 1647 1645 +3 32 1998 1997 +3 32 1999 1998 +3 1578 1661 2013 +3 1559 2560 2561 +3 1646 1649 1644 +3 1829 1246 1836 +3 1246 1821 1836 +3 1980 1986 919 +3 1811 1234 1228 +3 1367 2489 1375 +3 1886 865 639 +3 670 623 1651 +3 670 658 623 +3 670 1651 1650 +3 666 670 1650 +3 594 1052 1053 +3 1651 623 698 +3 1815 1236 1813 +3 1845 2404 2399 +3 1824 1823 1230 +3 1656 1483 1481 +3 1483 1192 1481 +3 1204 1656 1481 +3 518 1654 1656 +3 1735 1734 515 +3 922 1745 1744 +3 1659 1302 375 +3 1620 1657 1263 +3 1620 228 1657 +3 1621 228 1620 +3 1265 1657 228 +3 1659 1658 1265 +3 1043 860 2119 +3 1310 1069 1660 +3 1080 694 1079 +3 1661 338 339 +3 1661 1362 338 +3 126 1362 1661 +3 126 1661 1578 +3 1669 1668 502 +3 1284 370 2331 +3 1403 1663 1119 +3 1663 1403 1385 +3 1546 1665 1550 +3 1545 1546 1550 +3 1970 877 749 +3 867 877 1970 +3 1385 2585 2582 +3 936 799 1167 +3 1780 934 1702 +3 2232 2238 1309 +3 2238 2232 2233 +3 1642 202 2417 +3 1753 1751 495 +3 1547 1666 1665 +3 379 378 2736 +3 2700 244 2699 +3 1674 172 1448 +3 1286 1674 1448 +3 810 2090 806 +3 2452 7 205 +3 2695 2696 79 +3 2436 2435 2434 +3 2433 2436 2434 +3 817 2537 484 +3 817 2638 2537 +3 1198 1195 1196 +3 833 2698 836 +3 2691 525 526 +3 2303 1548 1667 +3 1670 2303 1667 +3 2229 1548 2301 +3 2303 2302 1548 +3 2243 2392 2256 +3 156 2063 2065 +3 2063 158 2065 +3 171 83 224 +3 171 1674 83 +3 243 806 2090 +3 805 806 243 +3 172 1674 1675 +3 82 1450 1451 +3 1695 981 980 +3 1684 1682 154 +3 1676 171 1677 +3 1682 64 154 +3 171 1675 1674 +3 1440 1269 2343 +3 692 2632 699 +3 82 170 169 +3 272 98 273 +3 17 269 1678 +3 807 805 472 +3 155 1683 1680 +3 2410 1011 2038 +3 2409 2408 2410 +3 1680 263 1679 +3 263 1680 1681 +3 1682 1681 264 +3 1682 24 1681 +3 64 1682 264 +3 24 263 1681 +3 2038 7 2410 +3 2409 2410 7 +3 209 2046 2047 +3 38 209 2047 +3 266 1684 1686 +3 1684 266 24 +3 266 1686 87 +3 2607 2606 9 +3 1685 214 215 +3 1684 1685 1686 +3 1721 1722 340 +3 1677 1687 1676 +3 1687 1677 1679 +3 1679 170 1687 +3 1081 689 1688 +3 2637 1600 1601 +3 1600 1602 573 +3 567 1135 1207 +3 567 2434 1135 +3 978 1999 2005 +3 1973 1602 690 +3 1973 1972 1602 +3 1602 1603 690 +3 1542 2565 497 +3 2133 1640 1029 +3 2135 2134 1031 +3 2001 1987 2000 +3 261 259 1715 +3 804 243 828 +3 1692 1693 37 +3 323 1693 1692 +3 325 1317 328 +3 1317 325 1697 +3 1699 1694 325 +3 1696 1694 323 +3 1707 323 99 +3 2193 2536 1484 +3 776 2193 1484 +3 2526 2527 2535 +3 2527 2526 345 +3 325 1701 1700 +3 1706 326 340 +3 93 901 902 +3 260 341 1717 +3 1706 324 1707 +3 36 1701 1702 +3 1693 1695 37 +3 37 1695 980 +3 38 344 215 +3 325 328 1701 +3 1696 324 1698 +3 1110 337 332 +3 2535 2527 2531 +3 1704 1315 216 +3 1025 2474 859 +3 213 1317 1318 +3 36 981 1700 +3 340 1708 1705 +3 345 1708 1709 +3 1704 1316 1315 +3 2708 2712 2710 +3 2712 2708 1743 +3 1700 1701 36 +3 1054 1360 622 +3 1359 683 1781 +3 1854 2 488 +3 1852 335 1853 +3 355 1854 488 +3 36 1702 934 +3 1704 328 1316 +3 1056 226 1726 +3 1702 1701 328 +3 1703 1702 328 +3 1704 1703 328 +3 900 216 902 +3 216 1703 1704 +3 2105 144 2613 +3 1705 1706 340 +3 326 1706 1707 +3 99 326 1707 +3 327 326 99 +3 1717 337 77 +3 1697 325 2532 +3 2531 88 2533 +3 2532 2531 2533 +3 1713 343 2529 +3 342 1713 2529 +3 454 1388 1366 +3 1714 259 65 +3 260 1712 1711 +3 342 1711 1712 +3 1712 65 1713 +3 1713 342 1712 +3 2393 2392 2254 +3 327 99 351 +3 77 261 1715 +3 260 1715 1714 +3 341 1716 1717 +3 1716 1718 1717 +3 347 330 346 +3 1721 329 1720 +3 331 1125 1454 +3 1719 331 1454 +3 1125 89 1454 +3 1455 1454 89 +3 1456 1455 89 +3 1125 1124 89 +3 1716 262 1718 +3 932 330 181 +3 932 1124 330 +3 1813 1812 1228 +3 1813 1236 1812 +3 1983 1993 1992 +3 1993 1982 1992 +3 1981 1986 1980 +3 262 1722 1721 +3 262 1721 1720 +3 932 333 1124 +3 33 1725 327 +3 1725 326 327 +3 1725 33 1724 +3 329 1725 1724 +3 1577 469 2079 +3 1056 1057 226 +3 466 1100 1577 +3 40 103 104 +3 1099 292 1056 +3 4 915 1729 +3 1728 1056 1727 +3 1576 466 1577 +3 4 1729 202 +3 911 1648 202 +3 1729 911 202 +3 129 70 125 +3 915 4 916 +3 913 1730 912 +3 121 70 129 +3 1740 562 561 +3 543 92 951 +3 511 1732 1545 +3 1550 511 1545 +3 1732 511 1543 +3 1739 1740 561 +3 2620 768 2666 +3 2624 178 2669 +3 242 2730 1114 +3 490 515 1733 +3 1311 581 2232 +3 1736 1735 515 +3 1735 1736 240 +3 163 1857 19 +3 1737 519 1738 +3 1673 2709 1672 +3 524 239 520 +3 1749 512 495 +3 1192 1483 2700 +3 562 1740 1741 +3 2713 1673 2298 +3 1750 1751 1761 +3 2714 2711 2713 +3 1763 2714 2713 +3 562 2716 2717 +3 601 393 600 +3 496 494 1202 +3 922 496 1745 +3 1311 2232 1309 +3 2619 2620 460 +3 1739 1746 1740 +3 1469 2619 460 +3 1482 1192 2702 +3 1738 2479 517 +3 517 1762 1738 +3 382 383 361 +3 1195 2699 244 +3 1737 1738 1762 +3 1749 1750 513 +3 1752 2231 2230 +3 2298 2299 1671 +3 499 1753 492 +3 1544 2231 499 +3 495 492 1753 +3 496 514 1745 +3 515 490 1754 +3 1668 1669 2735 +3 1754 1755 512 +3 1754 490 1755 +3 2295 2482 2485 +3 2479 1738 2478 +3 2479 2478 1746 +3 2481 2294 1376 +3 2700 1483 244 +3 313 2333 2334 +3 2229 1672 2230 +3 1743 1758 1759 +3 2485 1377 2486 +3 1756 1757 1741 +3 1740 1756 1741 +3 1761 1737 513 +3 1750 1761 513 +3 1758 1747 1759 +3 56 1760 1751 +3 520 239 516 +3 519 1760 1759 +3 1759 1760 1743 +3 2714 2715 923 +3 1751 1760 1761 +3 519 1761 1760 +3 313 372 2333 +3 2225 2226 1256 +3 1256 1766 2225 +3 1258 1253 367 +3 372 2332 2333 +3 652 596 1767 +3 652 676 596 +3 2381 1172 747 +3 2573 1540 2563 +3 1767 596 624 +3 596 625 624 +3 624 1769 1768 +3 634 1768 1769 +3 634 1769 593 +3 1351 634 593 +3 679 946 1076 +3 1787 946 679 +3 1350 634 1351 +3 597 1771 1770 +3 1109 1787 647 +3 1772 846 1774 +3 699 2634 2592 +3 643 743 2627 +3 643 1888 741 +3 690 1603 2629 +3 964 1583 1773 +3 1773 1583 540 +3 104 2304 51 +3 218 907 1012 +3 219 1774 1775 +3 1779 956 963 +3 1038 1039 1037 +3 2289 2290 1374 +3 468 2145 2153 +3 1214 934 1780 +3 2252 1467 2251 +3 1472 553 1471 +3 1066 1786 678 +3 42 8 1788 +3 1064 95 1065 +3 680 1783 679 +3 1782 679 1783 +3 94 568 567 +3 625 596 688 +3 2618 625 688 +3 625 2618 2616 +3 655 1352 1353 +3 592 1784 772 +3 946 1787 1109 +3 1918 1915 1101 +3 1790 80 1563 +3 1942 925 1939 +3 80 57 40 +3 1790 57 80 +3 1794 1792 1795 +3 1794 62 2521 +3 1708 1797 1709 +3 1789 1790 28 +3 1790 1563 28 +3 292 1099 1920 +3 1790 1789 57 +3 1795 62 1794 +3 42 1791 1792 +3 1791 28 1792 +3 1791 1789 28 +3 1382 2583 1396 +3 2584 2583 1382 +3 1722 1708 340 +3 1708 1722 1797 +3 1851 1852 49 +3 1559 1938 1939 +3 57 107 40 +3 42 1792 1794 +3 100 2523 2522 +3 8 2523 100 +3 2512 100 2522 +3 102 29 103 +3 1795 1796 43 +3 78 203 1011 +3 2297 49 932 +3 2296 2297 932 +3 930 2297 2296 +3 1801 1004 1223 +3 1800 1801 1223 +3 529 1850 1851 +3 723 451 724 +3 1802 1803 1226 +3 452 1805 1006 +3 1807 1225 1808 +3 1807 1806 1225 +3 1804 1239 1007 +3 1213 422 969 +3 2456 1224 2455 +3 1224 1806 2455 +3 1799 1224 2456 +3 2456 2455 1800 +3 1812 1811 1228 +3 1810 1811 1235 +3 1229 1818 1244 +3 1231 1394 1832 +3 1807 1808 1803 +3 1806 1224 724 +3 1225 1806 724 +3 724 1809 1225 +3 1229 1236 1815 +3 78 546 203 +3 1983 1985 916 +3 347 422 181 +3 2102 2109 362 +3 2109 2101 362 +3 1812 1236 1235 +3 1814 1813 1228 +3 1814 1652 1813 +3 1238 1237 1814 +3 1237 1652 1814 +3 1810 1234 1811 +3 1244 1818 54 +3 1229 1816 1817 +3 1816 1229 1815 +3 1818 1229 1817 +3 1832 1839 1232 +3 333 334 1456 +3 1123 1124 1125 +3 330 1124 1123 +3 1237 1825 1245 +3 1825 1230 1245 +3 1820 1817 1816 +3 1819 1820 1816 +3 1815 1652 1816 +3 1245 1820 1819 +3 1230 1821 1245 +3 1821 1820 1245 +3 1250 1231 1831 +3 1237 1245 1819 +3 1827 1248 1826 +3 753 1872 879 +3 1821 1822 1836 +3 25 2016 2015 +3 1822 1230 1823 +3 1233 1825 450 +3 1233 1824 1825 +3 879 1870 1869 +3 1250 1831 1830 +3 1826 1822 1823 +3 1250 1826 1823 +3 1827 1826 1830 +3 1250 1830 1826 +3 1829 1248 1828 +3 1822 1826 1248 +3 349 139 892 +3 1831 1232 1833 +3 2014 2015 140 +3 1835 1363 442 +3 1835 1828 1249 +3 1828 1835 442 +3 1835 1249 1834 +3 1834 1363 1835 +3 1248 1829 1836 +3 1836 1822 1248 +3 1821 1246 1820 +3 1838 1839 1366 +3 1232 1837 1833 +3 1839 454 1366 +3 454 1839 1832 +3 2402 2403 1842 +3 1837 1840 1834 +3 1365 1840 1837 +3 1840 1363 1834 +3 318 1147 321 +3 1459 2018 143 +3 1365 1837 1838 +3 1837 1232 1838 +3 1842 2401 2402 +3 1838 1390 1845 +3 1365 1838 1845 +3 1842 1364 1843 +3 1841 1842 1843 +3 1832 1394 454 +3 441 1364 1842 +3 1841 1363 1840 +3 45 2409 1898 +3 2400 189 2399 +3 1844 1365 1845 +3 1846 365 736 +3 133 1847 1846 +3 1847 364 1846 +3 134 364 1847 +3 198 2006 2012 +3 1661 339 2013 +3 2460 2461 1026 +3 1112 861 2460 +3 861 2461 2460 +3 944 2639 1148 +3 2603 2602 1849 +3 1848 194 35 +3 1990 198 2011 +3 2003 1987 2002 +3 214 1685 894 +3 533 2692 527 +3 841 223 840 +3 1850 446 335 +3 932 49 1852 +3 333 932 1852 +3 335 1852 1851 +3 1853 333 1852 +3 334 333 1853 +3 335 90 1853 +3 1858 1860 19 +3 101 2511 2510 +3 526 2697 2692 +3 990 2167 2166 +3 164 71 165 +3 121 71 164 +3 119 70 121 +3 121 129 71 +3 473 20 119 +3 134 1847 1859 +3 1847 462 1859 +3 462 1847 133 +3 19 1857 1858 +3 1390 2404 1845 +3 1390 2405 2404 +3 177 525 2683 +3 525 177 559 +3 160 19 1443 +3 134 132 364 +3 1452 1445 369 +3 1733 832 1862 +3 834 489 835 +3 1866 241 833 +3 241 1866 832 +3 1864 832 1866 +3 1863 1864 390 +3 1865 1867 432 +3 1865 1864 1867 +3 86 1948 2208 +3 86 1950 1948 +3 148 479 1865 +3 491 834 835 +3 489 482 835 +3 2610 2608 2609 +3 1866 1867 1864 +3 1867 1868 432 +3 777 1525 778 +3 833 1868 1867 +3 833 151 1868 +3 833 836 151 +3 1121 187 443 +3 867 878 877 +3 877 878 755 +3 878 1869 755 +3 753 879 1342 +3 878 879 1869 +3 1342 879 878 +3 1162 752 1871 +3 1871 752 1870 +3 1233 1231 1824 +3 1872 756 1162 +3 1452 2682 1441 +3 191 2678 455 +3 1892 641 1891 +3 1896 641 1892 +3 1361 1351 636 +3 2386 747 582 +3 2303 1671 2302 +3 640 621 1877 +3 621 640 1881 +3 742 1888 1891 +3 662 657 658 +3 2223 468 2154 +3 640 875 1884 +3 1887 1886 639 +3 621 1883 1880 +3 1884 1882 640 +3 468 2153 2154 +3 2225 1302 1659 +3 748 868 869 +3 868 865 866 +3 869 868 866 +3 746 1880 1883 +3 918 1981 1980 +3 1010 2539 2538 +3 1879 1880 1885 +3 1880 746 1885 +3 621 1880 1879 +3 798 799 408 +3 1172 1171 687 +3 1886 1885 746 +3 1982 116 1981 +3 1663 2584 1386 +3 1886 1887 742 +3 1876 1897 1875 +3 1879 1890 1893 +3 1890 1891 1893 +3 1894 1893 641 +3 1893 1891 641 +3 1357 1896 1358 +3 1879 1893 1894 +3 1878 1879 1894 +3 1374 1367 1375 +3 2490 2489 1367 +3 1896 1892 1358 +3 586 656 1055 +3 1894 1897 1878 +3 1895 1896 620 +3 1895 620 1875 +3 1876 1875 637 +3 112 45 1898 +3 1895 641 1896 +3 2583 1385 2582 +3 1876 1878 1897 +3 1899 13 1900 +3 1900 13 1901 +3 1930 2453 1410 +3 1437 1930 1410 +3 108 1904 1903 +3 1905 293 1904 +3 108 1905 1904 +3 1903 1902 108 +3 2210 2209 1948 +3 2241 1048 2465 +3 1491 967 966 +3 1907 1906 693 +3 1907 1908 1906 +3 2632 692 1911 +3 2465 2239 2241 +3 1319 289 943 +3 943 289 944 +3 2495 139 2494 +3 2185 2723 2188 +3 1589 2288 2286 +3 694 1081 1910 +3 1909 1910 1911 +3 2538 2539 1106 +3 1046 2473 1112 +3 1907 1909 1908 +3 1909 695 1908 +3 1156 2325 2508 +3 626 669 631 +3 692 695 1909 +3 1918 1916 1915 +3 1148 943 944 +3 1104 1912 1105 +3 1912 945 1105 +3 1101 1915 1104 +3 1099 1098 1921 +3 292 1919 1101 +3 2149 988 2186 +3 2160 989 2156 +3 996 2162 995 +3 1097 1927 1919 +3 2184 2151 2183 +3 1095 290 1917 +3 1916 1917 290 +3 2107 359 358 +3 359 2614 358 +3 1098 350 1922 +3 1095 1917 1096 +3 1925 1928 1923 +3 1928 1925 1922 +3 1919 292 1920 +3 2189 2190 2640 +3 1927 1097 1925 +3 1927 1925 1926 +3 1919 1927 1918 +3 1928 1922 350 +3 42 15 8 +3 1922 1097 1921 +3 1096 1923 1924 +3 2523 15 2520 +3 1923 350 1924 +3 166 2520 2519 +3 2523 2520 166 +3 8 15 2523 +3 1926 1102 1927 +3 387 1418 1419 +3 413 1413 1929 +3 1412 1929 1413 +3 1615 1260 1931 +3 1616 1615 1931 +3 1185 1183 2315 +3 1185 1186 1183 +3 1932 1260 1259 +3 373 1616 1932 +3 1616 373 1270 +3 1616 1931 1932 +3 1931 1260 1932 +3 2519 2516 2515 +3 1270 373 1258 +3 348 63 2518 +3 1934 348 2518 +3 31 200 2305 +3 2419 31 2305 +3 2558 1559 2559 +3 62 1795 43 +3 672 2113 630 +3 1940 924 1938 +3 1940 1937 1560 +3 1940 1938 1937 +3 1560 43 1796 +3 2602 2603 18 +3 1560 1937 1936 +3 1938 1559 1937 +3 1560 1936 43 +3 1943 925 1942 +3 1945 1944 926 +3 1944 1945 1943 +3 1941 924 1940 +3 1561 1941 1940 +3 1796 1561 1560 +3 1793 1561 1796 +3 2210 85 2209 +3 926 2209 1945 +3 2208 2209 926 +3 2610 195 979 +3 18 1848 2602 +3 1848 18 2607 +3 169 1949 1947 +3 1946 169 1947 +3 419 2214 2215 +3 676 671 596 +3 1954 888 322 +3 1178 1177 322 +3 1177 1952 322 +3 80 81 1944 +3 80 1944 27 +3 1944 1943 27 +3 1945 925 1943 +3 2210 128 949 +3 85 925 1945 +3 1951 65 258 +3 2659 2660 301 +3 881 2660 2659 +3 1951 258 128 +3 1944 1946 926 +3 1944 81 1946 +3 949 85 2210 +3 1947 926 1946 +3 2196 779 2217 +3 169 81 168 +3 81 169 1946 +3 265 1466 86 +3 1466 1950 86 +3 169 170 1949 +3 1951 128 1950 +3 197 1691 1647 +3 1713 65 1951 +3 267 1713 1951 +3 87 1713 267 +3 267 1951 1950 +3 780 2213 2212 +3 783 2212 2213 +3 1955 1346 870 +3 579 1313 2236 +3 2233 578 1310 +3 1537 2570 2571 +3 1312 1311 1309 +3 1955 876 1346 +3 2573 2577 1957 +3 871 402 1956 +3 876 1955 402 +3 1955 1956 402 +3 2261 2581 290 +3 2581 2261 1914 +3 218 1960 1958 +3 1090 2415 5 +3 1959 1960 908 +3 1729 1730 911 +3 2416 1199 1655 +3 2416 1200 1209 +3 1199 2416 1209 +3 518 2416 1655 +3 2416 518 1200 +3 947 251 252 +3 948 891 947 +3 348 1961 1963 +3 247 348 1964 +3 63 348 247 +3 348 1963 1964 +3 1964 1963 41 +3 1964 1966 247 +3 1583 92 541 +3 1969 511 1550 +3 1968 1967 60 +3 247 1967 1968 +3 1967 248 60 +3 122 70 119 +3 248 1967 1966 +3 511 1969 1669 +3 2734 1549 2735 +3 1996 1980 919 +3 1334 1333 872 +3 2490 1383 2489 +3 1982 1981 918 +3 243 804 805 +3 1770 1769 624 +3 2307 2308 1186 +3 2593 2590 1601 +3 1979 1996 1997 +3 861 2462 2461 +3 907 2415 1090 +3 1024 2470 2468 +3 196 1990 2011 +3 1848 1990 196 +3 2011 198 2012 +3 1989 115 196 +3 35 1990 1848 +3 2007 2008 1989 +3 2008 2007 1988 +3 199 2010 201 +3 1979 918 1980 +3 1997 1996 1978 +3 2006 2001 1988 +3 2006 2002 2001 +3 96 971 970 +3 96 976 972 +3 1065 653 597 +3 917 1982 918 +3 1984 916 921 +3 1983 116 1993 +3 116 1982 1993 +3 2004 198 1991 +3 1642 2305 201 +3 1642 2419 2305 +3 2003 2002 2004 +3 61 977 978 +3 2005 1999 32 +3 202 1648 2417 +3 1662 2241 1047 +3 1961 1934 1935 +3 2007 2012 2006 +3 2004 2002 198 +3 1026 2462 1025 +3 2011 1989 196 +3 1992 1985 1983 +3 1985 1992 917 +3 1992 1982 917 +3 1467 1468 677 +3 2242 1467 677 +3 917 912 1985 +3 1977 1994 919 +3 1994 1996 919 +3 1998 1979 1997 +3 1998 972 1979 +3 2475 2469 1015 +3 2124 2123 2127 +3 1976 920 1977 +3 972 976 1979 +3 2473 861 1112 +3 1094 2259 859 +3 2474 1094 859 +3 2003 2005 32 +3 1978 1995 1987 +3 1995 2000 1987 +3 1995 920 2000 +3 2464 1907 693 +3 1909 1907 2492 +3 2413 904 2412 +3 978 977 1999 +3 1978 2003 32 +3 32 1997 1978 +3 2003 1978 1987 +3 977 61 985 +3 2000 920 1988 +3 2009 115 2008 +3 198 2002 2006 +3 852 1094 2474 +3 2005 2003 2004 +3 920 2008 1988 +3 1023 1047 1046 +3 1023 1046 854 +3 1632 1047 1023 +3 1565 1141 2371 +3 1029 1634 2129 +3 4 201 2010 +3 921 2010 2009 +3 2009 2010 115 +3 287 2720 2721 +3 862 2124 2127 +3 199 115 2010 +3 916 2010 921 +3 4 2010 916 +3 2272 2276 1464 +3 427 2276 2272 +3 2273 1464 2276 +3 26 1903 2021 +3 1903 294 2021 +3 2271 23 2274 +3 775 1495 1499 +3 113 2023 298 +3 2023 26 2022 +3 26 2024 1903 +3 1903 2024 1902 +3 2024 112 1902 +3 2025 112 2024 +3 426 112 2025 +3 112 426 45 +3 113 1464 2273 +3 2273 2025 113 +3 307 152 320 +3 2032 22 299 +3 299 295 2028 +3 2031 2032 2030 +3 2032 299 2030 +3 2031 2030 110 +3 343 215 344 +3 959 91 961 +3 2048 91 959 +3 205 204 2034 +3 473 157 20 +3 59 208 214 +3 208 59 2034 +3 22 1465 298 +3 1465 113 298 +3 152 303 2033 +3 2045 210 2041 +3 210 2045 2049 +3 2046 2042 903 +3 203 2037 1011 +3 204 2037 2036 +3 2038 2037 204 +3 1011 2037 2038 +3 2408 2407 1146 +3 2034 59 205 +3 2038 204 205 +3 7 2038 205 +3 24 1682 1684 +3 1389 1388 2411 +3 1388 1389 1366 +3 2043 2042 210 +3 214 2044 38 +3 543 211 542 +3 2044 209 38 +3 220 906 2043 +3 2041 2042 2046 +3 208 2040 2044 +3 2039 2040 208 +3 220 2054 954 +3 2041 2046 209 +3 2040 2041 209 +3 203 960 961 +3 157 156 20 +3 156 157 2063 +3 204 2035 2034 +3 2048 2045 91 +3 1301 1264 1140 +3 210 2049 2050 +3 2050 2051 2043 +3 2051 2050 952 +3 2050 2043 210 +3 543 951 2052 +3 952 543 2052 +3 952 2052 2051 +3 953 2053 951 +3 953 2054 2053 +3 2054 220 2053 +3 954 2056 955 +3 2035 208 2034 +3 206 59 207 +3 2058 92 965 +3 2060 221 963 +3 951 92 2058 +3 953 2057 2055 +3 11 58 206 +3 2058 965 221 +3 964 965 1583 +3 221 2057 2058 +3 953 2058 2057 +3 2648 2257 849 +3 2048 2062 2045 +3 2049 2062 958 +3 2045 2062 2049 +3 1301 225 2068 +3 1277 2066 1278 +3 2065 158 51 +3 2066 1277 1264 +3 2067 2066 1264 +3 1264 1301 2067 +3 1301 2068 2067 +3 1280 231 1279 +3 1281 2072 1297 +3 2071 229 2072 +3 1280 2071 2072 +3 2076 2075 1283 +3 2087 2088 224 +3 2073 1282 2069 +3 2068 2073 2069 +3 2071 2076 229 +3 1282 2075 2076 +3 2074 2075 1282 +3 1281 1280 2072 +3 231 1280 1281 +3 2069 2067 2068 +3 2068 1285 2073 +3 2086 2078 2079 +3 232 1296 285 +3 1282 2076 2071 +3 2087 2081 1288 +3 2081 2087 1290 +3 84 51 168 +3 227 2080 2081 +3 1285 2078 2077 +3 226 1057 2084 +3 1287 2082 2080 +3 2082 2081 2080 +3 2082 1288 2081 +3 1140 1264 1623 +3 1287 226 2082 +3 1287 1726 226 +3 2068 225 2079 +3 2068 2079 1285 +3 225 1577 2079 +3 1057 289 2084 +3 1320 289 1319 +3 2080 2078 1287 +3 297 2083 2084 +3 297 2085 2083 +3 2089 1678 171 +3 224 1290 2087 +3 82 169 168 +3 2088 1678 2089 +3 1677 171 1678 +3 171 224 2089 +3 2644 483 2643 +3 812 2644 810 +3 394 812 810 +3 810 2644 2090 +3 481 829 817 +3 1431 2111 475 +3 2111 2110 475 +3 2106 2102 362 +3 2098 2097 142 +3 771 2615 2618 +3 2464 2492 1907 +3 2464 694 2492 +3 302 359 880 +3 2662 302 880 +3 2499 1157 2324 +3 1854 2095 354 +3 1854 356 2095 +3 352 2097 2098 +3 354 2095 2096 +3 1472 1471 179 +3 2612 2613 385 +3 2096 2097 352 +3 2486 1378 2485 +3 2283 682 2278 +3 357 2092 2101 +3 1463 1462 142 +3 147 2269 428 +3 353 352 2098 +3 357 2101 2100 +3 2092 114 2101 +3 882 145 363 +3 2110 2093 2103 +3 155 2112 1683 +3 2112 268 1683 +3 300 2653 2655 +3 2112 155 1678 +3 2105 2096 144 +3 385 44 384 +3 2650 888 2659 +3 410 612 939 +3 2106 363 2102 +3 363 145 2102 +3 114 785 362 +3 242 809 2730 +3 2106 2267 146 +3 617 597 1770 +3 2651 889 2650 +3 301 2651 2650 +3 1492 1493 776 +3 2103 475 2110 +3 1678 269 2112 +3 268 269 97 +3 1116 2113 2114 +3 2113 672 2114 +3 650 1116 2114 +3 2115 1468 675 +3 2116 2115 675 +3 682 2280 2279 +3 2114 672 673 +3 2115 2114 673 +3 2246 2248 3 +3 1145 2248 2246 +3 704 2247 3 +3 650 2115 2116 +3 650 2114 2115 +3 1585 1587 1588 +3 1003 706 1115 +3 969 973 2117 +3 96 2117 973 +3 182 969 970 +3 2120 2119 860 +3 1044 854 1113 +3 293 109 2026 +3 1042 854 2118 +3 851 2647 2648 +3 2178 2179 2180 +3 287 995 2157 +3 1043 2119 2118 +3 862 1634 2125 +3 2121 860 1033 +3 2129 1634 862 +3 856 1031 1032 +3 2123 1041 2122 +3 1094 849 2259 +3 2125 854 1042 +3 2132 2134 863 +3 2131 1032 1031 +3 2138 2132 863 +3 2138 2133 2132 +3 2139 1639 1640 +3 2133 1030 2132 +3 2242 2256 2245 +3 2256 1145 2245 +3 1028 2136 1638 +3 2136 1034 1638 +3 1185 2307 1186 +3 1188 1187 2313 +3 1185 2306 2307 +3 1302 2225 1766 +3 1641 1639 2141 +3 1639 1641 853 +3 2142 286 943 +3 286 1319 943 +3 2144 942 2143 +3 2143 942 2142 +3 943 2143 2142 +3 2185 988 2722 +3 1861 19 1860 +3 2183 2151 2191 +3 2721 1924 287 +3 2229 2230 502 +3 2144 2145 942 +3 942 2146 465 +3 942 2145 2146 +3 2145 468 2146 +3 2660 882 301 +3 1387 2411 1367 +3 2411 2490 1367 +3 878 867 754 +3 2149 989 987 +3 2148 2149 987 +3 2165 993 2168 +3 950 1568 1569 +3 992 989 2160 +3 2151 988 2150 +3 2147 2153 2145 +3 702 1078 2524 +3 702 1079 1078 +3 2144 2143 288 +3 2150 2148 288 +3 2158 2183 2192 +3 2161 992 2160 +3 2193 776 1489 +3 2369 2368 2161 +3 1096 2721 991 +3 2541 815 2641 +3 814 2541 2641 +3 993 997 2168 +3 2171 2170 2169 +3 2174 2176 2175 +3 2176 1098 2171 +3 2512 2522 2511 +3 2163 2175 2167 +3 2163 2174 2175 +3 2510 2511 245 +3 1300 2376 1568 +3 2374 1137 1292 +3 2511 166 245 +3 291 1103 2170 +3 2378 2389 1174 +3 997 993 2170 +3 291 2171 1098 +3 2171 291 2170 +3 1618 1143 1276 +3 1965 1966 1964 +3 1617 1143 1618 +3 2173 2172 2162 +3 996 2173 2162 +3 994 2167 2175 +3 2176 994 2175 +3 8 100 102 +3 996 1924 2174 +3 2261 2260 1914 +3 2261 1913 2260 +3 2178 2180 1913 +3 827 2539 1010 +3 296 270 2363 +3 1095 2158 2177 +3 2157 2156 2190 +3 1095 2177 2178 +3 2146 468 2223 +3 353 2098 75 +3 2719 2720 2152 +3 1095 1096 991 +3 2158 1095 991 +3 2177 2179 2178 +3 1320 1319 270 +3 2181 2180 1912 +3 1793 1795 1792 +3 2603 1849 199 +3 2195 2194 1522 +3 2185 2188 2186 +3 97 269 271 +3 18 2603 2604 +3 1319 286 2366 +3 945 2191 2151 +3 1484 783 1486 +3 2545 1163 758 +3 2195 2196 150 +3 779 2544 2197 +3 2543 2544 779 +3 2216 2217 2197 +3 1429 431 1430 +3 1429 1430 1428 +3 2206 790 406 +3 2545 1158 1163 +3 2641 2642 814 +3 148 1865 432 +3 2200 779 2196 +3 2196 2217 150 +3 2197 2198 780 +3 2212 2197 780 +3 1159 2545 758 +3 392 1129 580 +3 2429 2431 587 +3 2541 2543 2542 +3 2541 2199 2543 +3 1437 413 1930 +3 148 432 1429 +3 2543 779 2542 +3 391 2202 481 +3 812 813 483 +3 2202 482 489 +3 481 2202 489 +3 830 481 489 +3 2204 2205 792 +3 801 792 2205 +3 2206 406 2205 +3 2203 791 2204 +3 2204 407 2203 +3 2205 2207 801 +3 791 2203 1129 +3 781 2215 2198 +3 266 87 267 +3 2208 1947 86 +3 1488 783 2213 +3 2610 979 35 +3 194 2610 35 +3 2208 1948 2209 +3 1484 2211 783 +3 118 119 20 +3 2217 2216 150 +3 150 2194 2195 +3 1784 2429 587 +3 2541 391 815 +3 2538 1906 2540 +3 2200 2196 2195 +3 781 419 2215 +3 2212 2216 2197 +3 2218 1438 1411 +3 486 1438 2218 +3 2183 2191 2219 +3 2192 2183 2219 +3 2182 2219 2191 +3 2192 2219 2182 +3 2118 2119 1042 +3 2120 1042 2119 +3 272 6 1152 +3 285 98 2365 +3 2364 2366 2365 +3 2366 2364 270 +3 2161 2368 2367 +3 990 2161 2367 +3 2497 1490 1486 +3 284 2364 2365 +3 2126 1042 2120 +3 1256 2226 2227 +3 2226 1271 2227 +3 563 1547 1744 +3 2302 2301 1548 +3 2302 2300 2301 +3 1671 2300 2302 +3 1548 2229 1668 +3 2229 502 1668 +3 527 2697 529 +3 2697 1850 529 +3 1956 1955 870 +3 2233 1310 2235 +3 404 2262 766 +3 695 2525 826 +3 2236 1312 1309 +3 1313 1312 2236 +3 745 1312 1313 +3 1047 2239 1046 +3 2469 1024 2468 +3 2469 2475 1024 +3 2462 861 2463 +3 2240 861 2473 +3 2472 2240 2473 +3 2465 1048 2466 +3 2327 708 2249 +3 2241 1564 1048 +3 2241 1662 1564 +3 708 2324 2249 +3 2328 1977 919 +3 2285 705 2286 +3 2247 2251 2250 +3 675 2253 2116 +3 1370 2290 2289 +3 2253 2251 2247 +3 382 361 1149 +3 1468 2252 675 +3 709 1144 677 +3 675 2251 2253 +3 1468 1467 2252 +3 1138 1570 2649 +3 1570 1571 2649 +3 2282 1585 1588 +3 2278 1584 2283 +3 2243 1144 2255 +3 2242 1144 2243 +3 677 1144 2242 +3 2242 2243 2256 +3 1974 570 1973 +3 1975 1974 1973 +3 2633 1603 2636 +3 1688 689 1975 +3 689 1974 1975 +3 689 1081 1080 +3 494 508 809 +3 2254 2255 2244 +3 2255 1144 2244 +3 2392 2393 2256 +3 2393 1145 2256 +3 2263 1311 766 +3 2263 581 1311 +3 2373 2372 1274 +3 2373 2371 2372 +3 1274 2375 1143 +3 1567 1140 2264 +3 1485 1489 775 +3 785 2266 2267 +3 785 428 2266 +3 146 2267 2266 +3 2267 2106 362 +3 785 2267 362 +3 2396 490 2398 +3 2025 2273 426 +3 2277 2273 2276 +3 2277 426 2273 +3 1464 1465 2265 +3 2274 23 2275 +3 426 2274 2275 +3 428 2269 2268 +3 427 2270 2271 +3 427 2277 2276 +3 2274 426 2277 +3 1460 75 1459 +3 45 426 2275 +3 2408 2409 45 +3 1011 2408 1146 +3 2411 1387 1389 +3 1387 1368 1389 +3 2491 1377 1395 +3 854 1046 1112 +3 2280 706 1003 +3 1588 706 2280 +3 2285 1586 1585 +3 2281 2116 2253 +3 2282 1588 2280 +3 1377 2485 2482 +3 1542 2575 2565 +3 507 1528 1501 +3 1157 2325 2324 +3 1965 1964 41 +3 2725 1965 41 +3 2328 1976 1977 +3 2503 2504 707 +3 2506 2503 707 +3 2396 1755 490 +3 834 1755 2396 +3 2266 428 2395 +3 617 624 2617 +3 2287 2288 713 +3 1589 1591 2288 +3 2289 1374 1375 +3 2291 1373 2292 +3 2407 2275 1146 +3 2275 2407 45 +3 136 382 379 +3 136 381 382 +3 1799 2456 2457 +3 2458 1799 2457 +3 1210 930 2296 +3 2458 2457 1223 +3 136 376 381 +3 563 2298 1671 +3 2297 931 49 +3 500 1556 508 +3 508 494 500 +3 2158 2159 2183 +3 2306 1184 2307 +3 563 1763 2298 +3 287 2157 2720 +3 525 2691 257 +3 2712 56 2709 +3 2299 2300 1671 +3 2299 2228 2300 +3 2687 2690 532 +3 445 444 187 +3 1630 846 222 +3 156 2304 105 +3 51 84 104 +3 2569 2567 1536 +3 2304 104 105 +3 2424 2425 1084 +3 1934 43 1936 +3 2603 200 2604 +3 2714 923 2711 +3 1758 2708 2707 +3 2707 2706 1758 +3 2306 1208 1184 +3 2306 2314 1208 +3 1193 2309 1184 +3 2309 2308 1184 +3 606 399 1194 +3 2309 1193 2313 +3 2707 2708 923 +3 1741 2707 923 +3 2507 1589 1590 +3 2314 1185 2315 +3 608 606 2321 +3 608 418 606 +3 2318 2317 2316 +3 425 2317 2318 +3 2316 2315 1183 +3 761 763 2450 +3 763 761 760 +3 425 608 2317 +3 1181 425 2318 +3 425 1181 1182 +3 2317 608 2321 +3 2321 2320 605 +3 2319 605 2320 +3 2317 2321 605 +3 2316 2317 605 +3 708 2326 2498 +3 2499 708 2498 +3 2322 2501 2500 +3 2322 709 2501 +3 2322 2500 2499 +3 2498 2322 2499 +3 708 2499 2324 +3 707 2507 2506 +3 709 2322 2323 +3 709 2323 1144 +3 2326 2244 1144 +3 2323 2326 1144 +3 1297 2331 372 +3 2072 229 1297 +3 229 2331 1297 +3 1284 2331 229 +3 315 316 236 +3 2332 230 2333 +3 2329 1439 2335 +3 312 313 2334 +3 1268 2329 2335 +3 315 233 316 +3 2343 2335 1440 +3 2344 1269 2345 +3 2336 2337 1347 +3 1268 2337 2336 +3 2340 1765 367 +3 2340 1255 1765 +3 2343 2342 1268 +3 1268 2335 2343 +3 1766 2338 1302 +3 2341 2334 230 +3 2333 230 2334 +3 2337 1268 2342 +3 310 1251 374 +3 2354 310 374 +3 2351 462 463 +3 462 2351 1861 +3 2340 2339 1255 +3 2342 368 2338 +3 1443 2350 2349 +3 2342 2344 368 +3 2343 2344 2342 +3 1267 2347 2348 +3 162 1444 1441 +3 2350 1861 2351 +3 2343 1269 2344 +3 2344 2347 368 +3 2346 2349 2353 +3 19 160 163 +3 163 160 159 +3 1442 1445 1444 +3 2354 2353 2357 +3 310 2354 2355 +3 368 2352 1302 +3 2338 368 1302 +3 2352 368 2347 +3 2347 1267 2352 +3 1444 162 1446 +3 1442 1444 1446 +3 1447 162 1303 +3 1267 2646 53 +3 2359 637 598 +3 637 2359 1876 +3 375 2352 2356 +3 375 1302 2352 +3 371 2353 2354 +3 310 2355 1002 +3 375 2356 1266 +3 2353 161 2357 +3 79 2698 2695 +3 1888 643 1892 +3 1628 874 2388 +3 2361 272 2360 +3 98 284 2365 +3 271 2363 2362 +3 2367 2162 2172 +3 990 2367 2172 +3 2365 286 285 +3 995 2368 2369 +3 2368 995 2162 +3 2368 2162 2367 +3 2156 995 2370 +3 2370 2160 2156 +3 1137 2373 1274 +3 1292 1569 2376 +3 1292 2376 2374 +3 2374 2376 1300 +3 1569 1568 2376 +3 993 2165 2166 +3 1300 1565 2371 +3 1568 1565 1300 +3 1141 2372 2371 +3 2373 2374 1300 +3 1141 2377 2372 +3 2377 1141 2264 +3 2389 2358 1174 +3 2388 2383 1628 +3 2383 873 1628 +3 2384 403 743 +3 2386 582 1314 +3 1628 873 1627 +3 745 2382 2386 +3 2382 2380 2386 +3 745 1313 2382 +3 643 2387 743 +3 643 741 2387 +3 1173 1172 2381 +3 2380 2382 403 +3 744 743 2382 +3 743 403 2382 +3 744 579 1067 +3 1313 744 2382 +3 2386 1314 745 +3 1877 2390 640 +3 2385 868 873 +3 2380 747 2386 +3 874 2389 2378 +3 2389 2390 2358 +3 2389 874 2390 +3 2390 638 2358 +3 1877 638 2390 +3 1887 2385 741 +3 874 640 2390 +3 639 2385 1887 +3 846 2391 1776 +3 2254 2392 2255 +3 428 2268 2395 +3 2395 2265 2266 +3 2401 1406 1369 +3 2397 831 489 +3 831 830 489 +3 834 2397 489 +3 2444 2445 829 +3 480 829 2445 +3 2398 1863 831 +3 2396 2398 831 +3 1114 2729 395 +3 2729 2728 395 +3 834 2396 2397 +3 1862 1863 2398 +3 490 1862 2398 +3 390 2445 2444 +3 439 2402 1369 +3 439 2403 2402 +3 439 1381 2403 +3 189 2400 2401 +3 2400 1406 2401 +3 1381 441 2403 +3 1368 2406 2405 +3 1406 2400 2404 +3 2400 2399 2404 +3 2409 7 13 +3 1898 2409 13 +3 2528 342 2529 +3 424 957 2412 +3 980 61 979 +3 905 2413 2412 +3 2415 907 1958 +3 2415 1958 905 +3 2414 2415 905 +3 2414 5 2415 +3 957 5 2414 +3 962 5 957 +3 1087 1106 2539 +3 1935 253 1961 +3 2418 2419 1642 +3 2418 31 2419 +3 2417 2418 1642 +3 250 85 252 +3 891 68 947 +3 1010 2540 1908 +3 827 1058 2422 +3 2504 710 1592 +3 2423 1085 825 +3 1085 1108 825 +3 1084 2425 2426 +3 681 2426 2425 +3 2420 1085 2423 +3 2420 2424 1085 +3 2426 1076 1084 +3 2432 2616 587 +3 2431 2432 587 +3 617 2617 2432 +3 681 2427 2426 +3 2427 1076 2426 +3 1784 680 2429 +3 1206 566 94 +3 2432 1074 1073 +3 783 2211 2212 +3 2323 2498 2326 +3 2433 1600 573 +3 1111 897 2437 +3 936 1167 415 +3 2438 897 2439 +3 1041 2124 2126 +3 936 415 937 +3 2443 936 937 +3 514 496 1202 +3 1600 1603 1602 +3 568 1600 2433 +3 1601 1600 568 +3 1690 2435 573 +3 2439 174 2438 +3 794 408 811 +3 2502 2724 1157 +3 2500 2502 1157 +3 1157 2724 2505 +3 2724 2503 2505 +3 1744 1742 563 +3 936 2443 767 +3 793 408 794 +3 799 2441 408 +3 1327 686 2439 +3 686 1327 765 +3 2440 2438 811 +3 2441 2440 811 +3 2440 2441 767 +3 2729 808 2728 +3 2442 1111 2437 +3 831 390 2444 +3 1863 390 831 +3 2444 830 831 +3 1304 2450 601 +3 2672 417 2671 +3 941 2672 2671 +3 769 2674 2668 +3 2674 2671 2668 +3 2671 2674 2667 +3 601 2450 1182 +3 1776 2391 2451 +3 1019 847 2451 +3 1182 2449 2448 +3 847 1776 2451 +3 1776 847 1775 +3 2450 2449 1182 +3 2450 763 2449 +3 2391 1020 2451 +3 2571 2570 16 +3 7 2452 13 +3 13 2452 1901 +3 2455 1802 1800 +3 1937 1559 2558 +3 252 85 949 +3 2558 1936 1937 +3 2455 1806 1802 +3 2457 2456 1800 +3 1221 1798 1223 +3 932 181 1210 +3 2457 1800 1223 +3 2459 1222 725 +3 2608 2607 9 +3 2459 725 1799 +3 1112 2460 1113 +3 2732 2259 1043 +3 2731 2732 1044 +3 861 2240 2463 +3 2466 1048 2467 +3 852 2474 2471 +3 2461 2462 1026 +3 1089 848 1090 +3 2468 2467 855 +3 2469 855 1021 +3 2468 855 2469 +3 1015 2469 1021 +3 1089 2471 1024 +3 2471 1089 852 +3 2239 1047 2241 +3 2472 2239 2465 +3 2466 2472 2465 +3 2466 2240 2472 +3 859 1026 1025 +3 2239 2472 1046 +3 848 2475 2476 +3 2475 848 1089 +3 848 2476 1014 +3 1738 1856 2478 +3 2700 2701 1192 +3 1741 2715 2716 +3 2480 1856 1747 +3 2480 2478 1856 +3 1756 2480 1747 +3 1756 1746 2480 +3 1746 2478 2480 +3 1151 383 44 +3 1953 302 883 +3 885 302 1953 +3 360 302 885 +3 1376 2484 2483 +3 2483 2484 1371 +3 1952 1953 883 +3 2289 2484 1376 +3 439 1378 2486 +3 1391 1372 2490 +3 2490 1372 1383 +3 1388 1391 2490 +3 2484 1375 2488 +3 2484 2488 1371 +3 2488 1383 1371 +3 2488 2489 1383 +3 2488 1375 2489 +3 1641 2663 853 +3 376 377 349 +3 377 2493 349 +3 165 131 134 +3 377 135 2493 +3 135 2494 2493 +3 2494 349 2493 +3 139 349 2494 +3 73 139 2495 +3 74 349 892 +3 270 1319 2366 +3 2514 2513 245 +3 2322 2498 2323 +3 710 2504 1594 +3 251 254 2725 +3 825 1107 1106 +3 251 2725 41 +3 41 1962 251 +3 1594 2502 2501 +3 2502 2500 2501 +3 947 254 251 +3 2503 2506 2505 +3 2505 2506 2325 +3 2509 1591 707 +3 713 1591 1592 +3 1591 1589 2507 +3 1156 2508 3 +3 709 674 710 +3 2504 2509 707 +3 1855 101 2510 +3 29 100 2512 +3 100 29 102 +3 345 2526 1708 +3 256 2512 101 +3 256 29 2512 +3 60 1855 2513 +3 245 2515 2514 +3 2515 246 2514 +3 245 2513 2510 +3 2513 1855 2510 +3 167 2519 2520 +3 167 2516 2519 +3 67 255 248 +3 2518 63 2517 +3 2516 246 2515 +3 167 62 2517 +3 167 2517 2516 +3 2517 63 2516 +3 255 256 101 +3 67 256 255 +3 2519 2515 245 +3 166 2519 245 +3 2518 62 43 +3 1934 2518 43 +3 1643 31 2418 +3 62 2518 2517 +3 2520 2521 167 +3 2521 2520 15 +3 15 42 2521 +3 2524 1078 703 +3 826 2524 703 +3 2536 2194 150 +3 578 1614 1131 +3 2525 695 572 +3 2527 345 1710 +3 1698 324 1705 +3 2532 2533 1697 +3 2530 2533 88 +3 2533 2530 2534 +3 1698 2526 2535 +3 341 1710 1709 +3 88 2529 2530 +3 343 344 2530 +3 2531 1698 2535 +3 2531 2532 1698 +3 1697 2533 2534 +3 1317 213 1316 +3 431 147 785 +3 1694 1696 325 +3 1317 1697 2534 +3 2534 1318 1317 +3 1318 2534 344 +3 344 2534 2530 +3 431 785 114 +3 431 114 1431 +3 1431 114 2111 +3 2537 503 484 +3 1428 1427 148 +3 2198 2544 2199 +3 1087 2539 2422 +3 243 2644 2643 +3 828 243 2643 +3 2544 2198 2197 +3 2199 781 2198 +3 2200 2542 779 +3 2207 406 802 +3 1905 1900 12 +3 1513 1511 2548 +3 2548 1511 2547 +3 2547 1511 1531 +3 1511 1528 1531 +3 2548 1515 1513 +3 2550 826 703 +3 2552 1403 1119 +3 2552 2553 1408 +3 1436 1408 2553 +3 1436 1409 1408 +3 2555 2554 1407 +3 2552 1119 2553 +3 1664 2554 1119 +3 2553 1119 2554 +3 1404 2552 1408 +3 1436 2553 2554 +3 308 306 307 +3 2557 1401 1402 +3 2454 433 1435 +3 2557 2556 1401 +3 2562 251 1962 +3 2559 1936 2558 +3 2560 1559 1939 +3 251 250 252 +3 2562 250 251 +3 2560 1939 250 +3 1935 2561 253 +3 2561 2560 253 +3 544 542 960 +3 2579 1552 1557 +3 1555 500 2572 +3 2564 2566 1537 +3 958 543 952 +3 1536 2567 1538 +3 2564 1537 2565 +3 2574 2575 2576 +3 2575 1542 2576 +3 79 546 234 +3 836 79 234 +3 2567 509 2568 +3 2571 2565 1537 +3 2571 2572 2565 +3 509 492 2568 +3 2565 2572 497 +3 2578 1557 2570 +3 2574 2573 498 +3 2574 2577 2573 +3 1915 2581 1914 +3 2569 1536 2578 +3 1540 509 1539 +3 1540 1539 2563 +3 2575 2574 498 +3 2574 1541 2577 +3 1541 1957 2577 +3 1541 1543 1957 +3 1732 1543 1541 +3 1537 2569 2580 +3 2581 1916 290 +3 2578 2579 1557 +3 1536 2579 2578 +3 2579 1536 1552 +3 2582 1380 10 +3 2583 2582 10 +3 1396 2583 10 +3 10 2491 1396 +3 2491 1395 1396 +3 440 1380 2585 +3 576 2588 2587 +3 1605 1604 2586 +3 1611 1605 2586 +3 576 2587 2589 +3 599 1607 1606 +3 2587 1612 1611 +3 699 700 572 +3 397 2596 2593 +3 2597 2593 1601 +3 2591 2589 700 +3 2592 2590 2591 +3 2589 2586 700 +3 2589 2587 2586 +3 1611 2586 2587 +3 2591 699 2592 +3 2597 1601 568 +3 2590 2592 571 +3 397 787 786 +3 2595 2596 576 +3 2595 576 2594 +3 397 2593 2597 +3 2594 2591 2590 +3 2595 2594 2590 +3 397 786 2596 +3 1135 398 1134 +3 1179 1134 603 +3 2598 94 788 +3 829 480 2638 +3 2601 1437 1410 +3 215 1686 1685 +3 2605 2606 2604 +3 2108 2612 385 +3 200 31 2605 +3 200 2605 2604 +3 2607 18 2606 +3 1849 2611 196 +3 2609 2608 9 +3 1647 1691 2609 +3 1691 195 2609 +3 2607 194 1848 +3 1647 2609 9 +3 979 978 35 +3 2608 2610 194 +3 2607 2608 194 +3 1691 1692 195 +3 2611 1848 196 +3 2099 2100 358 +3 2613 2614 385 +3 144 2099 2613 +3 359 44 2614 +3 360 44 359 +3 595 771 626 +3 2617 2616 2432 +3 2617 625 2616 +3 2617 624 625 +3 1490 1492 1486 +3 769 2665 2666 +3 769 2621 2665 +3 553 2619 1469 +3 1470 2619 553 +3 2669 2668 417 +3 1400 461 2677 +3 2668 2623 769 +3 460 2622 555 +3 555 2622 556 +3 552 768 1470 +3 1798 1221 2625 +3 2625 1221 715 +3 715 1222 2625 +3 1798 1222 2459 +3 1798 2625 1222 +3 2626 678 1785 +3 678 1786 1785 +3 683 1782 1781 +3 683 1359 2628 +3 1356 589 2628 +3 2592 2634 571 +3 1175 598 1176 +3 644 2627 743 +3 506 1556 1530 +3 781 813 782 +3 1556 506 508 +3 396 787 788 +3 1975 1973 690 +3 2630 569 2635 +3 1603 2633 2629 +3 1975 690 2635 +3 569 1688 2635 +3 2722 2718 2185 +3 1601 2590 2637 +3 2637 2590 571 +3 571 2636 2637 +3 397 2598 788 +3 397 2597 2598 +3 1600 2637 2636 +3 2636 1603 1600 +3 1608 574 570 +3 1104 2639 1101 +3 2718 2722 2184 +3 1920 1099 1921 +3 1101 2639 944 +3 2644 243 2090 +3 816 2642 2641 +3 2354 374 2645 +3 371 2354 2645 +3 53 2645 1253 +3 367 1253 1252 +3 1253 374 1252 +3 374 1253 2645 +3 851 962 2647 +3 1038 2648 850 +3 1038 2257 2648 +3 889 888 2650 +3 889 322 888 +3 146 2658 363 +3 2653 111 889 +3 2652 2655 2656 +3 880 145 2661 +3 2652 300 2655 +3 2652 22 300 +3 363 2657 882 +3 2652 2658 22 +3 2654 304 111 +3 2661 882 2660 +3 2660 881 2661 +3 1465 22 2658 +3 359 145 880 +3 2662 2661 881 +3 883 2662 881 +3 302 2662 883 +3 2664 1737 1736 +3 1748 2664 1736 +3 2664 1748 513 +3 2675 1407 436 +3 515 1734 1733 +3 2677 461 2678 +3 2672 823 2673 +3 1763 2713 2298 +3 941 2667 410 +3 2669 2623 2668 +3 416 941 939 +3 2667 2674 769 +3 2670 414 1402 +3 414 822 1402 +3 1758 1743 2708 +3 2673 2670 417 +3 2672 2673 417 +3 486 1416 1624 +3 823 414 2673 +3 191 1402 2677 +3 2677 1402 2676 +3 1398 2681 1397 +3 1397 2681 1386 +3 1398 2680 2681 +3 2680 1398 1399 +3 2680 436 2681 +3 1664 1386 2681 +3 737 739 309 +3 14 306 308 +3 1001 2357 161 +3 308 307 153 +3 533 2691 2692 +3 2694 2693 531 +3 239 2693 2694 +3 2697 185 1850 +3 526 185 2697 +3 2695 516 239 +3 2695 239 2694 +3 97 2704 274 +3 2704 97 1152 +3 2703 564 1190 +3 1191 2699 2703 +3 923 2710 2711 +3 2715 1741 923 +3 2711 2709 1673 +3 1745 562 2717 +3 1742 2717 2716 +3 2503 2724 2502 +3 2159 2720 2719 +3 991 2720 2159 +3 2720 991 2721 +3 2721 1096 1924 +3 2188 2723 2719 +3 2718 2719 2723 +3 386 2726 1434 +3 2728 808 810 +3 809 808 2730 +3 1666 1549 2733 +3 1026 859 2731 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_concave_hole.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_concave_hole.off new file mode 100644 index 00000000000..c60180fb2fe --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_concave_hole.off @@ -0,0 +1,8299 @@ +OFF +2771 5526 0 +0.262933 0.102269 0.138247 +0.0843142 0.0418575 -0.0419302 +0.0676609 -0.0308717 0.133371 +0.202895 0.468475 0.0802072 +0.113075 -0.465378 -0.0546734 +0.225577 -0.277149 -0.193776 +-0.146525 -0.22403 -0.169286 +-0.0249865 -0.129931 -0.13238 +-0.160965 -0.480027 -0.0707824 +0.0794063 -0.415277 -0.0839096 +0.0469116 -0.050008 0.252355 +-0.0998372 -0.193745 -0.16268 +-0.111131 -0.104825 -0.14166 +-0.061459 -0.0977343 -0.133353 +-0.247783 -0.131539 0.0722694 +-0.145972 -0.486627 -0.0633275 +0.0916759 0.0333604 -0.133002 +-0.184954 -0.325468 -0.133853 +0.0847778 -0.432659 -0.0978527 +-0.210776 -0.299151 0.0751516 +-0.151539 -0.388715 0.01282 +-0.154564 -0.438244 -0.0249412 +-0.123411 -0.0182656 0.0135824 +0.00773278 -0.053391 -0.0428874 +-0.0774524 -0.292395 -0.106335 +0.0201594 -0.263586 0.119859 +-0.105646 -0.0365155 -0.0770751 +-0.113391 -0.41896 -0.0906771 +-0.128213 -0.46259 -0.0994907 +-0.160526 -0.468057 -0.0393445 +0.197609 -0.127492 -0.0574767 +0.0757306 -0.449539 -0.0614557 +0.147148 -0.412461 -0.0801639 +0.103782 -0.333007 0.0288926 +0.108917 -0.401981 -0.00841926 +0.11392 -0.408931 -0.0973654 +0.129733 -0.31331 -0.0672325 +0.0904388 -0.356531 -0.0803906 +0.0359798 -0.255445 -0.113562 +-0.22312 -0.107007 -0.0611904 +-0.163408 -0.433458 -0.0704785 +-0.0915185 -0.473885 -0.0165533 +-0.141417 -0.474418 -0.0834065 +-0.0944539 -0.479454 -0.0663683 +-0.085985 -0.101282 0.158093 +-0.0225438 -0.0889567 -0.0848587 +0.092707 -0.109496 -0.114561 +-0.159213 -0.159272 -0.138793 +-0.24541 -0.230248 -0.110578 +0.183744 -0.231931 0.0176086 +0.294273 -0.0955008 0.116328 +-0.16477 -0.385872 -0.0413331 +-0.185303 -0.313456 -0.00374653 +-0.297084 -0.262835 -0.00415653 +0.167756 -0.128776 0.197921 +-0.0273811 0.0608812 -0.0989637 +0.208303 0.00452459 -0.0746544 +-0.150831 -0.448909 -0.0901866 +-0.0720206 -0.147118 -0.154796 +-0.0197986 -0.210658 -0.154154 +-0.130593 -0.498558 -0.021161 +0.129662 -0.373473 -0.0794411 +-0.120692 -0.481168 -0.0685411 +-0.108692 -0.494274 -0.0429275 +-0.0970902 -0.252938 -0.14843 +-0.0098054 -0.335319 -0.0147292 +0.0769246 -0.410346 -0.0391239 +-0.132409 -0.464154 -0.0197707 +-0.102806 -0.4217 0.00855496 +-0.0760332 -0.34128 0.100617 +-0.104435 -0.377391 0.0553722 +-0.14788 -0.33188 0.0922673 +-0.151409 -0.218926 0.165812 +-0.111518 -0.286925 0.148566 +-0.0458796 -0.210094 0.18627 +0.0439919 -0.147905 0.137964 +-0.0358575 -0.361749 0.0457868 +0.0284346 -0.311464 0.0537885 +0.0409609 -0.0869988 -0.085353 +0.118462 -0.0465078 -0.0483438 +-0.141108 -0.422593 -0.0846889 +-0.129145 -0.379198 -0.0712284 +-0.149426 -0.329507 -0.0473837 +-0.212723 -0.300322 -0.0706413 +-0.156151 -0.403775 -0.0651516 +-0.077704 -0.400019 -0.0437424 +-0.0783601 -0.342543 -0.0687412 +-0.0202922 -0.309739 -0.0758353 +0.0501325 -0.290557 -0.0430839 +0.0954448 -0.256567 0.0733017 +0.144565 -0.158299 0.0913557 +0.0562207 -0.179498 -0.140905 +0.16863 -0.175124 -0.176771 +0.121523 -0.241503 -0.138152 +0.196749 0.136407 0.00365942 +0.14057 0.277481 0.154966 +0.156168 -0.385879 -0.0324162 +-0.146564 -0.288069 -0.168907 +-0.212533 -0.256019 -0.170893 +0.0775241 -0.353084 -0.0221894 +-0.161054 -0.48311 -0.0516067 +-0.151386 -0.488726 -0.0297486 +-0.167299 -0.464731 -0.058517 +-0.167494 -0.44542 -0.0440266 +-0.166175 -0.416312 -0.0405929 +-0.155665 -0.409399 -0.0112037 +-0.130777 -0.428881 -0.00549876 +-0.162855 -0.460869 -0.0783452 +-0.0949104 -0.0628065 -0.118829 +-0.171364 -0.0681205 -0.104606 +-0.189411 -0.0391257 -0.0301772 +-0.201329 -0.0450332 0.0672375 +-0.0621659 -0.0595357 -0.0819357 +-0.0724451 -0.0386843 -0.0212262 +-0.0317016 -0.00827391 0.0812953 +0.125617 -0.445138 -0.086335 +0.16914 -0.45638 -0.0514974 +-0.188699 -0.102786 0.151505 +-0.127982 -0.406882 0.0143939 +-0.130706 -0.384 0.0373578 +-0.17253 -0.34721 0.0442322 +-0.136499 -0.357829 0.0655808 +-0.101729 -0.398953 0.0314689 +-0.06477 -0.393705 0.00175031 +-0.0683606 -0.382507 0.0422398 +-0.0619729 -0.361557 0.0725343 +-0.0129886 -0.329893 0.099078 +-0.0485077 -0.306718 0.14972 +-0.0586671 -0.359537 -0.0297503 +-0.105132 -0.354471 0.0834642 +-0.111953 -0.324339 0.110194 +-0.146952 -0.298663 0.122985 +-0.147935 -0.259899 0.146585 +-0.224685 -0.230598 0.12386 +-0.194785 -0.274899 0.125615 +-0.1144 -0.250007 0.185149 +-0.10665 -0.185071 0.204627 +-0.155805 -0.154327 0.174517 +-0.215755 -0.165279 0.142947 +-0.0743299 -0.277016 0.17853 +-0.0218198 -0.257755 0.16445 +0.000800113 -0.199671 0.138749 +0.0635315 -0.20852 0.111271 +-0.0256804 -0.0569419 0.140514 +-0.0948894 -0.0414189 0.110395 +-0.0705488 -0.0374163 0.0415111 +-0.00760713 -0.0195458 0.0164934 +0.0499878 0.0289775 0.0673286 +0.140466 0.0718009 0.144428 +-0.00188983 0.0792593 -0.003093 +0.0559872 -0.0140882 -0.011506 +-0.227407 -0.0888195 0.0117762 +-0.273528 -0.167121 -0.0102922 +-0.0402782 -0.263586 -0.140793 +-0.137564 -0.296782 -0.109847 +-0.166109 -0.381665 -0.0120175 +-0.16983 -0.360755 0.0137933 +-0.16456 -0.354211 -0.0308766 +-0.185156 -0.334386 0.0190529 +-0.207978 -0.298552 0.0310885 +-0.252507 -0.243462 0.0511336 +-0.223388 -0.268692 -0.019703 +-0.193938 -0.322649 0.048456 +-0.175095 -0.332532 0.0736524 +-0.176111 -0.310734 0.103586 +-0.147337 -0.494175 -0.0467278 +-0.129359 -0.490613 -0.0537016 +-0.148829 -0.364106 -0.0543963 +-0.120087 -0.343197 -0.0662243 +-0.130345 -0.305692 -0.0722136 +-0.171529 -0.299424 -0.0833938 +-0.181343 -0.292949 -0.0416997 +0.207831 -0.217496 -0.0966998 +0.180453 0.174523 0.151623 +0.0997558 -0.44202 -0.0211251 +0.141829 -0.427452 -0.0246256 +0.231902 -0.0518172 0.0262484 +0.222165 -0.00765217 0.131632 +0.257605 0.0468554 0.0496674 +0.134457 -0.362329 0.00455646 +0.162364 -0.298449 0.0119315 +0.167632 -0.334853 -0.0258239 +0.166781 -0.258058 -0.0451734 +0.196618 -0.203737 -0.0367216 +0.204966 -0.148702 0.029823 +0.188775 -0.0899398 0.0842549 +0.118735 -0.0897053 0.120666 +0.108518 -0.0623755 0.19827 +0.0943505 -0.134977 0.262277 +0.0987744 0.0186293 0.19077 +0.164162 -0.016078 0.17849 +0.217401 -0.0732307 0.174029 +0.244384 -0.159022 0.158735 +0.0938974 -0.414078 -0.0986619 +0.0882094 -0.386204 -0.0874415 +0.110237 -0.433985 -0.106491 +0.0752909 -0.377302 -0.0545033 +0.136893 -0.424401 -0.103861 +0.101623 -0.446793 -0.0879738 +0.0803589 -0.447974 -0.0828166 +0.0955794 -0.458697 -0.0690652 +0.0852254 -0.472952 -0.043714 +0.0423481 -0.131534 -0.117698 +0.0102534 -0.163639 -0.135844 +-0.0294235 -0.16777 -0.154302 +-0.0581903 -0.19678 -0.162941 +-0.0495263 -0.23206 -0.157295 +0.0213258 -0.204668 -0.142847 +0.0591534 -0.221375 -0.128414 +0.094939 -0.204956 -0.158559 +0.102368 -0.149902 -0.152017 +0.161838 -0.127189 -0.119413 +0.0883157 -0.255475 -0.0965547 +0.00337956 -0.243572 -0.138992 +-0.00441584 -0.28038 -0.109802 +0.139454 -0.244447 -0.0884262 +0.17799 -0.253819 -0.13106 +0.239512 -0.249475 -0.139746 +0.239769 -0.199663 -0.201225 +0.139899 -0.220537 -0.184787 +0.188104 -0.214287 -0.208834 +0.241446 -0.186766 -0.139849 +0.209446 -0.161297 -0.101029 +-0.199048 -0.317265 -0.100601 +-0.293252 -0.31357 -0.122798 +-0.243299 -0.355691 -0.130502 +-0.247594 -0.319033 -0.0988683 +-0.291668 -0.287409 -0.0637038 +-0.248832 -0.272185 -0.0865389 +-0.259174 -0.220646 -0.0469428 +-0.282126 -0.263379 -0.124759 +-0.269731 -0.294935 -0.18724 +-0.247297 -0.165961 -0.0866554 +0.0601914 -0.0464014 -0.0549033 +-0.211085 -0.18579 -0.128927 +-0.200721 -0.132547 -0.108259 +-0.0634953 -0.15489 0.179525 +0.153912 -0.0887253 -0.0733484 +0.185145 -0.0471144 -0.0260532 +0.211443 0.0144377 0.0032337 +0.139575 0.0029693 0.000737671 +0.166751 0.0710484 -0.0323169 +0.107842 0.107181 0.0410238 +0.241648 0.0800111 -0.0150955 +-0.140262 -0.4992 -0.033581 +-0.123763 -0.497978 -0.0364981 +-0.108133 -0.495253 -0.0202341 +-0.1219 -0.481038 -0.0158085 +-0.110456 -0.461331 -0.014079 +-0.087635 -0.441699 -0.0445804 +-0.0916102 -0.451765 -0.0239283 +-0.0811529 -0.421697 -0.020421 +-0.0723115 -0.470105 -0.0423155 +-0.102577 -0.44033 -0.0062072 +-0.139118 -0.480546 -0.0199347 +-0.149266 -0.466768 -0.0254061 +0.222317 -0.0925366 -0.0161067 +-0.0417433 -0.361447 0.00632817 +-0.00965295 -0.347119 0.0218202 +0.0216724 -0.318231 0.010836 +-0.00474667 -0.341486 0.0613973 +0.0698488 -0.285166 0.0205835 +-0.108371 -0.29389 -0.0941984 +-0.11094 -0.279255 -0.127432 +-0.0852691 -0.31423 -0.083395 +-0.0516331 -0.309713 -0.0908278 +-0.0463843 -0.329032 -0.0615785 +-0.13427 -0.295211 -0.140976 +-0.16029 -0.312528 -0.151535 +-0.208046 -0.313472 -0.188061 +-0.177638 -0.29982 -0.178676 +-0.173332 -0.259819 -0.179118 +-0.186949 -0.225139 -0.161631 +-0.121077 -0.271737 -0.158365 +-0.222098 -0.229029 -0.143015 +-0.254895 -0.254361 -0.158387 +-0.119307 -0.241249 -0.168619 +-0.0940058 -0.224454 -0.161034 +-0.119452 -0.213541 -0.164903 +-0.133444 -0.181194 -0.153714 +-0.123212 -0.142937 -0.146434 +-0.154852 -0.114002 -0.127562 +-0.16919 -0.193253 -0.151916 +-0.202578 -0.281459 -0.18846 +-0.238459 -0.276537 -0.185897 +-0.240282 -0.308392 -0.197824 +-0.31592 -0.411023 -0.222975 +-0.28556 -0.354091 -0.210885 +-0.235315 -0.349789 -0.176342 +-0.247249 -0.413591 -0.205119 +-0.313616 -0.39085 -0.145549 +-0.265064 -0.38952 -0.162643 +-0.137308 -0.0765217 -0.126585 +-0.138269 -0.043252 -0.101811 +-0.149787 -0.024537 -0.0569204 +-0.190238 -0.325155 -0.164883 +-0.214126 -0.342005 -0.145019 +-0.11169 -0.0249744 -0.0351987 +-0.154494 -0.0206052 -0.0150451 +-0.170024 -0.0235376 0.033341 +-0.149964 -0.0212297 0.0915499 +-0.146292 -0.0570396 0.143171 +-0.204533 -0.050976 0.0222898 +-0.222839 -0.0748301 0.0497298 +-0.218112 -0.0836084 0.106186 +-0.241131 -0.10804 0.0423425 +-0.253857 -0.126023 0.000914005 +-0.268045 -0.155579 0.0359862 +-0.254096 -0.191499 0.0837602 +-0.284127 -0.206805 0.0257642 +-0.255388 -0.139415 -0.0455141 +-0.266486 -0.179542 -0.0496151 +-0.255448 -0.200689 -0.0776309 +-0.238672 -0.192995 -0.107883 +-0.225097 -0.163824 -0.109937 +-0.22995 -0.135947 -0.0896828 +-0.209528 -0.114818 -0.0862766 +-0.197715 -0.0771741 -0.074156 +-0.18152 -0.102481 -0.104911 +-0.212552 -0.0754645 -0.0336012 +-0.179069 -0.0426745 -0.0757348 +-0.191113 -0.0400122 0.118805 +0.0761558 -0.344791 -0.0536197 +0.0734921 -0.316433 -0.0291825 +0.0865869 -0.298841 -0.0691012 +0.0805876 -0.328744 0.0029047 +0.0952029 -0.361348 0.00820626 +0.11906 -0.273469 -0.0673767 +0.0841053 -0.310717 0.0264162 +0.125408 -0.292597 0.041066 +0.0878905 -0.285295 0.052224 +0.0491288 -0.272854 0.0806291 +0.143869 -0.242882 0.0528378 +0.117789 -0.207199 0.0870858 +0.169353 -0.193132 0.0552639 +0.0969256 -0.166289 0.115505 +0.054006 -0.288058 0.0505697 +0.0199581 -0.301066 0.0971587 +-0.00766116 -0.296894 0.132807 +0.0766599 -0.302889 0.00259846 +0.0459981 -0.299327 0.00649094 +0.0275534 -0.307808 -0.0222832 +0.0149271 -0.300169 -0.0594622 +0.0407712 -0.276916 -0.0798141 +0.0598138 -0.291021 -0.0166231 +0.105499 -0.310063 0.042044 +0.129965 -0.318676 0.0271739 +-0.0843085 -0.494264 -0.0321529 +-0.0752323 -0.238787 0.196776 +-0.295928 -0.43397 -0.176216 +0.0851801 -0.382062 -0.0130588 +0.0187394 -0.0952484 0.145146 +0.0700063 -0.10227 0.135872 +0.0221841 -0.0461712 0.144279 +0.0234739 0.0145751 0.123876 +-0.00955997 -0.0145334 0.135796 +-0.0455413 -0.0274983 0.116817 +-0.0630042 -0.0646849 0.123712 +-0.0996182 -0.0685448 0.139479 +-0.129134 -0.0937854 0.159793 +-0.0586283 -0.0384282 0.0801443 +-0.0976008 -0.0306336 0.0712047 +-0.187313 -0.236737 0.146886 +-0.186919 -0.194456 0.158247 +-0.276732 -0.200888 -0.0224537 +-0.291326 -0.23573 -0.0313163 +-0.262172 -0.26119 -0.0228289 +-0.244304 -0.258186 0.0138536 +-0.238049 -0.253808 -0.053252 +-0.278468 -0.245353 0.0237178 +-0.250374 -0.233381 -0.0762153 +-0.317786 -0.266287 -0.0397057 +-0.29694 -0.227134 0.00135872 +-0.28761 -0.282597 -0.0302299 +-0.0768305 -0.203891 0.202176 +-0.107975 -0.220055 0.202264 +-0.134773 -0.20066 0.190676 +-0.13214 -0.167949 0.192848 +-0.157713 -0.187173 0.17141 +-0.0792541 -0.17391 0.197354 +-0.103166 -0.157466 0.196315 +-0.0861693 -0.139966 0.183699 +-0.0642112 -0.126048 0.16286 +-0.0525585 -0.0978366 0.139755 +0.173523 -0.0454835 0.124705 +0.124762 -0.0100876 0.132612 +0.0801162 0.0231847 0.117816 +0.0903158 0.0691509 0.0824377 +0.111706 0.138719 0.113497 +0.109897 0.0476799 0.0291314 +0.0568194 0.0789592 0.018431 +0.166721 0.186565 0.0672199 +0.252858 0.160254 0.0700128 +0.103948 0.0891733 -0.0142249 +0.151331 0.103958 0.00831307 +0.156258 0.148984 0.0332697 +0.195526 0.176469 0.0301312 +0.246249 0.159404 0.0147221 +0.272985 0.107792 0.0403664 +0.220496 0.208803 0.0718273 +0.172006 0.242405 0.105809 +0.284857 0.213191 0.163319 +0.220004 0.262975 0.168971 +0.243752 0.187223 0.124992 +0.303317 0.156118 0.132187 +0.124557 0.160014 0.070217 +0.145476 0.178627 0.113721 +0.143822 0.145597 0.146983 +0.199699 0.112576 0.148784 +0.221259 0.0552492 0.134196 +0.124553 0.109697 0.139987 +0.100062 0.0751807 0.125633 +0.107686 0.0453443 0.15701 +0.152453 0.0251604 0.154394 +0.160741 0.1045 0.158385 +0.183054 0.0708926 0.1447 +0.188656 0.0314673 0.13741 +0.286002 0.0789154 0.0896861 +0.044874 0.0868553 -0.0397086 +0.0292084 0.0351428 -0.0773123 +-0.00652383 0.0868322 -0.0563984 +0.153395 -0.330946 0.00521793 +0.165687 0.227811 0.159326 +0.176713 -0.253714 -0.180764 +0.276141 0.126578 0.0974557 +-0.0329659 -0.0648403 -0.0508016 +-0.022748 -0.0460692 -0.0136176 +-0.0397109 -0.0394184 0.0195973 +0.00993129 -0.0278328 -0.0155697 +0.0270531 -0.00832198 0.0106523 +0.0103826 0.00500549 0.0538795 +0.0666135 0.0125544 0.0261568 +0.103369 0.00889595 0.155654 +0.11659 -0.0298082 0.170544 +0.153029 -0.0696813 0.168481 +0.113461 -0.0186162 0.216944 +0.10035 -0.0580327 0.251516 +0.150235 -0.084971 0.233939 +0.0675669 -0.0946043 0.253879 +0.0719166 -0.0391569 0.214813 +0.10687 -0.103697 0.22877 +0.136543 -0.144876 0.235107 +0.147147 -0.0351617 0.149371 +0.1197 -0.0491892 0.122959 +0.148505 -0.0696344 0.112799 +0.152678 -0.114026 0.101195 +0.181641 -0.136376 0.0700095 +0.177794 -0.0667748 0.102185 +0.219377 -0.0856118 0.124697 +0.231869 -0.0572983 0.0801841 +0.250938 -0.00881912 0.0578761 +0.198815 -0.0628459 0.124187 +0.177363 -0.0676828 0.147605 +0.177944 -0.101552 0.169756 +0.213844 -0.114113 0.199683 +0.250347 -0.109904 0.165803 +0.259893 -0.130195 0.122038 +0.180633 -0.0723966 0.203599 +0.114076 -0.0955963 0.272717 +0.201886 -0.0333539 0.161782 +0.240288 -0.0485439 0.141813 +0.261312 -0.0227503 0.104643 +0.273982 -0.0593402 0.119899 +0.280362 -0.074792 0.0701015 +0.238595 0.0177583 0.0951404 +0.14643 -0.0478943 0.212489 +-0.227331 -0.265687 0.0979085 +-0.244646 -0.230401 0.0887962 +-0.293688 -0.268968 -0.164669 +-0.297979 -0.308788 -0.162348 +-0.312868 -0.346598 -0.144794 +-0.344082 -0.367401 -0.192127 +-0.317302 -0.337357 -0.184462 +-0.280828 -0.350074 -0.123607 +0.105148 0.105807 0.112878 +0.112708 0.122082 0.0774818 +0.133565 0.128779 0.0503619 +-0.153371 -0.370618 0.0324641 +0.254239 -0.0926281 0.0998171 +-0.0128437 0.0136567 0.10826 +0.0175667 0.0217155 0.0871281 +0.0477136 0.0340255 0.104217 +0.0750182 0.0489044 0.100742 +0.0776037 0.0433948 0.0700673 +0.0973389 0.0603657 0.0539823 +0.0861821 0.0686274 0.0252903 +0.0735784 0.0589072 -0.0094551 +0.0829016 0.102631 0.0164944 +0.0811061 0.0911963 0.0569078 +0.0940457 0.0476479 0.121838 +0.105428 0.0231317 0.131003 +0.0916425 -0.00738665 0.126455 +0.0604145 5.34629e-05 0.128347 +0.10359 0.0595398 0.00049955 +0.144344 0.0457444 0.00327488 +0.122523 0.0419513 -0.0300499 +0.11811 0.0162342 -0.0830375 +0.170091 0.0155571 -0.145681 +0.138389 0.0626357 -0.0743287 +0.165069 0.0235027 -0.0532363 +0.177768 0.0409007 -0.100742 +0.136707 0.0380317 -0.122381 +0.124141 0.00775387 -0.157586 +0.154959 -0.000810753 -0.105169 +0.105591 0.0562623 -0.100272 +0.0594242 0.0548004 -0.106957 +0.201162 -0.0168583 -0.120783 +0.0976411 0.0972697 0.0801317 +0.0943337 0.0848541 0.102457 +0.0890479 0.0650811 0.109825 +0.0389773 0.0745551 -0.0779593 +0.0138551 0.0593589 -0.108474 +0.0773146 0.0765993 -0.0629692 +0.118409 0.00125651 -0.11931 +0.14578 -0.0101392 -0.137264 +0.178622 -0.0192175 -0.148664 +0.15461 0.0388676 -0.0266866 +0.193622 0.0322602 -0.0272748 +0.1942 0.050466 -0.0642106 +0.173634 0.0303747 -0.00069076 +0.179101 -0.0110744 -0.00523936 +0.230507 0.0422098 -0.0173425 +0.202418 0.070871 -0.0135348 +0.22302 0.0184239 -0.0441485 +0.215157 -0.0248187 0.00288885 +0.233855 -0.00344678 0.0259658 +0.238719 0.033163 0.0205233 +0.25481 0.0672767 0.0179763 +0.222129 -0.0581209 -0.00731524 +0.227145 -0.0819987 0.0145053 +0.219253 -0.118982 0.0109807 +0.211654 -0.158762 -0.0192499 +0.210611 -0.101269 0.0490966 +0.200451 -0.190104 0.0116714 +0.203938 -0.0712158 -0.0282028 +0.173774 -0.0735362 -0.0475631 +0.2027 -0.10102 -0.0400541 +0.212795 -0.129107 -0.0298945 +0.206091 -0.151217 -0.0455168 +0.202467 -0.150775 -0.0745887 +0.209378 -0.187531 -0.0743719 +0.181149 -0.126003 -0.0892617 +0.205972 -0.177843 -0.0383337 +0.188301 -0.142819 -0.114464 +0.208779 -0.164491 -0.140437 +0.171227 -0.151151 -0.147387 +0.136617 -0.138704 -0.143839 +0.131975 -0.166643 -0.169617 +0.128263 -0.113939 -0.11894 +0.116875 -0.0858965 -0.091059 +0.0786764 -0.0829677 -0.090746 +0.187859 -0.214057 -0.0686071 +0.175679 -0.237132 -0.0957975 +0.178163 -0.10588 -0.0665832 +0.269129 0.0763722 0.0451229 +0.27889 0.058723 0.0679827 +0.267652 0.0453551 0.105512 +0.2613 0.0363273 0.0775663 +0.250278 0.0199214 0.0566543 +0.250269 0.00638094 0.0769677 +0.262967 -0.0160504 0.0796628 +0.285344 -0.0433845 0.0872574 +0.24971 -0.0386027 0.0640826 +0.229012 -0.0528564 0.0533874 +0.210073 -0.0746435 0.0657137 +0.221889 -0.0775407 0.0410909 +0.302572 -0.0710887 0.0949218 +0.236871 -0.0290995 0.0413907 +0.21774 0.0486965 -0.0445342 +0.224846 0.0339602 -0.0740774 +0.244042 0.0044793 -0.10874 +0.254336 0.102378 0.0100739 +0.220262 0.108437 -0.00385435 +0.184431 0.103867 -0.0063665 +0.227766 0.138272 0.00117268 +0.21603 0.168687 0.00560537 +0.214962 0.252952 4.36931e-05 +0.24674 0.211475 0.00674743 +0.208103 0.206716 0.00898043 +0.198252 0.239152 0.0425261 +0.241235 0.183275 -0.00372162 +0.24846 0.187657 0.0253371 +0.236173 0.217937 0.0406376 +0.208251 0.202717 0.0430183 +0.190765 0.204953 0.0676283 +0.199822 0.228771 0.0907818 +0.212055 0.262964 0.121847 +0.167888 0.20936 0.0941323 +0.230768 0.216285 0.106419 +0.226441 0.220307 0.1523 +0.160904 0.217518 0.126833 +0.151535 0.251202 0.133586 +0.158786 0.306935 0.0984538 +0.193903 0.396086 0.195106 +0.119767 0.364922 0.154966 +0.158434 0.284691 0.125614 +0.188265 0.327264 0.175224 +0.139712 0.323472 0.144742 +0.247398 0.226772 0.208026 +0.162628 0.357991 0.158091 +0.132463 0.334186 0.215838 +0.184892 0.418747 0.128073 +0.148158 0.405567 0.1589 +0.116952 0.392105 0.208798 +0.128904 0.307582 0.18276 +0.173163 0.280669 0.197839 +0.237808 0.190239 0.0542196 +0.242415 0.187695 0.0885314 +0.257589 0.159811 0.105872 +0.25799 0.149475 0.1552 +0.249199 0.167605 0.0439231 +0.270589 0.141138 0.0478035 +0.291007 0.120776 0.0668204 +0.27986 0.0943457 0.0648346 +0.262028 0.128688 0.0220064 +0.283888 0.104244 0.08796 +0.278117 0.09277 0.114653 +0.296211 0.119268 0.134225 +0.25745 0.0686993 0.129638 +0.231499 0.0874258 0.144645 +0.23624 0.121986 0.150481 +0.21822 0.158716 0.152133 +0.276736 0.0681718 0.110294 +0.286087 0.0545245 0.0921962 +0.114064 0.342002 0.184102 +0.184346 0.361594 0.187357 +0.161147 0.378013 0.229421 +0.186402 0.32651 0.232026 +0.224199 0.278314 0.231623 +0.178684 0.387524 0.165454 +0.207571 0.416517 0.162223 +0.115261 0.360345 0.210089 +0.111327 0.375408 0.183082 +0.123148 0.405595 0.17979 +0.161317 0.441861 0.200022 +0.134075 0.42215 0.208124 +0.166581 0.413272 0.221996 +0.184888 0.467555 0.155941 +0.139501 0.435526 0.173911 +0.158717 0.435906 0.144337 +0.167498 0.45215 0.103084 +0.137763 0.359978 0.22921 +0.165611 0.348074 0.227085 +0.15984 0.318857 0.217125 +0.185554 0.304169 0.211919 +0.205103 0.278784 0.204981 +0.244841 0.279219 0.196675 +0.226891 0.25345 0.209087 +0.216714 0.31142 0.225032 +0.18164 0.33693 0.20427 +0.203702 0.303717 0.18726 +0.193627 0.296232 0.146589 +0.191637 0.257284 0.18429 +0.157803 0.257523 0.177293 +0.175634 0.311565 0.125155 +0.161107 0.457828 0.173386 +0.194169 0.447882 0.185268 +0.194408 0.477711 0.118315 +0.219599 0.449898 0.13857 +0.135294 0.387364 0.228733 +0.145147 0.282789 0.187345 +0.143956 0.303159 0.203618 +0.177446 0.366384 0.212315 +0.179329 0.391491 0.217312 +0.18672 0.412483 0.210145 +0.202606 0.421792 0.189409 +0.174085 0.42914 0.210627 +0.153641 0.426813 0.21312 +0.144424 0.408706 0.223131 +0.190464 0.428693 0.201747 +0.178837 0.441581 0.19921 +0.169704 0.452082 0.187978 +0.180705 0.459908 0.173619 +0.202088 0.458198 0.166952 +0.151672 0.449754 0.186725 +0.142475 0.436806 0.198199 +0.127991 0.425256 0.188222 +0.210178 0.437176 0.172385 +0.119636 0.410278 0.199562 +0.206557 0.46857 0.145869 +0.215386 0.468035 0.123827 +0.207969 0.436894 0.106764 +0.212477 0.477963 0.10116 +0.128023 0.4054 0.215288 +0.223073 0.454408 0.0921651 +0.184017 0.321535 0.149004 +0.164058 0.339436 0.133054 +0.141763 0.356765 0.138374 +0.138767 0.331395 0.111494 +0.18387 0.5 0.0894472 +0.178253 0.341112 0.15974 +0.158692 0.397227 0.229447 +0.261987 0.258572 0.22454 +0.209557 0.191204 0.156985 +0.19703 0.220129 0.168363 +0.114158 0.395299 0.191384 +0.237163 0.239354 0.0176536 +0.22873 0.228755 -0.0079498 +0.204237 0.229854 -0.000985107 +0.191898 0.248869 0.0164149 +0.195144 0.299533 0.0501168 +0.211408 0.277777 0.0261684 +0.181525 0.269092 0.042102 +0.232338 -0.0296485 0.018274 +0.220704 0.448894 0.117889 +0.211836 0.430361 0.128709 +0.200007 0.22745 0.0221073 +0.206622 0.221816 0.0395427 +0.223655 0.239447 0.0484776 +0.206846 0.263872 0.061817 +0.192412 0.289403 0.0880222 +0.200823 -0.0669613 0.089238 +0.1998 0.487191 0.0879627 +0.178418 0.478766 0.0726805 +0.171907 0.478 0.098484 +0.179607 0.4432 0.070784 +0.215421 0.44036 0.0572748 +0.206111 0.438517 0.081171 +0.184196 0.432818 0.0953164 +0.172787 0.433405 0.115219 +0.16681 0.454422 0.128591 +0.158037 0.463512 0.080819 +0.300027 -0.106441 0.0798503 +0.301565 -0.138608 0.110073 +0.223785 -0.0676095 0.104371 +0.244386 -0.0720528 0.0937201 +0.25624 -0.0594904 0.0758547 +0.271472 -0.0437947 0.0690266 +0.283677 -0.0568988 0.0744319 +0.294284 -0.0698767 0.0795338 +0.293906 -0.0887216 0.0736412 +0.275743 -0.101071 0.0877101 +0.309738 -0.0894098 0.0874741 +0.287014 -0.123527 0.0945964 +0.311125 -0.118131 0.0991123 +0.298899 -0.117613 0.118193 +0.276193 -0.109289 0.135451 +0.270493 -0.137621 0.153632 +0.286312 -0.136798 0.132025 +0.257826 -0.0797919 0.144654 +0.303792 -0.0864306 0.104131 +0.28817 -0.0747287 0.113826 +0.276632 -0.0878111 0.128274 +0.30695 -0.103289 0.107245 +0.287682 -0.0559229 0.10414 +0.272738 -0.0407993 0.108633 +0.253435 -0.0365139 0.124117 +0.295415 -0.0573592 0.0898843 +0.270105 -0.0629299 0.0693418 +0.263375 -0.0783235 0.0820667 +-0.216962 -0.20051 0.140681 +-0.236047 -0.180496 0.115013 +-0.230292 -0.136771 0.112494 +-0.247625 -0.159292 0.0914591 +-0.209896 -0.129892 0.141237 +0.222682 0.288177 0.190351 +0.233778 0.296853 0.212089 +0.209365 0.287061 0.167624 +0.208618 0.271128 0.146657 +0.223776 0.247151 0.14266 +0.250594 0.280585 0.221005 +0.215525 0.238928 0.164607 +0.248724 0.243405 0.176599 +0.282927 0.23674 0.194658 +0.253819 0.208937 0.178714 +0.265424 0.184312 0.155732 +0.308614 0.169998 0.183237 +0.273365 0.179729 0.192265 +0.265912 0.204786 0.204674 +0.300509 0.203464 0.194384 +0.281969 0.151677 0.177526 +0.279246 0.127373 0.158699 +0.31079 0.143896 0.162421 +0.30954 0.171009 0.155179 +0.288086 0.1804 0.137744 +0.264265 0.175268 0.132545 +0.241184 0.168571 0.143536 +0.282052 0.162312 0.123541 +0.290218 0.138764 0.11928 +0.232003 0.191432 0.146429 +0.237199 0.211128 0.131059 +0.175486 0.13591 0.157401 +0.244193 0.0453066 0.121153 +0.216838 0.0295154 0.115567 +0.0778181 0.0182774 -0.0959304 +0.132697 0.385267 0.165833 +0.155812 0.38306 0.160495 +-0.00373338 0.0386319 -0.0871428 +0.0052284 0.0508015 -0.0521262 +-0.0272532 0.0521944 -0.0650671 +-0.0417118 0.0760468 -0.0274796 +0.0432101 0.0478592 -0.0430105 +0.0360437 0.064037 -0.0095129 +0.0264403 0.0878588 0.0105855 +0.0200841 0.0963175 -0.0204482 +0.0508265 0.0939603 -0.0091335 +0.0753367 0.087282 -0.0290458 +-0.0114666 0.0989277 -0.0268583 +0.189464 0.426182 0.111762 +-0.04038 -0.0265907 0.0536548 +0.188037 0.19051 0.048384 +0.170897 0.170857 0.0404072 +0.180803 0.154042 0.0195245 +0.168583 0.128396 0.0100026 +0.150344 0.161847 0.0580756 +0.146195 0.173828 0.0846654 +0.123104 0.163389 0.100752 +0.131952 0.158423 0.126057 +0.154039 0.169296 0.137953 +0.163282 0.191526 0.127822 +0.170691 0.206066 0.147249 +0.123979 0.136658 0.135 +0.136161 0.125537 0.148878 +0.153818 0.131557 0.161379 +0.111897 0.12133 0.126074 +0.111889 0.144276 0.0890707 +0.11658 0.140768 0.0690434 +0.119959 0.124948 0.0613596 +0.107779 0.107117 0.0626571 +0.122618 0.115267 0.0466942 +0.127454 0.104238 0.0219653 +0.136258 0.119892 0.0320023 +0.129073 0.0915077 -0.00265103 +0.130797 0.0780035 -0.0369633 +0.10768 0.094992 0.00979378 +0.163926 0.154671 0.152149 +0.0894836 0.0909923 0.00058556 +0.0689505 0.0963924 0.00171312 +0.0612997 0.100634 0.0224348 +0.0675451 0.0846698 0.038694 +0.0795109 0.103357 0.0384133 +0.0848094 0.0754581 0.0444653 +0.110567 0.10366 0.130086 +0.12281 0.0864143 0.139975 +0.117855 0.062854 0.143513 +0.13666 0.0472165 0.155281 +0.128164 0.0235742 0.176647 +0.163067 0.0498951 0.143567 +0.143932 0.0949004 0.145284 +0.179917 0.317727 0.0742859 +0.183725 0.275085 0.0676723 +0.16838 0.29297 0.0787056 +0.0930951 0.102542 0.05002 +0.100339 0.0681106 0.0373411 +0.102886 0.0622715 0.0197467 +0.121511 0.0540863 0.0117598 +0.124719 0.0242285 0.0166428 +0.0967861 -0.00310471 -0.0020113 +0.12138 0.0519179 -0.0102922 +0.0990646 0.0492208 -0.022422 +0.0873807 -0.0275369 -0.03209 +0.200694 -0.191636 -0.0546067 +0.206298 -0.170055 -0.0598788 +0.209964 -0.168421 -0.0791806 +0.221182 -0.183261 -0.0963771 +0.222775 -0.172837 -0.120159 +0.235715 -0.195921 -0.115182 +0.253933 -0.218526 -0.134037 +0.311213 -0.253911 -0.191866 +0.279294 -0.244732 -0.16099 +0.266185 -0.201338 -0.169529 +0.285572 -0.216415 -0.213382 +0.273765 -0.285731 -0.187819 +0.259679 -0.265381 -0.248632 +0.24894 -0.227823 -0.231771 +0.232153 -0.25966 -0.225227 +0.254118 -0.290735 -0.220386 +0.336364 -0.328047 -0.241676 +0.281317 -0.319577 -0.26697 +0.295033 -0.317038 -0.218433 +0.327766 -0.263669 -0.27537 +0.320681 -0.238904 -0.235706 +0.333487 -0.28367 -0.222752 +0.25789 -0.299076 -0.25318 +0.280382 -0.278404 -0.287734 +0.262726 -0.334272 -0.234674 +0.315714 -0.303377 -0.28762 +0.358898 -0.298323 -0.270079 +0.292961 -0.250812 -0.263064 +0.260427 0.269097 0.206442 +0.273912 0.251948 0.207483 +0.274266 0.226866 0.218876 +0.254508 0.262332 0.186312 +0.268737 0.247011 0.182676 +0.278883 0.230014 0.174886 +0.292676 0.216891 0.181537 +0.301666 0.196568 0.170643 +0.235991 0.25839 0.179999 +0.216996 0.262302 0.191107 +0.233602 0.240223 0.192553 +0.26623 0.217767 0.166603 +0.291208 0.219735 0.206357 +0.285626 0.200003 0.208179 +0.295054 0.181857 0.198439 +-0.119559 -0.0454446 0.130205 +-0.148541 -0.0288065 0.124554 +-0.122421 -0.0280036 0.104512 +-0.169628 -0.0428483 0.136658 +-0.192691 -0.0700149 0.138018 +-0.165949 -0.0805689 0.151606 +-0.157867 -0.111652 0.162619 +-0.182289 -0.134815 0.160033 +-0.171616 -0.0265274 0.119564 +-0.182821 -0.0294707 0.089096 +-0.207158 -0.0941133 0.130893 +-0.0813687 -0.408143 0.0168626 +-0.0493082 -0.255289 0.183439 +-0.0417823 -0.281988 0.16825 +-0.0232624 -0.242141 -0.150317 +0.237084 0.148575 0.150278 +0.21825 0.135883 0.152701 +0.196547 0.147262 0.152063 +0.248839 0.134889 0.149793 +0.25417 0.116897 0.146677 +0.154738 -0.248351 -0.113516 +0.149894 -0.252291 -0.14374 +0.127807 -0.247316 -0.112579 +0.100037 -0.239188 -0.118127 +0.171952 -0.258325 -0.155783 +0.206243 -0.267544 -0.164319 +0.152779 -0.244265 -0.170212 +0.238869 -0.271194 -0.164355 +0.19948 -0.240785 -0.114164 +0.228533 -0.228656 -0.117975 +0.0806348 -0.448964 -0.0364622 +0.092817 -0.46403 -0.0236687 +0.131465 -0.464547 -0.0186627 +0.111576 -0.45856 -0.0162136 +0.12236 -0.437795 -0.0167687 +0.116113 -0.473014 -0.0333379 +0.141834 -0.466374 -0.0462667 +0.15629 -0.45187 -0.0265272 +0.162053 -0.430562 -0.0436087 +0.170805 -0.433786 -0.074571 +0.150694 -0.440322 -0.089161 +0.142403 -0.453672 -0.0687084 +0.20922 0.0225383 -0.118012 +0.245897 0.00269769 -0.0710137 +-0.0868896 -0.445579 -0.0827631 +-0.0899978 -0.418668 -0.0662628 +-0.0919895 -0.382051 -0.0731611 +-0.286076 -0.18977 0.00251657 +0.166397 -0.235956 -0.0665238 +0.18289 -0.231659 -0.0402536 +0.183601 -0.256036 -0.0114407 +0.19304 -0.222737 -0.0114233 +0.168396 -0.264129 0.0198747 +0.175145 -0.292863 -0.0261367 +0.159612 -0.311932 -0.0502102 +0.151795 -0.349231 -0.058414 +0.168467 0.120276 0.165442 +0.179322 0.109989 0.151163 +0.191745 0.091503 0.1476 +0.207409 0.0731218 0.143583 +0.170472 0.088013 0.148441 +0.198308 0.0526608 0.137187 +-0.288444 -0.322548 -0.196751 +-0.258254 -0.336596 -0.201797 +-0.260706 -0.370334 -0.191889 +-0.262012 -0.38355 -0.234182 +0.169409 0.331718 0.106522 +-0.0883279 -0.427369 -0.00320489 +-0.0757242 -0.410706 -0.00350047 +-0.0694098 -0.396348 -0.0215868 +-0.339105 -0.28249 -0.133907 +0.14338 -0.190029 -0.185968 +0.113197 -0.189729 -0.178573 +0.161752 -0.208101 -0.1989 +0.163143 -0.233988 -0.192556 +0.187542 -0.24244 -0.20457 +0.214342 -0.231174 -0.221761 +0.200695 -0.263551 -0.191549 +0.0888974 -0.174918 -0.165344 +0.0728578 -0.155488 -0.148655 +0.0857975 -0.13271 -0.133069 +0.0496654 -0.153477 -0.133288 +0.208417 -0.252602 -0.211864 +0.214499 -0.20684 -0.209109 +0.212326 -0.182246 -0.176825 +0.196622 -0.193456 -0.194925 +-0.0366034 0.0848157 -0.0747335 +-0.0106036 0.0767347 -0.0825468 +-0.248014 -0.143811 -0.0711582 +0.156176 -0.353723 -0.00967102 +0.161881 -0.35946 -0.0354879 +0.154192 -0.374021 -0.054565 +0.153835 -0.401954 -0.0551512 +0.147106 -0.376782 -0.0111704 +0.141013 -0.401853 -0.0175381 +0.127378 -0.38782 -0.00428773 +0.152558 -0.410563 -0.0345712 +0.144573 -0.387551 -0.0699167 +0.129797 -0.395951 -0.0860393 +0.110844 -0.383365 -0.0877166 +0.111358 -0.362136 -0.0828181 +0.10863 -0.332992 -0.0757964 +0.131091 -0.348484 -0.0736181 +0.114528 -0.372564 0.00601769 +0.116893 -0.350867 0.0177725 +0.143657 -0.369483 -0.0686154 +0.0433039 -0.239647 0.0998892 +-0.318832 -0.357055 -0.211401 +-0.299837 -0.377374 -0.238049 +-0.340344 -0.383626 -0.224893 +-0.356366 -0.419986 -0.188103 +-0.285529 -0.404192 -0.228972 +-0.356375 -0.393121 -0.201407 +-0.349321 -0.392013 -0.165399 +-0.328811 -0.42272 -0.163607 +-0.345548 -0.417553 -0.216974 +-0.322795 -0.427865 -0.195551 +-0.33518 -0.363207 -0.161311 +-0.0812327 -0.396788 0.0342935 +-0.065289 -0.38943 0.0224745 +-0.0508718 -0.371639 0.0298172 +-0.260668 -0.216401 0.0653687 +-0.2704 -0.185201 0.0538295 +0.187032 0.486356 0.0996338 +0.279593 -0.136382 0.110973 +0.26837 -0.117918 0.105466 +0.248285 -0.109463 0.116456 +0.232397 -0.125931 0.141691 +0.210603 -0.141776 0.171116 +0.137574 -0.108705 0.207737 +0.169921 0.29167 0.0522744 +0.00992085 -0.113945 -0.0964453 +0.258261 -0.257702 -0.154872 +0.275321 -0.267702 -0.17038 +0.295633 -0.272896 -0.184932 +0.295815 -0.294739 -0.20199 +0.314713 -0.27743 -0.201437 +0.327332 -0.256197 -0.214678 +0.340385 -0.261017 -0.241446 +0.313356 -0.232789 -0.209684 +0.296344 -0.226073 -0.182212 +0.31592 -0.301772 -0.216769 +0.318635 -0.326842 -0.222796 +0.307178 -0.325937 -0.251416 +0.274745 -0.303144 -0.21295 +0.263287 -0.308346 -0.232527 +0.255382 -0.319889 -0.248754 +0.332002 -0.310475 -0.229091 +0.353636 -0.307458 -0.245121 +0.335859 -0.313851 -0.265914 +0.340499 -0.300896 -0.286697 +0.344989 -0.280039 -0.276203 +0.327449 -0.28026 -0.295194 +0.304942 -0.268737 -0.28762 +0.34983 -0.283684 -0.251927 +0.343136 -0.265469 -0.261534 +0.326713 -0.248963 -0.256716 +0.307917 -0.24034 -0.252462 +0.279159 -0.231625 -0.241522 +0.300353 -0.229376 -0.234338 +0.311358 -0.251222 -0.26759 +0.299024 -0.289572 -0.301481 +0.279907 -0.305571 -0.290358 +0.263002 -0.29286 -0.276914 +0.260616 -0.313748 -0.268771 +0.275922 -0.322371 -0.224156 +0.284975 -0.33259 -0.244221 +0.303023 -0.336946 -0.233483 +0.289605 -0.333838 -0.221905 +0.166435 0.39886 0.154509 +0.189152 0.404825 0.153461 +0.197133 0.400723 0.1737 +0.17424 0.413608 0.143911 +0.169142 0.426834 0.132439 +0.188725 0.386035 0.180698 +0.186219 0.378081 0.198788 +-0.267025 -0.372115 -0.138391 +-0.248022 -0.367522 -0.158602 +0.174505 0.292586 0.0990952 +0.186251 0.309263 0.0928235 +0.181697 0.30513 0.109614 +0.189499 0.279776 0.119317 +0.172647 0.294457 0.120787 +0.158057 0.303956 0.130265 +0.143476 0.291331 0.139139 +0.131312 0.30031 0.159002 +0.186095 0.298863 0.131041 +0.198975 0.28677 0.132576 +0.172236 0.277192 0.117866 +0.184313 0.260452 0.109718 +0.15755 0.265746 0.122578 +0.145983 0.269471 0.137935 +0.151234 0.256355 0.155644 +0.124293 0.323596 0.164277 +0.126678 0.342635 0.150186 +0.129524 0.341544 0.128525 +0.146576 0.349856 0.118779 +0.192269 0.30374 0.0759625 +0.202728 0.285813 0.0690781 +0.210479 0.281567 0.0483558 +0.222196 0.26209 0.0407369 +0.224073 0.261141 0.0186008 +0.162756 0.306191 0.114529 +0.149682 0.318744 0.121136 +0.152677 0.341974 0.100993 +0.164071 0.331208 0.0841361 +0.146523 0.323278 0.093798 +0.15695 0.312461 0.0714443 +0.22266 -0.203518 -0.100877 +0.262076 -0.292278 -0.202356 +0.249754 -0.28212 -0.183581 +0.242451 -0.284733 -0.203885 +0.229725 -0.273053 -0.211906 +0.243386 -0.275428 -0.225419 +0.255999 -0.283472 -0.239546 +-0.261873 -0.405224 -0.222848 +-0.280772 -0.420055 -0.201182 +-0.274389 -0.414773 -0.173401 +-0.298626 -0.411672 -0.158377 +-0.28738 -0.389898 -0.148508 +-0.300008 -0.369107 -0.135836 +-0.257381 -0.39915 -0.185758 +-0.257531 -0.421709 -0.186727 +-0.319983 -0.369357 -0.146016 +-0.25404 -0.39271 -0.206532 +-0.269186 -0.375948 -0.213104 +0.171129 0.312683 0.0555484 +0.186538 0.309469 0.0612947 +0.17697 0.322584 0.0897939 +0.180094 0.317456 0.102692 +0.0389455 -0.294719 0.0707663 +0.19085 0.129482 0.148059 +0.26893 -0.330546 -0.250405 +0.261495 -0.324416 -0.260179 +0.163955 0.0845671 -0.00775852 +0.172992 0.467003 0.114773 +0.17962 0.47069 0.135115 +0.167392 0.460661 0.148013 +0.0927702 -0.0102964 0.178794 +0.0791092 -0.00358862 0.211868 +0.0484002 -0.0727004 0.143042 +0.0857054 -0.0664246 0.132462 +0.170606 0.462905 0.162683 +0.107346 -0.291576 0.0507084 +0.123054 -0.26548 0.0555752 +0.1033 -0.273351 0.0618915 +-0.217347 -0.0684085 0.0793768 +-0.232534 -0.1003 0.0785864 +0.160705 0.203815 0.112095 +0.157448 0.189802 0.0951937 +0.163855 0.222961 0.107992 +0.178039 0.226994 0.0939715 +0.157779 0.236558 0.121407 +0.156862 0.233096 0.141593 +0.254115 0.147478 0.0328869 +0.246739 0.139758 0.0163119 +-0.313249 -0.26088 -0.138114 +-0.319034 -0.272336 -0.0954566 +-0.312031 -0.286413 -0.151154 +-0.318615 -0.301412 -0.127758 +-0.31358 -0.30952 -0.0911544 +-0.342054 -0.297563 -0.104135 +-0.285707 -0.289103 -0.098473 +-0.332554 -0.290038 -0.0650158 +0.224391 0.444149 0.0748945 +0.224127 0.466497 0.0733316 +0.00933378 -0.0890982 -0.073455 +-0.196836 -0.0544369 -0.0547609 +-0.268852 -0.35939 -0.204575 +-0.134821 -0.144762 0.184037 +-0.108849 -0.110436 0.169417 +-0.142893 -0.258813 -0.176858 +0.163435 0.422628 0.144619 +0.149105 0.425301 0.157986 +0.151653 0.445126 0.160854 +0.205634 0.453218 0.0682861 +0.196116 0.437078 0.0613117 +0.305429 0.136514 0.131635 +0.304223 0.128705 0.150462 +0.294739 0.1352 0.16485 +0.29983 0.148475 0.176204 +0.293633 0.16134 0.186506 +0.312816 0.146868 0.144611 +0.290574 0.119539 0.149687 +0.280449 0.10933 0.137413 +0.285959 0.112117 0.117297 +0.154398 0.116961 0.162863 +0.147042 0.108372 0.152274 +0.179394 0.214392 0.162515 +0.185651 0.194518 0.157404 +0.180628 0.232354 0.173507 +0.198969 0.238329 0.174545 +0.207694 0.253512 0.177641 +0.203869 0.264161 0.186147 +0.189501 0.273156 0.193533 +0.17312 0.263127 0.188581 +-0.206119 -0.0619918 0.116346 +-0.201545 -0.0465532 0.095691 +0.256266 0.152102 0.0503785 +0.264034 0.143148 0.0672501 +0.26342 0.152022 0.0867622 +0.269601 0.144159 0.103885 +0.281713 0.137095 0.0629023 +0.296165 0.127981 0.0376256 +0.300117 0.13462 0.0559043 +0.287642 0.140563 0.0456708 +0.278661 0.132147 0.0309413 +0.271646 0.118273 0.028754 +0.262921 0.1025 0.0261376 +0.261118 0.0855637 0.0169037 +0.25422 0.0767023 0.000233527 +0.237362 0.0575218 0.00198963 +0.283388 0.119704 0.0383643 +0.282941 0.112062 0.0540402 +0.249937 0.0937398 -0.00575339 +0.231931 0.0954578 -0.0107377 +0.210437 0.0914748 -0.0140972 +0.239252 0.109782 0.000233887 +0.191402 0.0870306 -0.0134669 +0.184376 0.0704441 -0.0225342 +0.184719 0.0606504 -0.044543 +0.166145 0.0578967 -0.0668264 +0.200251 0.061117 -0.0313226 +0.217304 0.057967 -0.0199728 +0.227686 0.12158 0.00370932 +0.20937 0.123042 0.000300618 +0.244333 0.124524 0.00810813 +0.295429 0.120597 0.0522453 +0.178132 0.0791963 -0.0112798 +0.177197 -0.279627 -0.000252101 +0.173639 -0.299787 -0.00606886 +0.172196 -0.313975 -0.0223573 +0.166117 -0.326159 -0.00858114 +0.168079 -0.321719 -0.0379096 +0.162521 -0.339731 -0.0445028 +0.151373 -0.32895 -0.0576036 +0.312369 -0.105021 0.0899766 +0.306 -0.11652 0.0866674 +0.301418 -0.129182 0.0942967 +0.290875 -0.135236 0.101483 +0.289966 -0.143698 0.1109 +0.295915 -0.13953 0.122573 +0.279108 -0.148197 0.122497 +0.27841 -0.152315 0.142258 +0.265867 -0.157983 0.158785 +0.256687 -0.14661 0.137703 +0.25422 -0.140442 0.172759 +0.232237 -0.161116 0.192798 +0.192807 -0.160413 0.202508 +0.178601 -0.140578 0.237092 +0.154384 -0.117167 0.24831 +0.13004 -0.134226 0.269277 +0.17845 -0.105479 0.223698 +0.247464 -0.158843 0.179106 +0.226891 -0.158442 0.171794 +0.209982 -0.159856 0.187271 +0.217821 -0.141328 0.207646 +0.23745 -0.141109 0.186416 +0.229503 -0.142546 0.156329 +0.214657 -0.125289 0.155947 +0.193847 -0.12199 0.171057 +0.217246 -0.105649 0.140104 +0.198069 -0.0856194 0.142621 +0.193693 -0.14343 0.18682 +0.198045 -0.145975 0.222277 +0.178989 -0.164931 0.225321 +0.158831 -0.146831 0.218292 +0.158889 -0.159611 0.244735 +0.138513 -0.154491 0.257842 +0.156487 -0.13924 0.256434 +-0.290841 -0.208347 -0.00770324 +-0.29533 -0.224009 -0.017137 +-0.30561 -0.24462 -0.0155011 +-0.278365 -0.220452 -0.0277869 +-0.267819 -0.241114 -0.0357093 +-0.286737 -0.259306 -0.0462551 +-0.310093 -0.264404 -0.0203987 +-0.307167 -0.250649 -0.0341839 +-0.307612 -0.281242 -0.0310235 +-0.321036 -0.286281 -0.0471544 +-0.310491 -0.270102 -0.0639157 +-0.311345 -0.301149 -0.0633156 +-0.297683 -0.291436 -0.0450671 +-0.294949 -0.304108 -0.0790095 +-0.285459 -0.27779 -0.0488974 +-0.296472 -0.275126 -0.0168658 +-0.276222 -0.270671 -0.00788631 +-0.246454 -0.248267 -0.0329014 +-0.244456 -0.252303 -0.00937036 +-0.304286 -0.259682 -0.0492577 +-0.294933 -0.27203 -0.0604957 +-0.300998 -0.278796 -0.0743602 +-0.316674 -0.274623 -0.0789273 +-0.337714 -0.280945 -0.0853892 +-0.325825 -0.275251 -0.0655092 +-0.332977 -0.302425 -0.0833069 +-0.293564 -0.290291 -0.0772666 +-0.298024 -0.281309 -0.0905074 +-0.293634 -0.272694 -0.109468 +-0.270428 -0.274072 -0.107657 +-0.256077 -0.253991 -0.120812 +-0.261078 -0.296954 -0.0999473 +-0.2381 -0.297373 -0.0849839 +-0.232752 -0.278906 -0.0645746 +-0.272041 -0.319246 -0.10842 +-0.21032 -0.284441 -0.0448701 +-0.256436 -0.341131 -0.11181 +-0.225098 -0.336223 -0.113241 +-0.200175 -0.288996 -0.0158483 +-0.223009 -0.317757 -0.0905879 +-0.301096 -0.262202 -0.123506 +-0.32405 -0.263071 -0.116908 +-0.292477 -0.257052 -0.14263 +-0.270149 -0.255918 -0.142108 +-0.275486 -0.258003 -0.162669 +-0.259523 -0.2674 -0.178244 +-0.251069 -0.250018 -0.0970302 +-0.24056 -0.260706 -0.172311 +-0.232499 -0.247239 -0.154361 +-0.34182 -0.274562 -0.107339 +-0.294559 -0.307923 -0.0994756 +-0.275844 -0.269552 -0.0355918 +-0.227344 -0.270897 -0.045083 +0.25093 0.170443 0.120028 +0.248384 0.184009 0.106523 +0.235777 0.198062 0.103222 +0.23641 0.211305 0.086191 +0.221152 0.226047 0.0898201 +0.223243 0.24123 0.111495 +0.203883 0.250541 0.105061 +0.226958 0.225862 0.123117 +0.219737 0.240254 0.12789 +0.214138 0.253162 0.132941 +0.232275 0.224561 0.138088 +0.109391 -0.247931 -0.0995264 +0.104952 -0.262437 -0.0820427 +0.080763 -0.274056 -0.0783487 +0.0604155 -0.262392 -0.0950373 +-0.227936 -0.329497 -0.190147 +-0.214125 -0.337031 -0.170051 +0.263325 -0.0528405 0.0685009 +0.251926 -0.0484757 0.0715634 +0.237277 -0.0480579 0.0658708 +0.244491 -0.055646 0.0790843 +0.239659 -0.0616442 0.0888399 +0.226162 -0.0616059 0.0920824 +0.21522 -0.0631162 0.0781895 +0.212545 -0.0629682 0.0966232 +0.196781 -0.0599901 0.105959 +0.210127 -0.0657511 0.11188 +0.250495 -0.0660959 0.0846797 +0.234672 -0.0671026 0.0978575 +0.237261 -0.0846396 0.108485 +0.25989 -0.0423809 0.0666642 +0.259987 -0.0257531 0.0664908 +0.247883 -0.0247631 0.0554477 +0.242689 -0.0135836 0.0440572 +0.246291 0.00496067 0.0457059 +0.245187 0.0234669 0.0372413 +0.250061 0.17416 0.133813 +0.259114 0.167602 0.148828 +0.26511 0.166925 0.171546 +0.238618 0.181672 0.138204 +0.229669 0.176644 0.149535 +0.262049 0.187134 0.176237 +0.261795 0.200868 0.165371 +0.276513 0.199318 0.153854 +0.292677 0.199982 0.157209 +0.302715 0.186361 0.157188 +0.308755 0.181779 0.171774 +0.305926 0.190608 0.185482 +0.312423 0.167782 0.169221 +0.31381 0.157653 0.158921 +0.310783 0.154703 0.171639 +0.301108 0.177938 0.144841 +0.293264 0.189309 0.147256 +0.279322 0.188458 0.145304 +0.262483 0.193127 0.192418 +0.274289 0.192768 0.20161 +0.254841 0.206509 0.193978 +0.245154 0.222549 0.189318 +0.253012 0.22552 0.174345 +0.265429 0.23121 0.17081 +-0.253206 -0.236908 -0.0443888 +0.149428 0.386275 0.232451 +0.147867 0.371017 0.232576 +0.152926 0.356705 0.229375 +0.149032 0.338169 0.225131 +0.166114 0.363727 0.223417 +0.172256 0.353426 0.215568 +0.179541 0.338962 0.221969 +0.181625 0.354174 0.201921 +0.186426 0.343494 0.187951 +0.192075 0.328517 0.215563 +0.192453 0.320313 0.195502 +0.17815 0.351274 0.174302 +0.17655 0.370022 0.172318 +0.165276 0.33179 0.225541 +0.00939661 -0.323412 0.0804555 +0.117561 -0.144032 0.250595 +0.120353 -0.125008 0.233582 +0.111251 -0.145731 0.271784 +0.11093 -0.120815 0.285658 +0.0754192 -0.0921393 0.301481 +0.0769558 -0.124739 0.290267 +0.0748528 -0.117401 0.265004 +0.0426218 -0.103655 0.282975 +0.0504123 -0.0659143 0.287583 +0.0836935 -0.0669285 0.279976 +0.0588543 -0.11803 0.279938 +0.0586609 -0.105277 0.297458 +0.0557269 -0.0839063 0.29826 +0.0381914 -0.083198 0.286361 +0.0371995 -0.0680895 0.266535 +0.047335 -0.0888232 0.265922 +0.05563 -0.0732275 0.247968 +0.0616189 -0.0543441 0.232231 +0.0811821 -0.0784737 0.231059 +0.0764784 -0.0353683 0.254905 +0.0689625 -0.0703705 0.29266 +0.0661415 -0.0548095 0.278244 +0.0608765 -0.028919 0.235586 +0.087271 -0.018263 0.234864 +0.0756435 -0.10953 0.298971 +0.0951645 -0.0988538 0.288259 +0.0930654 -0.116235 0.295574 +0.0947803 -0.133863 0.284699 +0.0966033 -0.0830131 0.273711 +0.113798 -0.076403 0.258582 +0.127442 -0.0600385 0.234949 +0.132794 -0.0953943 0.252522 +0.0489111 -0.0556973 0.272686 +0.0606107 -0.0431898 0.263976 +0.0971312 -0.036293 0.245012 +0.110687 -0.0488392 0.23675 +0.126176 -0.0414728 0.221378 +0.136057 -0.0243951 0.201716 +0.122078 0.00127519 0.196707 +0.142291 0.00027007 0.178375 +0.0664164 -0.0191578 0.217877 +0.0802696 -0.0234954 0.199319 +0.0910082 -0.0454502 0.20083 +0.0798776 -0.132726 0.273919 +0.102454 0.00166634 0.210465 +0.0802091 -0.00534582 0.192641 +0.0863635 0.00814252 0.179895 +0.0946306 0.0282399 0.168655 +0.0981336 0.029523 0.148764 +0.101777 0.0395859 0.135111 +0.102082 0.0581642 0.134881 +0.0956437 0.0321468 0.122829 +0.0938658 0.0161985 0.122282 +0.107901 0.00369122 0.128399 +0.078491 0.00576055 0.124425 +0.0841199 0.0382034 0.11313 +0.0659972 0.0331947 0.109714 +0.0520056 0.0196069 0.12098 +0.108345 -0.0142416 0.126349 +0.0915975 -0.0313276 0.129913 +0.122833 -0.0287943 0.124051 +0.146418 -0.0426624 0.119895 +0.142658 -0.0228961 0.131632 +0.132595 -0.0194368 0.150249 +0.160419 -0.0327892 0.133975 +0.163125 -0.050543 0.147173 +0.060233 0.0422739 0.0970401 +0.0469107 0.0353785 0.0851224 +0.0330985 0.0252247 0.0760721 +0.0344131 0.0145341 0.0525338 +0.0185411 0.0141735 0.0691085 +-0.00651953 0.00766464 0.081092 +0.0314926 0.0314677 0.0951056 +0.0155266 0.0258059 0.107793 +0.11957 0.0050674 0.144577 +0.11348 -0.010764 0.15919 +0.0864989 0.00930931 0.196192 +0.112679 0.0343949 0.172228 +0.110056 0.0172326 0.144505 +-0.231861 -0.256194 -0.0373807 +-0.233847 -0.249852 -0.0220477 +-0.230235 -0.258784 -0.00973726 +-0.217151 -0.280061 0.00814621 +-0.228026 -0.273051 0.0389012 +-0.222798 -0.271648 -0.00409819 +-0.229682 -0.268052 0.0118625 +-0.212876 -0.279385 -0.0140325 +-0.214439 -0.277583 -0.0303969 +-0.199886 -0.285356 -0.0320197 +-0.187179 -0.295224 -0.0255156 +-0.167219 -0.315028 -0.0304058 +-0.156845 -0.302235 -0.0544314 +-0.236758 -0.254924 0.00227314 +0.0884351 -0.404348 -0.0195924 +0.0722252 -0.268984 0.0670772 +0.070147 -0.245252 0.0862941 +0.0966471 -0.229612 0.0882203 +0.0926053 -0.203806 0.103764 +0.0777673 -0.186021 0.118999 +0.0417862 -0.182948 0.126604 +0.0709209 -0.158179 0.128709 +0.095465 -0.128791 0.124296 +0.0102764 -0.16375 0.133447 +-0.0233099 -0.171526 0.153541 +-0.0499934 -0.0465621 -0.00582837 +-0.0749973 -0.0355191 0.0101971 +-0.0645299 -0.324704 -0.077104 +0.221779 0.470802 0.0892895 +0.219761 0.464582 0.1032 +0.246597 0.0246927 0.0795416 +0.253586 0.0320272 0.0977802 +0.252394 0.0305168 0.0670227 +0.261064 0.0424817 0.0637394 +0.267205 0.0556508 0.058182 +0.262106 0.0615289 0.0436471 +0.250683 0.0500973 0.0298185 +0.272972 0.0454164 0.0731281 +0.274554 0.0385023 0.090004 +0.285852 0.0505507 0.0780368 +0.287544 0.066644 0.0791877 +0.280213 0.0764884 0.0661465 +0.226162 0.0537579 -0.00800313 +0.231726 0.0372941 0.00212281 +0.226833 0.070796 -0.0125112 +-0.0228881 0.0822405 -0.0141151 +-0.0164496 0.062439 -0.0353807 +-0.0311204 0.09353 -0.0291259 +-0.0468617 0.0890411 -0.0503417 +-0.0192694 0.0958145 -0.0445491 +-0.0451838 0.0631149 -0.0497516 +-0.0349277 0.0970377 -0.0439657 +-0.0281121 0.0908295 -0.0597278 +-0.0422149 0.0875756 -0.0360098 +-0.0493018 0.0748281 -0.0407497 +-0.0508974 0.0756362 -0.0555946 +-0.045787 0.0616401 -0.0714534 +-0.0463878 0.0860458 -0.0643425 +-0.0469 0.0754389 -0.0734442 +-0.0361876 0.0721397 -0.0877453 +-0.0344753 0.0506229 -0.0835042 +-0.0209274 0.0429352 -0.0951495 +-0.00835098 0.0548898 -0.109767 +-0.0439408 0.0675081 -0.0809412 +-0.0384794 0.0604865 -0.0888934 +-0.0325578 0.0529818 -0.0938199 +-0.0250287 0.0507859 -0.100857 +-0.0171358 0.0586173 -0.103485 +-0.00108771 0.0669554 -0.09638 +0.0141047 0.0764389 -0.0789872 +-0.0166767 0.0687863 -0.0931008 +-0.0154196 0.0443974 -0.106822 +0.00804033 0.0334573 -0.118139 +-0.00353356 0.0420783 -0.115203 +0.00267945 0.0333406 -0.10199 +0.0284162 0.0260832 -0.102463 +0.0140719 0.0342408 -0.0876383 +0.01206 0.042083 -0.0690778 +0.0262722 0.0834922 -0.057317 +0.052314 0.0257381 -0.0888721 +0.0550064 0.0153199 -0.121681 +0.0742668 0.0307726 -0.0684202 +0.0254542 0.0462258 -0.0537161 +0.0192751 0.0579365 -0.0299961 +0.043388 0.0389601 -0.0621497 +0.0632571 0.0407552 -0.0511604 +0.0628168 0.0511918 -0.0295138 +-0.00769957 0.0468719 -0.0674097 +0.0356439 0.036944 -0.129564 +0.00985644 0.0486694 -0.11871 +0.0293481 0.0500299 -0.116265 +0.034304 0.0639803 -0.0982281 +0.0203799 0.0394103 -0.126099 +0.0274107 0.0238815 -0.120304 +-0.00989932 0.038173 -0.0977698 +0.0409915 0.0204434 -0.130582 +0.0603476 0.0361414 -0.135064 +0.0745924 0.0111822 -0.144256 +0.0995383 0.0164619 -0.152082 +0.079494 0.0098491 -0.119596 +0.109969 -0.00178903 -0.14121 +0.128369 -0.00667529 -0.145234 +0.147176 -0.000628591 -0.159936 +0.143478 0.0207956 -0.143584 +0.15945 -0.0140125 -0.151421 +0.167046 -0.013357 -0.130058 +0.175024 -0.000463673 -0.161193 +0.200548 0.00730904 -0.144289 +0.228188 0.00606999 -0.13371 +0.232374 -0.0225206 -0.12062 +0.217352 -0.0205681 -0.149989 +0.196446 -0.0094088 -0.159916 +0.0468892 0.0318746 -0.136603 +0.0588847 0.0194871 -0.141629 +0.0497176 0.0425705 -0.12546 +0.067316 0.0466181 -0.121528 +0.0829023 0.0554408 -0.10632 +0.0702884 0.0671402 -0.0864572 +0.0736048 0.0280122 -0.141966 +-0.0393368 0.0927115 -0.058201 +-0.074253 -0.462729 -0.0674302 +-0.0882268 -0.46748 -0.0836924 +-0.10265 -0.454789 -0.102517 +-0.100302 -0.434985 -0.0953132 +-0.123508 -0.439573 -0.0964816 +0.30376 -0.329009 -0.220778 +-0.34576 -0.287787 -0.1184 +-0.333412 -0.299886 -0.118936 +-0.318278 -0.306436 -0.109371 +-0.342798 -0.273541 -0.122349 +-0.330946 -0.265681 -0.13448 +-0.32759 -0.278136 -0.147142 +-0.313986 -0.269795 -0.152301 +-0.304937 -0.277784 -0.160852 +-0.289134 -0.290053 -0.171285 +-0.300398 -0.29313 -0.159904 +-0.305136 -0.304081 -0.143109 +-0.303823 -0.326091 -0.148763 +-0.297334 -0.338307 -0.131821 +-0.0297344 -0.320795 0.126249 +-0.0440833 -0.337561 0.102751 +-0.0635963 -0.3222 0.124646 +-0.0820192 -0.303394 0.145977 +-0.0280108 -0.346215 0.0792887 +0.190023 -0.166658 -0.160984 +0.187606 0.489479 0.0788413 +0.169798 0.492699 0.0805537 +0.160239 0.479513 0.0724411 +0.160997 0.477019 0.0876359 +0.167909 0.48647 0.0907839 +0.168839 0.465921 0.0685027 +0.185848 0.461592 0.0756332 +0.163713 0.449815 0.0719867 +0.171034 0.442192 0.0868531 +0.172622 0.439121 0.100638 +0.176648 -0.0540189 0.138439 +0.191763 0.435033 0.0761478 +0.150024 0.450095 0.173316 +0.142684 0.444609 0.180888 +0.134925 0.435737 0.185852 +0.0901553 -0.0455623 0.257862 +0.0764097 -0.0467149 0.266788 +0.218445 0.190081 -0.00453558 +0.212983 0.187132 0.0158667 +0.234912 0.203072 -0.0090602 +0.217724 0.208098 -0.00630956 +0.209095 0.231498 0.0538229 +0.223398 0.222537 0.0510417 +0.229495 0.205818 0.051858 +0.241614 0.200114 0.0387668 +0.245196 0.212463 0.0252865 +0.232616 0.199508 0.066443 +0.245867 0.187445 0.0704899 +0.218046 0.211438 0.0580939 +0.206013 0.207163 0.0667587 +0.208167 0.217137 0.0808695 +0.189985 0.216171 0.0819923 +-0.328288 -0.282754 -0.0562593 +-0.321215 -0.270892 -0.0527491 +-0.321885 -0.294532 -0.0580289 +-0.324301 -0.301836 -0.070993 +-0.309665 -0.294095 -0.0515043 +-0.298437 -0.298535 -0.0585809 +-0.293755 -0.297175 -0.0685565 +-0.301865 -0.303693 -0.0670723 +-0.312242 -0.307406 -0.0760424 +0.113855 0.0103494 0.135894 +0.117356 -0.000872108 0.134011 +0.24192 0.231796 0.179613 +0.236568 0.24336 0.180529 +0.226028 0.250706 0.186633 +0.280884 -0.220307 -0.163899 +0.26654 -0.211351 -0.150233 +0.265056 -0.233891 -0.14678 +0.318482 -0.331697 -0.239506 +0.324395 -0.322699 -0.253479 +0.31194 -0.314679 -0.269415 +0.329739 -0.334727 -0.229668 +0.336703 -0.323152 -0.229076 +0.344428 -0.313085 -0.23571 +0.342498 -0.293727 -0.236916 +0.350543 -0.322922 -0.2465 +0.353252 -0.314 -0.261759 +0.347047 -0.326986 -0.235121 +0.0827363 -0.465408 -0.0592863 +0.0757733 -0.45735 -0.0483001 +0.0758332 -0.442944 -0.0486429 +0.0763754 -0.427162 -0.064874 +0.0810297 -0.429275 -0.0354104 +0.0760881 -0.402196 -0.0628009 +0.0803331 -0.462498 -0.0366385 +0.075746 -0.427719 -0.0496393 +0.213629 0.454927 0.154222 +0.216172 0.433851 0.152191 +0.213875 -0.163106 0.208849 +0.228479 0.0837143 -0.0171959 +0.214862 0.0777937 -0.0178642 +0.203914 0.0820668 -0.0169156 +0.213551 0.066976 -0.0133462 +-0.291696 -0.291685 -0.053913 +-0.288445 -0.286967 -0.0453936 +-0.283457 -0.280518 -0.0392925 +0.198493 0.267303 0.113918 +-0.00816198 -0.315253 0.11742 +0.312224 -0.337685 -0.224702 +0.0776115 -0.0114015 0.225043 +0.094616 -0.00802053 0.222738 +0.212523 -0.00317223 -0.153514 +0.228944 -0.0069181 -0.146501 +0.230166 -0.0223035 -0.138067 +0.212902 -0.0238532 -0.132712 +0.194522 -0.0219296 -0.138137 +0.240306 -0.00819778 -0.130311 +0.24497 -0.0122967 -0.113875 +0.221562 -0.0094445 -0.0973672 +0.242491 -0.00970392 -0.0927411 +-0.195428 -0.293105 -0.0588105 +-0.174639 -0.293714 -0.0615636 +-0.159198 -0.295096 -0.0708856 +-0.150745 -0.297027 -0.0916319 +-0.165094 -0.309633 -0.116063 +-0.129532 -0.293794 -0.0901166 +-0.12154 -0.29002 -0.105668 +-0.103655 -0.284754 -0.110478 +-0.083304 -0.273535 -0.126518 +-0.126229 -0.291149 -0.124142 +-0.0551206 -0.282297 -0.123125 +-0.0279253 -0.280704 -0.123568 +-0.0254074 -0.296918 -0.100527 +-0.143636 -0.296672 -0.0765836 +0.228772 0.249576 0.00807469 +0.246793 0.197559 -0.000456927 +0.249351 0.185655 0.00965958 +0.077471 -0.38535 -0.0716786 +0.0780138 -0.366405 -0.0698751 +0.0796117 -0.349597 -0.0694382 +0.0817673 -0.324046 -0.067713 +0.0920794 -0.339278 -0.0766687 +0.0745961 -0.308674 -0.0513846 +0.0686559 -0.285979 -0.0584538 +0.0701691 -0.296007 -0.0346939 +0.0958416 -0.324563 -0.0739969 +0.111686 -0.315208 -0.0712996 +0.118212 -0.295045 -0.0671537 +0.145789 -0.285221 -0.0572786 +0.142444 -0.258951 -0.0651148 +0.125807 -0.256448 -0.0777825 +0.0725557 -0.302564 -0.0188272 +0.0757738 -0.318738 -0.0113816 +0.0755625 -0.334153 -0.022547 +0.0716925 -0.292684 -0.00740334 +0.0574002 -0.292216 -0.00131701 +0.0442788 -0.29974 -0.0118635 +0.0322898 -0.309073 -0.00126775 +0.0158934 -0.319374 -0.00927168 +0.00270388 -0.318254 -0.036966 +0.00321031 -0.33353 0.006095 +0.0101246 -0.330737 0.0331595 +0.0571801 -0.291727 0.0142738 +0.0411549 -0.302632 0.0323113 +0.0568056 -0.290026 0.0325413 +0.0726196 -0.279494 0.0399911 +0.0843075 -0.293947 0.0355701 +0.0802412 -0.296732 0.0208207 +0.0757523 -0.290551 0.00911073 +0.0904109 -0.307387 0.0401159 +0.0937218 -0.321431 0.0333001 +0.0876185 -0.332554 0.0196986 +-0.261918 -0.356193 -0.123562 +-0.274572 -0.363058 -0.128675 +-0.283885 -0.374671 -0.137095 +0.0993425 -0.475253 -0.0345906 +0.105878 -0.470302 -0.022596 +0.161209 0.00758193 -0.157082 +0.162861 -0.00496129 -0.160125 +0.14622 0.0234899 0.00861402 +0.16407 0.00688456 0.00334424 +0.187476 0.0108016 -0.000104135 +0.198618 0.0267239 -0.00776275 +0.213159 0.032032 -0.0211609 +0.229764 0.0271876 -0.0288068 +0.229938 0.0432028 -0.0342052 +0.231973 0.0361819 -0.05417 +0.241585 0.0230077 -0.0674939 +0.235826 0.0200922 -0.0913851 +0.229532 0.00831192 -0.0604593 +0.228417 0.0182383 -0.11087 +0.214387 0.0313739 -0.095916 +0.23826 0.0319925 -0.0407356 +0.240603 0.0153722 -0.0478262 +0.185434 0.0390225 -0.0120783 +0.174046 0.035224 -0.0278333 +0.183039 0.0254835 -0.0435084 +0.185088 0.013208 -0.0664572 +0.184517 -0.00115634 -0.0944301 +0.15883 0.0112792 -0.0789407 +0.166768 0.0454452 -0.0125857 +0.149871 0.0473393 -0.0127261 +0.24097 0.0273212 -0.0523021 +0.244689 0.0183228 -0.0578172 +0.239121 0.00955592 -0.0564169 +0.23067 0.0133196 -0.0511149 +0.217815 0.013095 -0.0555127 +0.202953 0.0215885 -0.0445658 +0.223255 0.0309758 -0.00933388 +0.246338 0.00680161 -0.0920968 +-0.29666 -0.251794 -0.0420083 +-0.282377 -0.246563 -0.0382484 +-0.274248 -0.257163 -0.0411355 +0.121069 0.3764 0.220244 +0.124178 0.361607 0.222425 +0.12316 0.347289 0.21517 +0.120818 0.335014 0.200629 +0.131773 0.318764 0.203442 +0.240354 -0.189104 -0.174254 +0.226426 -0.17846 -0.157236 +0.25469 -0.197929 -0.186668 +0.262527 -0.207499 -0.20859 +0.275709 -0.206748 -0.189755 +0.268196 -0.218714 -0.226562 +0.252109 -0.214264 -0.221034 +0.231966 -0.219863 -0.222417 +0.16439 -0.290409 -0.045741 +0.174232 0.353361 0.161991 +0.167416 0.346038 0.151615 +0.153417 0.351454 0.147309 +0.141711 0.365653 0.160008 +0.174784 0.33351 0.146976 +0.172695 0.32064 0.137876 +0.171538 0.327653 0.122668 +-0.153467 -0.465689 -0.0917447 +-0.142244 -0.458217 -0.0978282 +-0.137315 -0.444624 -0.0945322 +-0.142546 -0.468457 -0.0929801 +-0.130113 -0.470071 -0.0887414 +-0.111868 -0.466578 -0.0912306 +-0.129822 -0.476932 -0.0773011 +-0.116192 -0.47396 -0.0799073 +-0.102072 -0.471199 -0.0816089 +0.0648327 -0.288276 0.006469 +0.290523 -0.14969 0.120852 +0.286341 -0.149084 0.132395 +0.276561 -0.154417 0.131433 +0.266874 -0.144863 0.128327 +0.266123 -0.155511 0.139202 +0.254682 -0.156501 0.14847 +0.243072 -0.144724 0.147014 +0.246658 -0.132891 0.13506 +0.271484 -0.158645 0.148826 +0.262513 -0.161728 0.150556 +0.255383 -0.163883 0.160093 +0.258182 -0.154155 0.170424 +0.247063 -0.165211 0.168804 +0.236375 -0.166699 0.177267 +0.223809 -0.16596 0.182974 +0.219971 -0.167303 0.19665 +0.224247 -0.15536 0.203023 +0.206877 -0.166582 0.198203 +0.201256 -0.167208 0.210293 +0.187949 -0.165778 0.214542 +0.175727 -0.151043 0.207983 +0.205839 -0.156778 0.218275 +0.191606 -0.158183 0.226132 +0.180969 -0.154585 0.235065 +0.170507 -0.150398 0.244702 +0.167678 -0.135398 0.246604 +0.174695 -0.121433 0.234619 +0.192199 -0.123695 0.219574 +0.161002 -0.150315 0.252813 +0.149901 -0.156196 0.25282 +0.145756 -0.15618 0.238445 +0.158231 -0.157867 0.22927 +0.148019 -0.147104 0.261177 +0.14318 -0.132144 0.260892 +0.131504 -0.114456 0.261736 +0.136414 -0.145181 0.266602 +0.124033 -0.152215 0.261533 +0.128756 -0.151616 0.248741 +0.169715 -0.162656 0.235355 +0.125332 -0.145025 0.270918 +0.118124 -0.13431 0.277651 +0.122928 -0.121301 0.271952 +0.113017 -0.148351 0.260498 +0.105868 -0.137752 0.254904 +0.0970603 -0.116879 0.246491 +0.113377 -0.13188 0.244126 +0.102989 -0.14407 0.26402 +0.09993 -0.141861 0.276203 +-0.208269 -0.22401 0.141633 +-0.20692 -0.250284 0.132437 +0.0965268 -0.427234 -0.105996 +0.0991486 -0.439673 -0.0998914 +0.19126 -0.17619 0.0390751 +0.184715 -0.204433 0.0324441 +0.164304 -0.221583 0.0465757 +0.1444 -0.208807 0.0686986 +0.0226172 -0.0147867 0.137076 +-0.142255 -0.49298 -0.0216335 +0.233691 0.0208001 -0.0385404 +-0.192672 -0.315988 0.0839294 +-0.202286 -0.295403 0.104035 +-0.212462 -0.276423 0.111373 +-0.218066 -0.285356 0.0914372 +-0.230517 -0.270625 0.068595 +0.136055 0.0355608 0.0131192 +0.121886 0.0399552 0.0198872 +0.106186 0.0275039 0.0255554 +0.0928691 0.0373146 0.0446539 +0.107832 0.0113031 0.0106037 +0.0853288 0.00897116 0.0135994 +0.0648776 -0.00152148 0.00684991 +0.301901 0.1917 0.196837 +0.304498 0.181718 0.192274 +0.29757 0.171529 0.192207 +0.283611 0.170157 0.190984 +0.17589 0.332048 0.230978 +0.176274 0.318104 0.221305 +0.189786 0.308195 0.22975 +0.199452 0.291101 0.221444 +0.210647 0.278153 0.221165 +0.212403 0.290739 0.232707 +0.229872 0.295702 0.229994 +0.238851 0.283146 0.23072 +0.237981 0.260514 0.227763 +0.248013 0.243086 0.221386 +0.245976 0.271423 0.230129 +0.237201 0.240055 0.208931 +0.239318 0.292509 0.222434 +0.244312 0.28734 0.210021 +0.234086 0.289095 0.199595 +0.221914 0.298769 0.201947 +0.1778 0.322602 0.229777 +0.232474 0.299285 0.221376 +0.223334 0.304746 0.213608 +0.207337 0.311267 0.204764 +0.224642 0.304397 0.226583 +0.214619 0.302742 0.233384 +0.203769 0.313465 0.232857 +0.204968 0.319702 0.218324 +0.201735 0.298965 0.232154 +-0.0492057 -0.0812756 -0.10551 +-0.0710597 -0.075701 -0.12067 +-0.0879497 -0.0905516 -0.13677 +-0.0843511 -0.119489 -0.147588 +-0.0762899 -0.059326 -0.102542 +-0.0985707 -0.0477827 -0.098696 +-0.118275 -0.0536394 -0.113913 +-0.11441 -0.0717159 -0.128365 +0.179503 0.303256 0.0436704 +0.192013 0.290229 0.0290644 +0.17689 0.287515 0.0370015 +0.192038 0.271729 0.0156116 +0.209167 0.267708 0.00969983 +0.200133 0.255704 0.00478026 +-0.247504 -0.392344 -0.224787 +-0.247477 -0.405986 -0.218212 +-0.243099 -0.400741 -0.206484 +-0.246703 -0.405341 -0.193269 +-0.249065 -0.417066 -0.193806 +-0.263856 -0.417281 -0.202583 +-0.253854 -0.410374 -0.185389 +-0.264275 -0.407223 -0.177693 +-0.272044 -0.40206 -0.166216 +-0.284666 -0.409799 -0.163624 +-0.28689 -0.423019 -0.170791 +-0.283285 -0.428723 -0.186577 +-0.301536 -0.424549 -0.197331 +-0.276684 -0.426319 -0.176604 +-0.270204 -0.426002 -0.18843 +-0.267033 -0.421163 -0.178871 +-0.28572 -0.431162 -0.176917 +0.0984334 0.0428629 0.147655 +0.0984512 0.0370662 0.158757 +-0.324734 -0.278381 -0.0492733 +-0.319049 -0.278035 -0.0388895 +-0.314693 -0.271902 -0.0298211 +-0.0814975 -0.486596 -0.0514846 +-0.0716057 -0.47534 -0.0576231 +-0.0807984 -0.475501 -0.0687174 +-0.0782273 -0.46782 -0.0773567 +-0.0794515 -0.454639 -0.076562 +-0.0865219 -0.442019 -0.0638219 +-0.0826697 -0.456554 -0.0896798 +-0.0913604 -0.446861 -0.0969099 +-0.0924184 -0.432044 -0.0753911 +-0.098273 -0.416607 -0.0817744 +-0.111942 -0.395187 -0.0818225 +-0.0923505 -0.401008 -0.0727607 +-0.110463 -0.376831 -0.0757945 +-0.0955645 -0.358515 -0.0727168 +-0.0748788 -0.367775 -0.053732 +-0.099584 -0.336657 -0.0718408 +-0.0617229 -0.346951 -0.0508932 +-0.0372908 -0.340191 -0.0358611 +-0.187209 -0.0514446 0.134371 +-0.172275 -0.062062 0.144345 +-0.181772 -0.0387772 0.12984 +0.27325 0.225257 0.167666 +0.283037 0.221467 0.169903 +0.141164 -0.00931766 -0.150578 +0.223335 -0.262546 -0.149684 +0.199958 -0.258684 -0.141852 +0.218212 -0.249649 -0.131577 +-0.0730224 -0.485274 -0.0383372 +-0.0765985 -0.473674 -0.025717 +-0.0833487 -0.485599 -0.0202509 +-0.0969784 -0.487241 -0.0157338 +-0.106328 -0.475595 -0.0156679 +-0.107519 -0.486132 -0.0147883 +-0.117398 -0.491224 -0.0155421 +-0.11866 -0.497871 -0.0255495 +0.192205 -0.0198585 -0.151725 +0.281772 0.238327 0.210562 +0.269826 0.243309 0.222088 +0.243244 0.207816 -0.00325363 +0.239729 0.221932 -0.000908316 +0.243256 0.225044 0.0142927 +0.235434 0.23543 0.00346349 +0.158954 -0.447934 -0.074517 +0.164 -0.440163 -0.0849532 +0.160645 -0.422992 -0.0839209 +0.160099 -0.41995 -0.0633914 +0.170063 -0.432118 -0.0580684 +0.170775 -0.442201 -0.0470561 +0.167356 -0.452883 -0.036848 +0.157537 -0.464023 -0.0432353 +0.154265 -0.458207 -0.0582632 +0.146921 -0.466798 -0.0291891 +0.17099 -0.445942 -0.0649823 +0.152813 -0.426396 -0.0985179 +0.142833 -0.435406 -0.0989063 +0.126573 -0.436557 -0.100225 +0.120949 -0.42189 -0.103936 +0.130685 -0.411647 -0.0938972 +0.160351 -0.460975 -0.0324222 +0.164884 -0.460693 -0.0398836 +0.167083 -0.430709 -0.0834012 +0.161089 -0.432508 -0.0931652 +0.165433 -0.424956 -0.0749657 +0.155909 -0.417913 -0.0743018 +0.149825 -0.407366 -0.067413 +0.142015 -0.399818 -0.0764637 +0.153043 -0.435416 -0.0966096 +0.148842 -0.431897 -0.101759 +0.145045 -0.424265 -0.10134 +0.147732 -0.418014 -0.0911084 +0.138977 -0.417451 -0.0965307 +0.139635 -0.411036 -0.0878314 +0.14174 -0.430413 -0.104765 +0.134784 -0.434536 -0.101822 +0.135086 -0.440748 -0.0918112 +0.13766 -0.447456 -0.0800542 +0.122938 -0.455334 -0.0698495 +0.127914 -0.428797 -0.106691 +0.135671 -0.430083 -0.106069 +-0.0268041 -0.304928 0.142542 +-0.0182344 -0.281255 0.151927 +0.000262015 -0.258244 0.142866 +0.0151742 -0.229959 0.128466 +-0.00970849 -0.227931 0.154073 +0.0337917 -0.209923 0.115845 +0.0199495 -0.192987 0.125832 +-0.154293 -0.0335699 -0.082135 +-0.129631 -0.0324487 -0.0813475 +-0.120097 -0.027431 -0.0586998 +-0.0956922 -0.0340394 -0.0533561 +-0.0814148 -0.0448428 -0.0722969 +-0.0594432 -0.0515596 -0.0534184 +-0.160793 -0.0482086 -0.0989707 +-0.166155 -0.0307425 -0.0663998 +-0.169924 -0.0270352 -0.0414151 +-0.183311 -0.0375758 -0.0551581 +-0.174206 -0.0274939 -0.0203147 +-0.192353 -0.0397338 -0.00141151 +-0.170447 -0.0249801 0.0063437 +-0.211587 -0.0636911 -0.00501259 +-0.0018753 -0.187141 -0.149775 +0.0183103 -0.182965 -0.142326 +0.0322217 -0.167313 -0.134641 +0.0236675 -0.146992 -0.123167 +-0.00232452 -0.142332 -0.126149 +0.0375806 -0.18533 -0.140019 +0.0530379 -0.201545 -0.137283 +0.0772348 -0.20845 -0.140694 +0.0988175 -0.224384 -0.140468 +0.119251 -0.222512 -0.162731 +0.03788 -0.218276 -0.135529 +0.0772845 -0.19139 -0.155355 +0.080882 -0.225907 -0.127445 +0.0653619 -0.242778 -0.113036 +0.0731805 -0.173068 -0.155239 +0.0897045 -0.191329 -0.166141 +0.102707 -0.199007 -0.171074 +0.119058 -0.208637 -0.176942 +0.127514 -0.196293 -0.185172 +0.13998 -0.205302 -0.190755 +0.149824 -0.215626 -0.194546 +0.161245 -0.221969 -0.199237 +0.175364 -0.230409 -0.20401 +0.173584 -0.215336 -0.204853 +0.178202 -0.198362 -0.197173 +0.188397 -0.22907 -0.211289 +0.202734 -0.22056 -0.215065 +0.199745 -0.239634 -0.214151 +0.0815106 -0.18364 -0.162988 +-0.172104 -0.359269 -0.00938238 +-0.172319 -0.335226 -0.0164663 +-0.16873 -0.368903 -0.0231312 +-0.292266 -0.291505 -0.0889456 +-0.288266 -0.299574 -0.0955502 +-0.280983 -0.308012 -0.105167 +-0.278654 -0.297571 -0.101297 +-0.274336 -0.285615 -0.103446 +-0.260134 -0.28158 -0.0989442 +-0.257005 -0.265144 -0.10215 +-0.26942 -0.305285 -0.10276 +-0.257003 -0.309674 -0.100476 +-0.244993 -0.306014 -0.0938734 +-0.249351 -0.292113 -0.0926885 +-0.25954 -0.322424 -0.104282 +-0.267093 -0.332079 -0.111051 +-0.283312 -0.328944 -0.119574 +-0.249017 -0.331591 -0.10481 +-0.232981 -0.32784 -0.100164 +-0.240291 -0.342062 -0.113719 +-0.229688 -0.345883 -0.126712 +-0.23058 -0.352629 -0.145077 +-0.21352 -0.337371 -0.127344 +-0.269191 -0.344874 -0.117105 +-0.208623 -0.327937 -0.112241 +-0.191793 -0.321843 -0.117022 +-0.180909 -0.311277 -0.104708 +0.11012 0.10505 0.0238496 +0.213679 0.221732 0.163906 +-0.0357839 -0.0025294 0.108473 +-0.0312254 -0.0135193 0.128152 +-0.0238807 -0.033229 0.139313 +-0.00300831 -0.046529 0.144036 +-0.00364169 -0.0760125 0.145155 +0.015326 -0.129347 0.142131 +-0.041062 -0.0443202 0.130625 +-0.0555252 -0.0465254 0.114753 +-0.0556686 -0.0325657 0.0996413 +-0.0768736 -0.0422105 0.0949058 +-0.0167984 0.000564353 0.123722 +0.00524698 0.0020139 0.129964 +-0.0281137 -0.0861213 0.139333 +-0.0785841 -0.0379469 0.0747431 +-0.0762529 -0.0505618 0.114297 +-0.032521 -0.108383 0.136839 +-0.0633754 -0.0458183 0.101476 +-0.0250298 0.00663901 0.112981 +-0.0219675 0.00393164 0.0935556 +-0.147404 -0.304789 -0.127071 +0.192111 0.473304 0.143665 +0.202701 0.475169 0.131787 +0.206558 0.475874 0.120017 +0.202492 0.480449 0.108775 +0.157654 -0.366957 -0.0205798 +0.26661 -0.307414 -0.281977 +0.270077 -0.295571 -0.288815 +0.283263 -0.291236 -0.297392 +0.290598 -0.279448 -0.297082 +0.304158 -0.276932 -0.29882 +0.315035 -0.2885 -0.301158 +0.307588 -0.298676 -0.297006 +0.297613 -0.307939 -0.283621 +0.293787 -0.301201 -0.295424 +0.318389 -0.297707 -0.296483 +0.328066 -0.301032 -0.289042 +0.324582 -0.309109 -0.276338 +0.33579 -0.291676 -0.2964 +0.346867 -0.288071 -0.287976 +0.353956 -0.299169 -0.28317 +0.345495 -0.307423 -0.274703 +0.352866 -0.288693 -0.277818 +0.351312 -0.284395 -0.265224 +0.355354 -0.294774 -0.257468 +0.360217 -0.304818 -0.260578 +0.35682 -0.308388 -0.269609 +0.359106 -0.312264 -0.252967 +0.356474 -0.316127 -0.245135 +0.351445 -0.319298 -0.237976 +-0.26647 -0.314705 -0.199507 +-0.27426 -0.329739 -0.204261 +-0.290128 -0.337563 -0.206145 +-0.303723 -0.332243 -0.195363 +-0.303858 -0.323407 -0.176279 +-0.302757 -0.349394 -0.210447 +-0.304665 -0.364526 -0.223447 +-0.321319 -0.375627 -0.232938 +-0.285437 -0.371465 -0.224735 +-0.28011 -0.37957 -0.242654 +-0.314609 -0.397575 -0.24523 +-0.31498 -0.344154 -0.199865 +-0.330892 -0.351901 -0.189469 +-0.332902 -0.388937 -0.243068 +-0.348245 -0.402805 -0.233911 +-0.328232 -0.404959 -0.235266 +-0.273541 -0.396265 -0.240028 +-0.293049 -0.39498 -0.245656 +-0.355214 -0.402159 -0.217135 +-0.360108 -0.415844 -0.205721 +-0.346381 -0.42668 -0.201491 +-0.340374 -0.436455 -0.180032 +-0.360217 -0.406031 -0.193698 +-0.356506 -0.391255 -0.182727 +-0.356512 -0.407116 -0.177427 +-0.347384 -0.421732 -0.172779 +-0.348669 -0.37532 -0.17511 +-0.341266 -0.408591 -0.160307 +-0.332592 -0.391247 -0.153464 +-0.323849 -0.407723 -0.153687 +-0.349384 -0.43169 -0.189135 +-0.335815 -0.43119 -0.192046 +-0.324454 -0.435806 -0.181733 +-0.331465 -0.433295 -0.170921 +-0.314528 -0.431132 -0.168412 +-0.260177 -0.397767 -0.235 +-0.252953 -0.401301 -0.227678 +-0.247407 -0.394723 -0.238053 +-0.24372 -0.401046 -0.225417 +-0.243948 -0.396615 -0.216223 +-0.258003 -0.38952 -0.247437 +-0.272162 -0.387844 -0.252537 +-0.287147 -0.384539 -0.255755 +-0.302942 -0.384129 -0.252391 +-0.315505 -0.382766 -0.24459 +-0.323099 -0.390444 -0.249836 +-0.312399 -0.390336 -0.253745 +-0.328503 -0.399215 -0.245058 +-0.340635 -0.398589 -0.24271 +-0.266346 -0.382624 -0.244488 +-0.267321 -0.391914 -0.245578 +-0.0266812 0.0695328 -0.0242573 +-0.00773299 0.0681739 -0.0184911 +0.0122858 0.0669077 -0.0123781 +0.0150035 0.0767227 0.00239352 +0.0141467 0.0954062 -0.00215996 +0.0325338 0.098411 -0.00617133 +0.0450676 0.0983028 0.010086 +0.0314473 0.0730983 0.00401189 +0.0505593 0.0686309 0.00292132 +0.0698817 0.067505 0.00832925 +0.145383 0.180744 0.0984363 +0.132189 0.17376 0.0925198 +0.121241 0.164951 0.0850023 +0.133425 0.169934 0.0774819 +0.11505 0.153676 0.07879 +-0.083942 -0.368893 -0.0674225 +-0.0809876 -0.385027 -0.0581697 +-0.0723248 -0.382058 -0.0416794 +-0.00904893 0.0914446 -0.0120745 +0.00504523 0.0987359 -0.0150796 +0.0060609 0.0932522 -0.034057 +0.0248461 0.0873188 -0.0377031 +0.0363994 0.089055 -0.023789 +0.00213821 0.0914225 -0.00482177 +0.0092558 0.0863088 0.00212053 +0.106375 0.0274106 0.14138 +-0.263884 -0.385451 -0.252252 +0.258755 0.24689 0.225661 +0.259085 0.23306 0.219814 +0.249971 0.25591 0.228242 +-0.322841 -0.345115 -0.164492 +-0.323706 -0.355326 -0.152393 +-0.279169 -0.265328 -0.0439542 +-0.285416 -0.267917 -0.0516616 +-0.294745 -0.263175 -0.0517725 +0.23393 -0.0149701 -0.10397 +0.219738 -0.0165453 -0.112039 +0.204608 -0.00981825 -0.104246 +0.187184 -0.00954937 -0.110855 +0.228145 0.230452 0.102316 +0.214447 0.238029 0.0983297 +0.23229 0.220992 0.0943503 +0.215398 0.247623 0.105271 +0.217938 0.25177 0.117669 +0.210276 0.258003 0.111405 +0.220949 0.241286 0.103103 +0.290344 -0.337843 -0.233955 +0.276226 -0.337233 -0.22831 +0.296573 -0.339782 -0.226215 +0.227663 0.461812 0.0838481 +0.234265 0.455281 0.0718225 +0.229698 0.445794 0.0603386 +0.225781 0.470182 0.0813133 +0.214396 0.4698 0.0788369 +0.208406 0.478123 0.0862021 +0.214031 0.460896 0.0711899 +0.217085 0.451741 0.0628259 +0.219354 0.474333 0.0827819 +0.21619 0.47758 0.0903862 +0.217994 0.472178 0.097233 +0.209525 0.481852 0.0939712 +0.227208 0.456115 0.0633709 +0.234329 0.451682 0.0642008 +0.23166 0.462658 0.0759848 +0.273713 -0.249314 -0.252993 +0.274317 -0.268417 -0.267071 +0.263304 -0.282613 -0.260934 +-0.240326 -0.404033 -0.2139 +-0.241182 -0.408607 -0.207233 +0.243855 0.194683 0.113624 +0.235959 0.206195 0.114609 +-0.329827 -0.30598 -0.098469 +-0.057071 -0.0425853 0.0117122 +-0.0551192 -0.0420888 0.0309046 +-0.0534835 -0.0402863 0.0500454 +-0.0435993 -0.0469165 0.00748095 +-0.0255629 -0.0374196 0.00481763 +-0.00817324 -0.0328811 -0.0061182 +-0.00350439 -0.0437548 -0.0255784 +-0.0349503 -0.0490115 -0.00492533 +-0.0419875 -0.0536475 -0.0293419 +-0.0139014 -0.0607747 -0.0378374 +-0.0105205 -0.0780801 -0.0585195 +-0.0335249 -0.0540562 -0.0180409 +-0.0278411 -0.0595083 -0.0313207 +0.193253 0.49569 0.0858481 +0.189805 0.494474 0.0949255 +0.179559 0.491992 0.0947812 +0.19709 0.487808 0.0978913 +0.174576 0.497081 0.0879734 +0.179584 0.496616 0.0784813 +0.175502 0.48892 0.0725035 +0.169475 0.481635 0.069206 +0.164994 0.474033 0.0669237 +0.155945 0.469227 0.0714265 +0.159639 0.459314 0.0671634 +0.160451 -0.0544036 0.113535 +0.0454737 -0.0938547 0.293886 +0.0481458 -0.104952 0.292926 +0.0550885 -0.114349 0.29062 +0.0654216 -0.120788 0.289843 +0.0691263 -0.126298 0.278339 +0.0372417 -0.0943784 0.286279 +0.0377118 -0.088702 0.274623 +0.179652 -0.262284 0.0054219 +0.186087 -0.244472 0.00347757 +0.246807 -0.00615903 -0.103541 +0.242297 -0.0135206 -0.100916 +0.240802 -0.0172339 -0.108388 +0.232593 -0.0188607 -0.112191 +0.240348 -0.0194541 -0.117278 +0.238974 -0.018297 -0.127651 +-0.164632 -0.397326 -0.024693 +0.0813645 -0.458079 -0.0716845 +0.302397 0.127887 0.0470846 +0.298473 0.138148 0.0455108 +0.292313 0.136477 0.0386335 +0.288054 0.130079 0.0326142 +0.28271 0.137427 0.0379629 +0.271939 0.136706 0.038053 +0.261008 0.14116 0.0404912 +0.28194 0.12422 0.0312108 +0.300876 0.126279 0.0551937 +0.295306 0.129324 0.0632115 +0.286846 0.130603 0.0706512 +0.282604 0.11846 0.0804122 +0.273418 0.134767 0.0747422 +0.296205 0.121995 0.0600976 +0.289869 0.116278 0.0576534 +0.283444 0.108666 0.0679441 +0.208186 0.435058 0.0678801 +0.218992 0.437774 0.0675136 +0.20517 0.444041 0.0615 +0.195457 0.447135 0.0675955 +0.224157 0.438328 0.0597838 +0.221367 0.446069 0.0584788 +0.168291 -0.443724 -0.076199 +-0.239169 -0.248023 -0.0426243 +-0.246509 -0.244281 -0.0523825 +-0.245933 -0.250709 -0.0701381 +-0.252213 -0.23035 -0.0598084 +-0.256922 -0.212794 -0.063622 +-0.26443 -0.20039 -0.048456 +-0.236601 -0.248665 -0.0331221 +-0.248238 -0.244973 -0.04299 +-0.257005 -0.243536 -0.0363368 +-0.264619 -0.253098 -0.0324677 +-0.260909 -0.234911 -0.0387305 +-0.270856 -0.228969 -0.0335016 +-0.268106 -0.214873 -0.0367573 +-0.255525 -0.250409 -0.0291707 +-0.246354 -0.252152 -0.0213798 +-0.25421 -0.258055 -0.0140562 +-0.253371 -0.258976 0.00135493 +-0.263391 -0.256528 0.0180325 +-0.264412 -0.265611 -0.0106557 +-0.268835 -0.263918 0.00476582 +-0.24972 -0.252323 0.0327963 +-0.239732 -0.259608 0.0493553 +-0.242639 -0.251027 0.0706418 +-0.27192 -0.270836 -0.02103 +-0.264888 -0.241199 0.0366373 +-0.279792 -0.22631 0.033251 +-0.274206 -0.207933 0.0474852 +-0.283361 -0.276288 -0.0174295 +-0.267659 -0.226048 0.0482271 +0.202151 0.274483 0.19338 +0.194908 0.283204 0.198963 +-0.157532 -0.273615 -0.179435 +-0.176899 -0.279729 -0.184503 +-0.188947 -0.290942 -0.187096 +-0.192598 -0.3074 -0.18306 +-0.203551 -0.297799 -0.190929 +-0.222085 -0.288246 -0.191352 +-0.217908 -0.303036 -0.194268 +-0.355074 -0.426501 -0.195973 +-0.354866 -0.423993 -0.205337 +-0.355569 -0.419108 -0.214528 +-0.353763 -0.412061 -0.224887 +-0.346029 -0.286085 -0.1062 +-0.341227 -0.288967 -0.0947058 +-0.336277 -0.278132 -0.0971269 +-0.328988 -0.269127 -0.105169 +-0.340297 -0.292656 -0.0831052 +-0.335578 -0.266756 -0.115188 +-0.339311 -0.299368 -0.0917431 +0.212569 0.261061 0.18216 +0.216886 0.255854 0.175009 +0.219484 0.251322 0.162982 +0.212289 0.247584 0.170006 +0.218513 0.26322 0.154269 +0.225667 0.261532 0.178216 +0.218436 0.276817 0.178562 +0.234042 0.273996 0.185236 +0.223426 0.242038 0.154678 +0.21181 0.288948 0.181391 +0.220498 0.257755 0.18435 +0.211254 0.266563 0.187703 +0.211739 0.26954 0.199826 +0.278409 -0.209413 -0.174692 +0.233056 0.457965 0.0658843 +0.227063 0.46182 0.0682472 +0.220168 0.458063 0.0666597 +-0.0481392 -0.0447802 0.0166181 +0.131516 0.0530135 0.000672445 +0.12038 0.0567042 0.000376152 +0.134766 0.046581 0.0097546 +0.0956782 -0.141364 0.26837 +0.0877085 -0.13595 0.269242 +0.0854698 -0.124959 0.261926 +0.0839071 -0.111836 0.253439 +0.0904091 -0.099649 0.239147 +0.0872053 -0.136949 0.279095 +0.085161 -0.130401 0.287023 +0.0763801 -0.13103 0.282851 +-0.00884361 -0.0890856 -0.0728998 +-0.00654069 -0.102279 -0.0895079 +-0.0290648 -0.104665 -0.111248 +-0.0100257 -0.116287 -0.107029 +0.0875054 -0.104584 0.297054 +0.191386 -0.264049 -0.175252 +0.190045 -0.262732 -0.156889 +0.204589 -0.269071 -0.178679 +0.222111 -0.273266 -0.172895 +0.189235 0.0753918 -0.0129238 +0.0782752 -0.467624 -0.0498343 +0.0759673 -0.46177 -0.0555898 +0.0772195 -0.460605 -0.0642783 +0.151932 0.323656 0.079912 +0.153175 0.313215 0.0881136 +0.161272 0.302381 0.0857396 +0.163146 0.324848 0.0718597 +0.151557 0.334415 0.0880604 +0.142886 0.334889 0.0972586 +0.140662 0.34411 0.107021 +0.133598 0.347717 0.117582 +0.131314 0.355467 0.129074 +0.127988 0.361743 0.142546 +0.123763 0.348981 0.138438 +0.119822 0.353337 0.149718 +0.116288 0.351928 0.168204 +0.226419 0.174912 -0.00671405 +0.232006 0.15884 0.00199041 +0.243933 0.169091 0.00253819 +0.237571 0.172786 -0.00612936 +0.183717 0.142245 0.147062 +0.183533 0.157982 0.153224 +0.200684 0.169917 0.154336 +0.175927 0.14817 0.154877 +0.164064 0.143191 0.159694 +0.181391 0.132744 0.149775 +0.177453 0.123521 0.157312 +0.108424 0.0602759 0.0311611 +0.101691 0.0511896 0.042029 +0.297187 0.12858 0.124591 +0.286869 0.125817 0.115842 +0.279264 0.13651 0.11071 +0.277464 0.150893 0.114839 +0.267972 0.163015 0.116989 +0.29066 -0.215317 -0.195858 +-0.0439761 -0.143405 -0.149346 +0.0959309 0.0199379 0.158053 +0.0941358 0.00844127 0.16726 +0.273991 -0.158318 0.138404 +0.280108 -0.155995 0.136908 +0.28311 -0.154668 0.131232 +0.287165 -0.152142 0.126309 +0.291082 -0.145525 0.127381 +0.258354 -0.329753 -0.2515 +0.256649 -0.327468 -0.240856 +0.265642 -0.321399 -0.233195 +0.269005 -0.32965 -0.227653 +0.204877 0.287044 0.0357487 +0.289139 -0.339472 -0.226774 +0.282728 -0.335989 -0.224475 +0.283065 -0.327384 -0.221193 +0.28398 -0.316486 -0.219293 +0.289461 -0.305296 -0.210924 +0.2738 -0.310998 -0.221733 +0.2646 -0.301502 -0.221281 +0.282981 -0.339471 -0.231684 +0.275544 -0.336339 -0.239462 +0.259131 -0.2954 -0.232139 +0.281853 -0.296955 -0.202405 +0.287258 -0.287693 -0.192682 +0.301236 -0.282638 -0.194913 +0.23745 0.0270265 -0.0333549 +0.234865 0.0358956 -0.0292661 +0.240774 0.0243245 -0.0402136 +0.034599 -0.0884904 0.28182 +0.0345637 -0.0787252 0.277243 +0.0422003 -0.0728232 0.283477 +0.048607 -0.0763619 0.292696 +0.0395236 -0.0802562 0.266836 +0.0486856 -0.0788086 0.257578 +0.044992 -0.0647291 0.254151 +0.0587204 -0.0731238 0.296598 +0.068389 -0.0812067 0.300077 +0.0829644 -0.0808872 0.290453 +0.0435251 -0.0559756 0.262078 +0.20354 0.276522 0.016541 +-0.0980428 -0.240155 0.197738 +-0.0924965 -0.26196 0.186819 +-0.109853 -0.270124 0.168775 +-0.253582 -0.386742 -0.238773 +-0.0267016 0.0982672 -0.0374627 +0.214024 0.433945 0.0622105 +0.204736 0.432758 0.058829 +0.201109 0.433103 0.0655996 +0.201809 0.436011 0.073894 +0.193477 0.433855 0.0682907 +0.185218 0.436354 0.0703184 +0.180836 0.436291 0.0819631 +0.191166 0.440882 0.0659291 +0.187348 0.447071 0.070626 +0.179215 0.453739 0.0726364 +0.193028 0.454826 0.0736221 +0.173421 0.440644 0.0776765 +-0.147031 -0.496444 -0.028386 +-0.151597 -0.495421 -0.0374969 +-0.157627 -0.484775 -0.0397619 +-0.140246 -0.499465 -0.0256815 +-0.132401 -0.5 -0.0296698 +-0.132703 -0.497498 -0.0384881 +-0.126331 -0.494492 -0.0452588 +-0.11646 -0.490117 -0.0524448 +-0.101295 -0.487303 -0.0547567 +-0.136101 -0.494007 -0.0471871 +-0.13938 -0.490039 -0.0561432 +-0.133381 -0.483866 -0.0661423 +-0.15577 -0.492035 -0.0446482 +-0.153261 -0.490282 -0.0555144 +0.197755 0.272342 0.0690149 +0.190382 0.263313 0.0560052 +0.0686632 -0.292912 -0.0237205 +0.056243 -0.29127 -0.0303266 +0.0398126 -0.298058 -0.030698 +0.0315681 -0.295788 -0.0489563 +0.043708 -0.285681 -0.061727 +0.0621136 -0.289132 -0.040881 +0.0722108 -0.295077 -0.0484755 +0.0577034 -0.286988 -0.0524253 +0.0569935 -0.281989 -0.0659264 +0.064236 -0.290328 -0.0328163 +-0.0127838 0.0757233 -0.00921143 +0.0935192 0.0772038 0.0642915 +0.169714 0.302879 0.0497006 +0.163659 0.300165 0.0640716 +0.172929 0.295611 0.0434924 +0.049865 0.0913802 0.0221499 +0.0418831 0.0808731 0.013212 +0.0368549 0.0913191 0.0145569 +0.0319565 0.0968433 0.00544037 +0.310435 0.13526 0.142507 +0.026474 0.0305763 -0.129196 +0.017822 0.0292426 -0.122273 +0.0163904 0.0280919 -0.108702 +0.0350495 0.0278097 -0.132911 +0.178361 0.286185 0.0866978 +0.184473 0.288229 0.0959947 +0.0746028 -0.0119842 0.202652 +0.0770488 -0.00198153 0.201878 +0.0861829 0.00359659 0.206228 +0.0964676 0.00912576 0.20305 +0.110414 0.00821695 0.200752 +0.119478 0.0159283 0.18886 +-0.0749585 -0.470198 -0.0703816 +-0.0722579 -0.469101 -0.0627931 +-0.0775597 -0.45771 -0.0519849 +-0.0725204 -0.466379 -0.0530837 +-0.0822617 -0.458336 -0.0360309 +0.11796 -0.00196684 -0.151498 +0.110489 0.008862 -0.155734 +0.119387 0.0273131 -0.141295 +0.100036 0.00317869 -0.149099 +0.0946498 0.00360487 -0.130289 +0.0996271 0.00897841 -0.108462 +0.0876406 0.00969553 -0.149119 +0.0889673 0.0239205 -0.144401 +0.103773 0.0275171 -0.140968 +0.112143 0.0407687 -0.122665 +0.128275 -0.00210722 -0.155193 +0.136944 0.00690927 -0.158099 +0.1315 0.01712 -0.150046 +0.148823 0.0111196 -0.154092 +0.137878 -0.00286061 -0.157253 +0.0812501 0.0180999 -0.148671 +0.0723702 0.0199576 -0.146504 +0.0894465 0.0177562 -0.14994 +-0.244247 -0.411744 -0.197734 +0.0532101 -0.0425986 0.239458 +0.0614299 -0.034607 0.250277 +0.0718515 -0.0264935 0.244569 +0.0612036 -0.0408317 0.227838 +0.211416 0.21985 0.0506815 +0.209629 0.209187 0.0516229 +0.197715 0.200596 0.0531448 +0.210711 0.212673 0.041983 +0.209533 0.205981 0.0261421 +0.207685 0.214484 0.0320655 +0.204793 0.215907 0.019768 +0.207322 0.190012 0.0316877 +0.210424 0.206724 0.0353988 +0.209086 0.197885 0.0355421 +0.19948 0.191764 0.0420701 +0.206287 0.1798 0.0239909 +0.199532 0.162119 0.0159658 +0.0889829 0.0153312 0.187549 +0.0895058 0.0194699 0.175832 +0.0997882 0.0258376 0.180178 +0.0912633 -0.43583 -0.104962 +0.0893849 -0.44209 -0.0966632 +0.0818551 -0.438899 -0.0891003 +0.0775492 -0.435915 -0.0759439 +0.0805228 -0.426773 -0.087989 +0.0848008 -0.421093 -0.0971385 +0.0844397 -0.410175 -0.0930928 +0.0796444 -0.399052 -0.082153 +0.096306 -0.399151 -0.0928503 +0.0992866 -0.434977 -0.10667 +-0.038871 -0.095203 0.134909 +-0.0453136 -0.074362 0.132403 +-0.0642973 -0.0816285 0.135216 +0.128958 0.371237 0.164377 +0.114324 0.368213 0.169385 +0.110394 0.358489 0.182698 +0.119359 0.382173 0.172221 +0.244566 0.0274799 0.091132 +0.236517 0.0321023 0.108593 +0.228129 0.0154777 0.110489 +0.243652 -0.0044318 0.106704 +0.215089 0.0116198 0.126655 +0.193164 -0.00203925 0.149761 +0.295901 -0.145148 0.11649 +0.181002 0.326878 0.162405 +0.192626 0.308402 0.164847 +0.180295 0.335983 0.171005 +0.215019 0.222685 -0.0085752 +0.216226 0.238327 -0.00679645 +0.204842 0.243639 -0.00108745 +0.197086 0.237151 0.00943393 +0.207737 0.21475 -0.00125832 +0.200663 0.225332 0.00994825 +0.227239 0.239308 -0.00361834 +0.210369 0.205349 -0.000451507 +0.212421 0.195338 0.00658041 +0.0965367 0.0723068 0.0490018 +-0.263237 -0.382248 -0.20077 +-0.334935 -0.395374 -0.246716 +0.0666968 0.0983382 0.0352739 +0.0735768 0.104043 0.0256427 +0.0854137 0.105714 0.0280147 +0.0966684 0.103408 0.0197312 +-0.293219 -0.246559 0.00868918 +-0.284829 -0.260543 0.00656712 +0.231694 -0.239358 -0.229883 +0.249173 -0.248287 -0.23972 +-0.313753 -0.278534 -0.156686 +-0.167921 -0.0222432 0.100354 +-0.166557 -0.0217484 0.0804222 +-0.137191 -0.0189498 0.0544508 +-0.183157 -0.0297007 0.0652393 +-0.193717 -0.0386652 0.0428719 +-0.162262 -0.0205653 0.0563587 +-0.148465 -0.0201145 0.071316 +-0.122512 -0.0229086 0.0762312 +-0.112808 -0.0225311 0.0535636 +-0.15755 -0.0225071 0.112728 +-0.13968 -0.0242143 0.109228 +-0.128528 -0.0323847 0.121144 +-0.137944 -0.0426964 0.133983 +0.338353 -0.331842 -0.233 +0.197716 0.0369013 -0.0158252 +0.225598 0.0269623 0.107608 +0.227611 0.0352699 0.116368 +0.216481 0.0416846 0.126455 +0.20366 0.0291575 0.127785 +0.197706 0.0139181 0.138946 +0.177004 0.0154396 0.15063 +0.196436 0.0406475 0.130552 +0.183582 0.0465791 0.137895 +0.171962 0.0340634 0.144092 +0.209838 0.0350513 0.1214 +0.122018 -0.0147207 0.202688 +0.134625 -0.010294 0.190699 +0.150345 -0.0204184 0.190322 +0.171467 -0.0443352 0.191435 +0.124137 -0.0275222 0.21069 +0.115004 -0.0324307 0.220668 +0.103488 -0.0235525 0.230568 +-0.234966 -0.250492 -0.00657503 +0.230136 -0.0629922 0.010065 +0.22781 -0.0439028 0.0052695 +0.226758 -0.0758146 -0.00318988 +0.218119 -0.0755566 -0.0185995 +0.210925 -0.0881128 -0.0299059 +0.195391 -0.0835698 -0.0397083 +0.187049 -0.0970928 -0.0513544 +0.215909 -0.10623 -0.0275177 +0.221663 -0.111792 -0.00835326 +0.21689 -0.135734 -0.006698 +0.187289 -0.0668273 -0.0361071 +0.170089 -0.0549841 -0.0384156 +0.158135 -0.0292105 -0.0224101 +0.144698 -0.0631652 -0.0561794 +0.210349 -0.156804 0.00619425 +0.122465 -0.0210506 -0.020971 +0.25102 0.0827579 -0.00901225 +0.246076 0.0717907 -0.00732438 +0.248146 0.0653429 0.00439784 +0.245544 0.0538898 0.0151974 +0.255748 0.0868229 -0.000826293 +-0.125725 -0.258433 -0.170214 +0.151089 -0.0268375 0.140451 +0.244155 0.0131187 -0.0533056 +0.246127 0.0105937 -0.0612737 +0.239403 0.00492409 -0.0645919 +0.228547 -0.00190445 -0.0800819 +0.236042 0.000460551 -0.073323 +0.244455 -0.00400961 -0.0816292 +0.225173 0.00380285 -0.0703884 +0.247885 -0.00234363 -0.0902777 +0.247838 0.00379159 -0.0839495 +0.243353 0.0148187 -0.0838177 +0.236031 0.0244971 -0.0791546 +0.225616 0.0291453 -0.0875646 +-0.29518 -0.390079 -0.254006 +-0.303646 -0.394416 -0.248506 +-0.302477 -0.403327 -0.233435 +-0.298023 -0.412267 -0.217588 +-0.29425 -0.38151 -0.250683 +-0.302074 -0.390767 -0.254186 +0.191342 0.435898 0.0636941 +-0.0964353 -0.460913 -0.0144457 +0.137532 -0.0116873 0.139128 +0.343547 -0.294973 -0.292923 +0.137424 0.0947211 0.0118894 +0.147115 0.0902563 -0.00271409 +0.147874 0.0802052 -0.0226835 +0.255027 -0.310713 -0.257667 +0.257498 -0.300887 -0.266482 +0.220835 -0.0105204 -0.15317 +0.210403 -0.014095 -0.156518 +0.204562 -0.0228168 -0.148776 +-0.117774 -0.20207 0.202016 +3 573 1212 1222 +3 2119 17 2122 +3 1330 1329 327 +3 1029 1035 1030 +3 1232 1231 734 +3 984 1228 181 +3 530 532 184 +3 532 446 184 +3 1585 1567 1584 +3 672 673 637 +3 1128 1222 241 +3 278 6 279 +3 6 282 279 +3 619 952 953 +3 234 272 274 +3 2561 1744 2562 +3 2221 2220 2219 +3 11 205 277 +3 920 93 2077 +3 528 2719 2720 +3 2140 2142 2135 +3 1371 1373 764 +3 1358 1371 764 +3 1772 523 1890 +3 2622 1646 2621 +3 2334 2261 2335 +3 990 96 988 +3 103 21 104 +3 1678 1679 31 +3 1683 1679 1678 +3 2061 2062 294 +3 745 746 462 +3 595 1082 1084 +3 1001 2187 2186 +3 2180 1001 2186 +3 213 38 214 +3 2198 2201 471 +3 2721 256 2724 +3 215 552 942 +3 552 551 942 +3 1454 1453 443 +3 984 2150 96 +3 456 1020 1019 +3 959 1946 2530 +3 623 1511 1512 +3 1783 1788 516 +3 1583 2769 2003 +3 52 1482 1483 +3 2098 52 1483 +3 2364 2370 1377 +3 2051 1496 74 +3 328 325 1759 +3 931 932 175 +3 525 567 703 +3 2001 246 2000 +3 412 1963 1964 +3 851 542 183 +3 1134 353 351 +3 1893 1892 134 +3 5 976 1106 +3 1341 1339 724 +3 80 27 1596 +3 1486 1680 174 +3 1949 1950 2615 +3 21 105 104 +3 21 103 29 +3 2176 957 1162 +3 287 2176 1162 +3 293 1937 1938 +3 1260 1862 441 +3 1752 1753 336 +3 694 1184 1182 +3 1183 694 1182 +3 1486 66 1680 +3 68 905 122 +3 259 1745 340 +3 1337 1338 449 +3 804 395 476 +3 1334 748 726 +3 1513 417 1512 +3 278 11 277 +3 276 278 277 +3 225 2117 2116 +3 257 258 76 +3 684 681 717 +3 1229 948 1227 +3 1594 1595 1975 +3 91 2070 975 +3 722 732 1230 +3 722 730 732 +3 47 280 279 +3 85 1979 2242 +3 206 153 64 +3 1997 1995 1996 +3 551 851 183 +3 76 260 1615 +3 258 260 76 +3 680 704 1501 +3 658 704 680 +3 295 17 296 +3 17 2119 296 +3 552 215 914 +3 270 268 295 +3 268 17 295 +3 1080 654 1820 +3 115 198 195 +3 1054 1047 878 +3 1517 2570 2244 +3 211 548 237 +3 1977 1595 27 +3 362 72 363 +3 672 655 671 +3 82 167 157 +3 1131 639 1168 +3 438 1403 1408 +3 802 801 396 +3 177 2658 459 +3 158 2097 156 +3 1654 1656 1655 +3 1656 1277 1655 +3 1496 141 1495 +3 2140 2133 2142 +3 357 2133 2140 +3 565 532 529 +3 64 263 273 +3 137 363 378 +3 377 137 378 +3 117 901 900 +3 375 374 136 +3 88 2562 2563 +3 83 1296 1303 +3 1816 690 1819 +3 1639 582 708 +3 643 600 1805 +3 501 498 500 +3 1852 1260 54 +3 1703 1577 515 +3 1166 1067 1066 +3 42 1822 1825 +3 21 67 106 +3 81 80 84 +3 20 105 118 +3 20 155 105 +3 67 21 255 +3 1013 257 1014 +3 258 257 65 +3 647 888 1662 +3 2018 116 2017 +3 1144 400 1145 +3 126 1612 1615 +3 163 1891 162 +3 120 163 162 +3 2770 376 375 +3 1793 1890 523 +3 508 509 411 +3 1141 752 304 +3 1254 1022 1257 +3 864 1813 1812 +3 2681 1813 864 +3 572 1219 1218 +3 1670 1036 1669 +3 157 167 51 +3 791 1557 1558 +3 748 728 463 +3 727 728 748 +3 994 996 61 +3 279 280 11 +3 917 93 916 +3 588 2296 1319 +3 1302 1475 1479 +3 68 122 118 +3 237 535 553 +3 138 363 901 +3 1533 1559 1532 +3 263 1717 267 +3 2076 2077 93 +3 6 272 282 +3 2550 63 245 +3 235 316 318 +3 40 84 80 +3 84 40 104 +3 776 1354 1353 +3 1356 776 1353 +3 169 262 264 +3 1983 169 264 +3 21 106 105 +3 942 182 1737 +3 942 943 182 +3 1891 163 164 +3 67 248 106 +3 282 234 47 +3 63 2002 245 +3 313 234 274 +3 433 434 187 +3 1743 1744 344 +3 1159 2427 2428 +3 2455 592 1100 +3 1481 1302 1479 +3 2 1134 1135 +3 1060 2506 2507 +3 1808 218 1806 +3 1733 995 1729 +3 263 267 273 +3 437 1424 1244 +3 524 2718 528 +3 2718 2717 528 +3 118 105 106 +3 163 120 121 +3 71 131 164 +3 63 246 2002 +3 1891 164 1892 +3 2051 2049 2050 +3 2281 2428 2282 +3 253 106 248 +3 253 68 106 +3 683 659 668 +3 1495 75 2131 +3 987 179 989 +3 262 24 264 +3 2018 2017 930 +3 1721 169 1484 +3 124 1014 76 +3 276 277 64 +3 429 150 428 +3 2221 2753 2185 +3 816 405 476 +3 1496 236 74 +3 1991 1573 2607 +3 2693 902 895 +3 902 897 895 +3 375 376 135 +3 132 72 362 +3 281 109 292 +3 109 281 318 +3 223 83 1303 +3 74 379 374 +3 2051 2050 141 +3 2222 2674 2220 +3 1132 1435 1434 +3 410 812 811 +3 2620 1638 707 +3 126 1615 260 +3 997 34 989 +3 897 1988 1986 +3 98 1312 274 +3 926 1764 929 +3 143 2128 2132 +3 23 233 78 +3 601 798 705 +3 336 1487 331 +3 1487 1488 331 +3 1345 1338 725 +3 1588 16 1587 +3 545 92 547 +3 2190 2222 2185 +3 2232 2578 2577 +3 376 72 135 +3 1793 1781 1890 +3 277 205 206 +3 169 82 1484 +3 264 24 265 +3 307 152 941 +3 309 307 941 +3 567 563 176 +3 266 1984 1499 +3 235 315 316 +3 1892 164 134 +3 1895 2384 1476 +3 162 158 120 +3 1461 1465 1460 +3 754 901 117 +3 138 901 754 +3 949 1228 984 +3 985 949 984 +3 2666 698 2668 +3 443 186 444 +3 1719 153 908 +3 255 21 29 +3 84 167 81 +3 1280 2382 2680 +3 2732 79 850 +3 145 361 2139 +3 1320 1321 2267 +3 68 118 106 +3 1041 1036 1670 +3 2769 1582 1702 +3 1228 1229 1227 +3 1334 727 748 +3 920 915 93 +3 823 393 822 +3 508 387 509 +3 761 1185 2125 +3 831 829 485 +3 558 1352 178 +3 558 1351 1352 +3 897 902 1988 +3 637 1131 1136 +3 672 637 1136 +3 1247 1240 1251 +3 2711 2710 1430 +3 500 497 501 +3 1687 1210 1209 +3 1339 449 1338 +3 1394 1023 441 +3 927 926 928 +3 1852 1851 1259 +3 1851 1854 1259 +3 2729 2732 240 +3 999 985 991 +3 2658 2704 190 +3 1467 2760 1456 +3 263 1714 1717 +3 263 1715 1714 +3 345 329 1137 +3 1135 1134 352 +3 1511 555 1512 +3 2042 115 2023 +3 142 1491 1492 +3 1484 1710 1721 +3 210 972 973 +3 318 317 109 +3 318 316 317 +3 2078 2074 208 +3 1013 123 257 +3 206 59 908 +3 1767 240 846 +3 855 221 1807 +3 544 855 1807 +3 87 342 1747 +3 619 913 620 +3 391 801 804 +3 975 974 973 +3 2013 990 932 +3 990 175 932 +3 1791 2740 2741 +3 277 206 64 +3 522 1689 1688 +3 2768 1699 2767 +3 1699 2768 1583 +3 1105 1103 1104 +3 189 2589 2590 +3 800 391 584 +3 1774 1780 1790 +3 474 814 388 +3 2155 1047 1046 +3 514 513 1573 +3 320 2054 2060 +3 474 475 507 +3 1177 771 1178 +3 551 183 943 +3 1224 1225 947 +3 1889 254 101 +3 1916 598 2254 +3 124 1012 1013 +3 272 98 274 +3 224 1609 1610 +3 48 312 313 +3 537 2724 2725 +3 2724 537 536 +3 1894 1893 466 +3 1807 1806 978 +3 792 2234 2233 +3 306 39 310 +3 39 306 319 +3 1528 1530 1535 +3 1580 1699 1579 +3 408 952 619 +3 2515 2329 2328 +3 539 852 853 +3 457 437 1246 +3 527 1508 2736 +3 1256 448 1255 +3 1674 2166 2171 +3 507 387 508 +3 1701 1700 1704 +3 1700 1580 1704 +3 1641 1642 582 +3 461 560 2656 +3 174 927 928 +3 261 1753 1752 +3 1753 261 1754 +3 378 72 376 +3 363 72 378 +3 128 2243 1982 +3 2528 135 2529 +3 128 1982 1984 +3 1119 2183 287 +3 889 1660 1374 +3 135 132 2529 +3 76 1014 257 +3 117 900 899 +3 132 135 72 +3 906 139 907 +3 125 76 1615 +3 76 125 124 +3 735 734 743 +3 30 539 541 +3 30 538 539 +3 393 824 822 +3 259 1748 1746 +3 340 1743 1750 +3 172 551 552 +3 1139 330 1137 +3 1753 1487 336 +3 2664 2663 698 +3 1748 1749 258 +3 229 1377 2373 +3 280 281 12 +3 2133 2134 2142 +3 1686 1849 1847 +3 586 1694 1081 +3 1067 1166 639 +3 1147 422 1086 +3 11 278 279 +3 917 1328 212 +3 1623 713 3 +3 2370 2364 2363 +3 177 2657 2703 +3 2091 2090 2089 +3 319 317 39 +3 317 316 39 +3 752 14 753 +3 6 271 272 +3 2168 1045 1049 +3 1056 2159 2158 +3 1796 521 1515 +3 589 693 779 +3 694 693 2125 +3 233 23 428 +3 798 718 681 +3 235 281 47 +3 234 235 47 +3 23 1160 2308 +3 2188 2674 2223 +3 2677 2676 830 +3 235 318 281 +3 815 388 806 +3 507 508 474 +3 1658 1471 490 +3 1275 1656 1654 +3 190 2711 2712 +3 1136 1131 1168 +3 833 838 410 +3 838 1181 410 +3 1895 1894 466 +3 138 754 752 +3 22 2066 299 +3 308 753 1016 +3 1648 584 587 +3 1145 1648 587 +3 1768 2729 240 +3 2729 1768 520 +3 377 378 376 +3 1746 1748 65 +3 1726 1725 196 +3 2089 2090 968 +3 299 2066 2065 +3 901 137 900 +3 25 331 1000 +3 235 234 314 +3 1160 78 1025 +3 1161 317 319 +3 146 427 799 +3 2281 1169 3 +3 635 667 675 +3 752 1141 14 +3 2702 2705 416 +3 1210 573 572 +3 1212 573 1210 +3 2182 2219 2188 +3 2360 716 2361 +3 533 183 542 +3 608 1194 392 +3 1398 2327 2440 +3 837 148 835 +3 954 148 837 +3 180 329 346 +3 672 1136 655 +3 339 325 328 +3 1427 1412 1632 +3 2660 1819 690 +3 172 552 922 +3 942 551 943 +3 533 542 531 +3 1737 215 942 +3 333 90 335 +3 2471 781 2476 +3 925 1764 927 +3 1264 309 941 +3 2475 950 781 +3 1142 590 1144 +3 927 174 925 +3 322 1728 1727 +3 2276 2288 2426 +3 1808 1810 1809 +3 1730 1732 2566 +3 221 855 856 +3 345 1137 1757 +3 807 806 388 +3 291 1071 1070 +3 1111 1956 1959 +3 1762 1761 1114 +3 2281 2282 1169 +3 1958 1010 286 +3 1751 77 1749 +3 507 818 842 +3 415 837 2706 +3 1257 1022 1249 +3 1460 1465 481 +3 2730 2728 535 +3 566 740 732 +3 2057 2056 297 +3 186 1135 352 +3 1435 1411 439 +3 467 133 751 +3 590 1142 809 +3 150 233 428 +3 2317 713 2318 +3 1645 1640 1639 +3 496 784 2602 +3 1498 2692 145 +3 2695 144 896 +3 371 1967 1270 +3 1226 983 181 +3 1023 1260 441 +3 1270 1272 1279 +3 898 1986 1190 +3 837 835 413 +3 753 751 752 +3 138 752 751 +3 2715 435 1698 +3 787 1559 1533 +3 2600 2603 1570 +3 818 507 475 +3 778 2480 2481 +3 1181 838 414 +3 2713 1430 2709 +3 435 2713 2709 +3 1213 1216 1214 +3 392 1192 610 +3 237 548 549 +3 1203 527 1204 +3 1439 1469 2633 +3 1469 189 2633 +3 1775 1791 2741 +3 1080 1076 654 +3 1706 2262 2261 +3 496 495 1 +3 1232 733 1231 +3 524 525 703 +3 622 618 556 +3 391 587 584 +3 2125 1185 694 +3 499 495 496 +3 614 1201 1202 +3 823 512 796 +3 292 2060 293 +3 214 342 87 +3 851 852 542 +3 852 851 540 +3 2765 1058 1127 +3 211 545 546 +3 121 477 119 +3 782 618 409 +3 1317 608 1318 +3 417 616 622 +3 1515 2736 526 +3 408 951 952 +3 955 2705 2701 +3 1659 1467 1658 +3 617 2480 1171 +3 2668 706 2666 +3 891 769 885 +3 1415 2618 1697 +3 2302 2303 426 +3 1345 1339 1338 +3 525 526 1352 +3 453 434 452 +3 1701 1702 1582 +3 1700 1701 1582 +3 1897 846 1898 +3 1256 1254 453 +3 399 1320 1643 +3 420 2246 1550 +3 2246 420 1521 +3 666 664 669 +3 1466 480 479 +3 1446 1659 1658 +3 620 910 408 +3 842 2677 830 +3 452 1627 451 +3 461 746 745 +3 465 1430 2713 +3 733 1019 731 +3 907 2048 140 +3 1213 522 1216 +3 838 954 414 +3 406 809 1142 +3 737 738 736 +3 447 444 445 +3 2727 534 2722 +3 574 1220 1218 +3 459 2712 191 +3 596 2661 2660 +3 1142 1144 587 +3 625 1389 1390 +3 567 176 703 +3 1387 1388 649 +3 1796 1515 239 +3 1087 604 624 +3 1773 1217 521 +3 460 459 191 +3 1502 559 558 +3 191 457 454 +3 699 579 702 +3 671 674 634 +3 1020 1346 478 +3 2718 176 2717 +3 460 177 459 +3 609 1355 1354 +3 623 622 556 +3 2318 1618 2317 +3 1627 1457 384 +3 2723 535 2722 +3 746 177 460 +3 478 731 1019 +3 981 1540 1542 +3 529 532 530 +3 776 609 1354 +3 2603 2600 2601 +3 1460 483 147 +3 565 563 564 +3 746 460 462 +3 410 814 832 +3 741 744 462 +3 564 532 565 +3 604 661 1805 +3 1767 1768 240 +3 832 833 410 +3 418 796 512 +3 1451 1659 1446 +3 2302 426 2305 +3 761 2125 589 +3 623 556 1510 +3 475 474 388 +3 815 475 388 +3 1523 1520 1525 +3 1559 1518 789 +3 549 46 550 +3 698 2666 2665 +3 495 499 516 +3 788 1559 1549 +3 1209 572 1211 +3 1585 1584 1568 +3 2732 847 240 +3 2036 2021 2035 +3 123 128 257 +3 128 123 963 +3 1723 1724 580 +3 548 46 549 +3 273 2738 64 +3 1776 1778 2751 +3 1778 1779 2751 +3 501 504 498 +3 707 1638 579 +3 1560 1586 1584 +3 503 496 513 +3 2234 2235 390 +3 805 2239 2237 +3 816 475 815 +3 1586 1562 505 +3 1733 324 1734 +3 1527 1528 1522 +3 870 1050 1049 +3 1797 2749 2748 +3 532 185 446 +3 601 1067 719 +3 2661 651 685 +3 1510 557 1509 +3 1779 518 569 +3 2469 1724 397 +3 2744 2746 2743 +3 239 1770 1796 +3 1770 1771 1796 +3 751 750 138 +3 1 495 849 +3 1068 625 1390 +3 1069 625 1068 +3 742 741 462 +3 801 395 804 +3 1084 1082 1083 +3 400 1084 1083 +3 1018 456 1019 +3 852 538 542 +3 538 531 542 +3 809 808 173 +3 727 560 561 +3 1348 560 727 +3 729 747 566 +3 747 744 566 +3 1335 562 1347 +3 1334 1335 1347 +3 453 1254 54 +3 1195 2482 424 +3 815 2240 816 +3 238 528 534 +3 241 1222 1213 +3 1579 497 936 +3 50 735 743 +3 733 722 1231 +3 538 537 531 +3 537 538 30 +3 899 1987 898 +3 222 539 853 +3 539 538 852 +3 713 1617 3 +3 211 546 548 +3 543 541 539 +3 222 543 539 +3 2452 2451 1677 +3 543 544 545 +3 222 544 543 +3 1161 110 2063 +3 211 543 545 +3 943 944 182 +3 547 546 545 +3 2744 2743 2745 +3 216 915 918 +3 172 922 923 +3 853 540 854 +3 853 852 540 +3 46 202 550 +3 1079 95 660 +3 172 540 551 +3 148 954 838 +3 1502 558 1504 +3 740 50 743 +3 2745 1707 2747 +3 559 560 450 +3 178 1506 1505 +3 1504 558 178 +3 2570 149 2244 +3 663 636 691 +3 569 1775 2750 +3 725 749 478 +3 703 176 2718 +3 883 880 763 +3 176 563 565 +3 400 1323 585 +3 554 1513 1506 +3 1687 1688 1210 +3 740 743 732 +3 723 1232 734 +3 1371 767 1372 +3 1358 767 1371 +3 1340 564 563 +3 449 1340 563 +3 705 1064 601 +3 705 630 1064 +3 1074 654 1076 +3 582 1640 1641 +3 703 2718 524 +3 1323 400 1083 +3 1146 1084 400 +3 596 650 2661 +3 2632 2631 575 +3 771 609 912 +3 609 771 770 +3 912 620 913 +3 1922 1921 755 +3 678 695 603 +3 661 644 643 +3 730 722 731 +3 831 488 829 +3 675 667 634 +3 616 615 1179 +3 615 616 417 +3 842 488 507 +3 695 678 633 +3 564 711 185 +3 1068 593 1069 +3 1822 107 57 +3 812 407 811 +3 634 670 671 +3 2345 2344 1200 +3 898 117 899 +3 1203 571 1202 +3 656 677 673 +3 2649 1818 594 +3 408 619 620 +3 2734 2733 1204 +3 647 1662 889 +3 618 0 619 +3 678 676 633 +3 672 656 673 +3 596 2660 2662 +3 1804 600 1803 +3 696 708 582 +3 708 696 1094 +3 393 796 826 +3 1362 1369 1361 +3 1368 1369 1362 +3 407 2475 825 +3 1318 608 607 +3 1149 614 1220 +3 2173 2172 1042 +3 0 913 619 +3 2660 2661 685 +3 2668 2667 578 +3 731 722 733 +3 2733 1208 2737 +3 1343 451 1342 +3 2347 1206 1201 +3 843 2672 831 +3 2319 713 1622 +3 1149 1148 614 +3 2348 2340 1198 +3 2269 2270 586 +3 613 1513 554 +3 555 1513 1512 +3 742 50 741 +3 1143 1142 587 +3 1178 1179 617 +3 1179 1178 616 +3 2542 2541 1623 +3 618 619 409 +3 1371 1372 768 +3 403 1353 1317 +3 1356 1353 403 +3 144 2140 2135 +3 1350 450 1349 +3 1466 2137 354 +3 137 377 1163 +3 782 556 618 +3 668 691 636 +3 666 669 670 +3 2749 1776 2750 +3 1067 720 719 +3 652 1184 1185 +3 635 676 678 +3 1684 1685 658 +3 811 388 814 +3 669 665 656 +3 665 677 656 +3 2346 1192 611 +3 605 644 661 +3 663 593 664 +3 636 664 666 +3 709 1094 1093 +3 767 1358 1355 +3 756 1921 1922 +3 595 1084 1085 +3 1986 898 1987 +3 1180 1181 414 +3 706 579 699 +3 1417 1404 2326 +3 635 678 683 +3 670 669 656 +3 667 668 636 +3 634 667 666 +3 667 636 666 +3 635 668 667 +3 1916 1918 598 +3 814 410 811 +3 691 626 663 +3 1080 1075 1076 +3 634 666 670 +3 664 593 665 +3 1638 1639 708 +3 882 646 879 +3 1685 705 658 +3 635 683 668 +3 144 358 2140 +3 1905 1904 893 +3 704 658 705 +3 1858 1244 1857 +3 729 566 732 +3 719 720 640 +3 604 1087 1079 +3 1349 450 1348 +3 2148 680 1501 +3 855 544 222 +3 715 1624 2541 +3 1777 1794 2746 +3 745 744 561 +3 879 692 880 +3 1131 637 1130 +3 487 827 2676 +3 1545 1534 1561 +3 963 962 251 +3 488 842 830 +3 1172 1173 1177 +3 1554 1556 791 +3 2543 2538 1625 +3 1723 1636 2006 +3 990 988 175 +3 857 221 856 +3 1664 221 857 +3 730 463 729 +3 463 728 729 +3 564 185 532 +3 356 2127 2126 +3 463 730 731 +3 1363 766 1365 +3 744 747 561 +3 729 732 730 +3 741 566 744 +3 566 741 740 +3 1576 514 1991 +3 876 2160 2161 +3 771 1173 770 +3 954 837 415 +3 50 740 741 +3 1230 734 1231 +3 749 731 478 +3 901 363 137 +3 463 731 749 +3 749 726 748 +3 463 749 748 +3 750 363 138 +3 1919 1920 756 +3 1386 2662 1389 +3 573 803 94 +3 879 760 692 +3 1439 2488 1132 +3 885 884 763 +3 404 774 1368 +3 952 415 953 +3 588 1319 1320 +3 2657 177 2655 +3 771 1177 1173 +3 620 912 909 +3 437 465 1423 +3 780 589 779 +3 763 891 885 +3 411 833 832 +3 807 811 407 +3 803 821 395 +3 1353 775 1317 +3 1018 1233 1234 +3 791 1555 1554 +3 2682 2681 864 +3 963 123 962 +3 701 1094 1095 +3 2313 1017 2312 +3 1554 419 1556 +3 285 2175 231 +3 1673 2172 2173 +3 353 2130 351 +3 391 800 801 +3 405 804 476 +3 952 954 415 +3 775 2484 1317 +3 1209 1208 243 +3 2234 2576 2233 +3 811 807 388 +3 1181 1180 812 +3 833 148 838 +3 476 819 817 +3 390 2575 2576 +3 1125 2477 951 +3 817 819 818 +3 816 817 475 +3 816 476 817 +3 803 394 821 +3 817 818 475 +3 1208 571 2737 +3 395 821 476 +3 393 823 796 +3 2232 827 795 +3 829 390 485 +3 2677 487 2676 +3 796 827 826 +3 954 951 414 +3 951 954 952 +3 2125 693 589 +3 1181 812 410 +3 1940 2572 1120 +3 485 844 843 +3 1901 1900 847 +3 540 851 551 +3 16 2604 1590 +3 1046 2156 2155 +3 1583 2768 2769 +3 854 222 853 +3 976 865 1106 +3 2190 2185 2754 +3 238 534 2727 +3 2291 2292 863 +3 2166 2162 1044 +3 1136 1168 655 +3 871 1053 1033 +3 2043 2042 934 +3 1164 44 359 +3 873 2292 2766 +3 2161 2160 2163 +3 1049 1050 1032 +3 912 913 771 +3 305 14 1141 +3 621 911 910 +3 2691 2690 300 +3 2349 2350 612 +3 692 760 1917 +3 1903 1904 1364 +3 1140 303 1141 +3 904 117 898 +3 754 117 904 +3 929 1764 1763 +3 752 754 904 +3 213 908 59 +3 909 910 620 +3 1127 868 1126 +3 77 336 1124 +3 915 216 914 +3 915 914 916 +3 999 996 949 +3 1389 1815 1390 +3 1736 1737 182 +3 1073 1122 1123 +3 1411 438 1409 +3 962 961 251 +3 1491 1493 1492 +3 2704 2658 2703 +3 1878 1879 2433 +3 394 2762 820 +3 821 394 820 +3 2707 413 2704 +3 415 2706 955 +3 1006 471 1003 +3 288 1071 958 +3 71 130 131 +3 2219 1002 2218 +3 2047 338 2048 +3 1622 713 1623 +3 2516 2329 2515 +3 2403 2193 2404 +3 2193 2403 2194 +3 1223 2330 946 +3 2674 2188 2220 +3 2429 2301 2298 +3 124 1013 1014 +3 247 254 60 +3 471 1001 1003 +3 2187 1001 471 +3 2344 611 1199 +3 2033 991 2032 +3 123 905 962 +3 905 123 1013 +3 1204 2735 2734 +3 1239 1835 1836 +3 924 1678 1677 +3 1107 863 1108 +3 866 1107 1108 +3 2316 1618 2315 +3 1035 1036 1041 +3 2764 2763 1128 +3 1983 264 86 +3 1981 1983 86 +3 2104 1295 2105 +3 2373 2371 1268 +3 1377 2371 2373 +3 2191 2225 2210 +3 1291 1151 1286 +3 993 61 992 +3 1250 1853 1686 +3 2110 1296 228 +3 2419 887 2417 +3 1271 1270 1266 +3 371 1270 1271 +3 1607 1608 1152 +3 1607 469 1608 +3 2117 225 2118 +3 2531 1521 1523 +3 1372 892 768 +3 2069 203 2070 +3 2597 2600 2598 +3 2597 1572 2600 +3 979 978 977 +3 979 977 220 +3 920 423 918 +3 423 920 968 +3 2646 2141 2138 +3 968 920 219 +3 113 2059 2057 +3 2447 919 1993 +3 1993 216 2447 +3 216 918 2447 +3 57 1823 1822 +3 2164 2167 2165 +3 207 2078 213 +3 768 2254 598 +3 2254 768 881 +3 2082 973 972 +3 547 972 210 +3 334 1885 1884 +3 1331 2081 212 +3 974 546 210 +3 2076 2075 209 +3 1752 336 1751 +3 1329 212 1328 +3 867 1669 1666 +3 280 58 11 +3 58 280 1935 +3 1812 1813 218 +3 1813 977 218 +3 1809 1812 218 +3 996 1229 949 +3 1994 1993 1992 +3 2091 2093 2090 +3 2093 2091 220 +3 2095 976 969 +3 976 971 969 +3 2090 2093 969 +3 2093 2095 969 +3 2095 2093 2094 +3 1616 545 544 +3 1993 919 1992 +3 2093 220 2094 +3 1818 599 1817 +3 1766 1574 1765 +3 1578 1766 1765 +3 923 922 1994 +3 982 315 232 +3 302 2688 2065 +3 2688 299 2065 +3 2126 2127 2143 +3 1526 1522 790 +3 1527 1526 1520 +3 727 561 728 +3 2724 256 2725 +3 2669 697 2664 +3 697 2663 2664 +3 1538 1537 55 +3 1533 1537 1538 +3 1530 1528 1527 +3 347 1968 1995 +3 1520 1529 1527 +3 2246 2247 1550 +3 2247 2246 794 +3 674 655 1629 +3 1630 674 1629 +3 1524 420 981 +3 2244 149 2249 +3 2245 2244 2249 +3 2689 2685 2690 +3 2689 2687 2685 +3 22 297 298 +3 2652 695 633 +3 785 2652 633 +3 2595 1969 2593 +3 1969 1970 2593 +3 315 39 316 +3 315 982 39 +3 982 310 39 +3 1390 1815 599 +3 37 194 1726 +3 2049 2051 140 +3 1118 2214 1946 +3 987 988 96 +3 988 987 989 +3 1681 9 1679 +3 996 999 61 +3 66 1683 1680 +3 988 928 175 +3 928 988 34 +3 928 931 175 +3 297 2056 294 +3 442 1457 1458 +3 442 2739 1457 +3 194 994 993 +3 2154 1047 2155 +3 1674 1673 1043 +3 983 179 987 +3 179 983 421 +3 332 89 1138 +3 332 1489 89 +3 693 1183 2473 +3 1183 173 2473 +3 2059 2058 2057 +3 989 34 988 +3 1696 1061 1666 +3 928 926 931 +3 33 346 345 +3 33 998 346 +3 1028 1030 858 +3 1028 2511 1030 +3 1883 2636 2645 +3 2636 1882 2645 +3 1159 2428 2281 +3 991 985 986 +3 985 96 986 +3 142 1488 1489 +3 1490 142 1489 +3 1490 333 335 +3 732 743 1230 +3 38 1331 343 +3 925 924 1682 +3 1864 1262 1861 +3 1676 4 201 +3 2047 127 1611 +3 127 1613 1611 +3 920 918 915 +3 194 37 994 +3 1728 1733 1729 +3 1754 328 1757 +3 350 34 997 +3 326 350 997 +3 772 1176 1366 +3 1230 743 734 +3 1488 1000 331 +3 2561 88 2565 +3 322 196 99 +3 994 995 996 +3 997 989 179 +3 998 997 179 +3 998 326 997 +3 2136 355 2137 +3 1740 1739 323 +3 998 179 421 +3 346 998 421 +3 33 326 998 +3 985 999 949 +3 350 99 196 +3 1027 862 1028 +3 2769 1703 2003 +3 2601 2602 1571 +3 958 291 1115 +3 1071 291 958 +3 1956 1955 1112 +3 2268 1323 2270 +3 1999 248 247 +3 248 67 247 +3 2197 1004 2199 +3 2196 2206 2207 +3 1936 1932 1933 +3 1936 112 1932 +3 1530 980 1531 +3 1535 1530 1531 +3 2202 2199 2200 +3 70 124 125 +3 1012 124 70 +3 2025 992 2039 +3 2038 2025 2039 +3 2188 1003 2182 +3 1959 1957 1960 +3 1962 349 1957 +3 2183 959 2184 +3 77 1392 260 +3 41 1997 1996 +3 1012 905 1013 +3 122 905 1012 +3 70 122 1012 +3 349 1112 2209 +3 2205 2196 2200 +3 2205 2200 1004 +3 2664 698 2665 +3 141 2050 2053 +3 2317 2316 1617 +3 2317 1618 2316 +3 1008 2209 2204 +3 2295 1318 1319 +3 403 1318 2295 +3 704 705 681 +3 2297 1155 1599 +3 829 488 2675 +3 488 830 2675 +3 286 1010 1009 +3 1008 2202 2200 +3 1011 2187 471 +3 2201 1011 471 +3 2557 165 2556 +3 2197 2198 1006 +3 2199 2198 2197 +3 2365 2364 2366 +3 1893 1894 1892 +3 102 40 107 +3 2390 1280 53 +3 1280 2390 2386 +3 983 2150 984 +3 2073 2069 2070 +3 2073 207 2069 +3 307 309 1016 +3 753 307 1016 +3 307 753 14 +3 1845 1846 1248 +3 2341 1197 2342 +3 735 738 1235 +3 738 735 736 +3 1018 1019 733 +3 736 735 50 +3 50 742 736 +3 452 1256 453 +3 1334 1347 727 +3 478 1019 1020 +3 736 742 739 +3 455 736 739 +3 1838 1837 192 +3 1837 1838 1239 +3 1690 1688 1516 +3 1023 440 187 +3 1254 1253 1022 +3 451 448 1256 +3 926 929 2019 +3 929 930 2019 +3 2052 2053 2050 +3 2053 2052 1492 +3 335 1494 1493 +3 2697 1675 1670 +3 1669 2697 1670 +3 434 453 1023 +3 187 434 1023 +3 457 465 437 +3 700 1121 1091 +3 1024 840 841 +3 1091 1121 839 +3 1942 2574 1940 +3 2680 2380 369 +3 2380 2680 2382 +3 1523 1521 1524 +3 2533 2534 1170 +3 2248 794 2231 +3 1074 1123 654 +3 689 2312 2311 +3 702 840 1024 +3 341 1744 1745 +3 1744 340 1745 +3 1161 319 110 +3 189 2635 2633 +3 2062 2061 2063 +3 2076 93 917 +3 2075 2074 2079 +3 2074 91 2079 +3 1228 1227 181 +3 1675 2174 1671 +3 1046 2164 2163 +3 1673 2173 2174 +3 2173 1042 2174 +3 2496 2504 1039 +3 189 2590 2591 +3 375 136 2770 +3 872 1031 1030 +3 1707 2261 2333 +3 2332 1707 2333 +3 2154 1055 2153 +3 1055 2159 2153 +3 1233 733 1232 +3 1812 1809 1811 +3 497 1575 501 +3 2311 2312 712 +3 1617 2311 712 +3 380 1163 377 +3 1031 871 1033 +3 1031 1032 871 +3 1235 723 735 +3 859 1028 858 +3 1034 859 858 +3 1033 1034 858 +3 1935 2486 58 +3 859 1027 1028 +3 1282 2716 1485 +3 1798 1283 1271 +3 365 1798 1271 +3 935 2010 2018 +3 1670 1671 1041 +3 1412 1427 2618 +3 1427 1416 2618 +3 2157 1055 2156 +3 1035 869 1036 +3 28 1596 1594 +3 1827 28 1594 +3 2022 2041 2040 +3 2157 2158 2159 +3 2169 2168 1048 +3 2168 2169 877 +3 1093 701 2498 +3 1166 602 1167 +3 1166 1063 602 +3 969 423 968 +3 656 672 671 +3 786 602 1063 +3 629 786 1063 +3 657 2149 1017 +3 2149 2314 1017 +3 423 969 971 +3 1057 2151 2766 +3 866 1103 1105 +3 1107 866 1105 +3 35 2025 2024 +3 2025 197 2024 +3 2129 355 2128 +3 330 1753 1754 +3 2011 2029 2028 +3 2029 2012 2028 +3 1045 2167 2164 +3 1044 2162 2161 +3 1046 1047 870 +3 1831 1756 261 +3 871 1051 1053 +3 1712 154 1711 +3 2505 2504 1038 +3 2727 2722 535 +3 1702 1701 1581 +3 614 2345 1200 +3 237 541 211 +3 1045 870 1049 +3 2167 2168 877 +3 1048 1049 1032 +3 1705 1704 570 +3 2087 2086 965 +3 1678 31 1677 +3 2509 1029 2510 +3 1029 2511 2510 +3 2504 2496 1059 +3 2496 2497 1059 +3 1031 872 1032 +3 1032 1050 871 +3 1050 1051 871 +3 1050 1054 1051 +3 1053 861 1033 +3 1030 1031 858 +3 1031 1033 858 +3 1052 861 1053 +3 1047 2291 878 +3 2291 1047 874 +3 1964 1441 2487 +3 1054 1050 870 +3 1703 506 2264 +3 1577 1703 2264 +3 1811 861 1052 +3 1785 1787 1786 +3 1054 878 1051 +3 2013 2014 2030 +3 1052 1051 878 +3 2190 1009 2189 +3 2092 967 965 +3 2088 2089 968 +3 2088 967 2089 +3 2614 2612 2604 +3 2614 2603 2612 +3 2163 1044 2161 +3 2158 2157 876 +3 2640 2639 9 +3 2022 2035 2034 +3 2005 2253 2254 +3 881 2005 2254 +3 1002 2181 2183 +3 671 670 656 +3 938 1976 1973 +3 198 1883 195 +3 2765 873 2766 +3 1104 862 1027 +3 921 1104 1027 +3 2502 2504 1059 +3 638 1168 1167 +3 1168 639 1167 +3 2220 2188 2219 +3 2766 2151 1058 +3 2151 868 1058 +3 239 526 525 +3 1515 526 239 +3 219 2085 2087 +3 2085 2086 2087 +3 2032 991 986 +3 2096 2082 972 +3 2560 1739 1742 +3 2161 2162 876 +3 2010 2043 934 +3 935 2043 2010 +3 1681 1683 66 +3 629 1063 1064 +3 1065 629 1064 +3 665 1065 630 +3 1065 1064 630 +3 593 1065 665 +3 1089 2464 2462 +3 1167 639 1166 +3 1064 1066 601 +3 1064 1063 1066 +3 1167 633 638 +3 602 633 1167 +3 1931 1929 1909 +3 1925 1924 756 +3 1065 593 1068 +3 1066 1063 1166 +3 469 1609 1608 +3 1609 224 1608 +3 1065 1068 629 +3 2395 270 2396 +3 663 662 1069 +3 662 663 626 +3 2122 2123 223 +3 102 103 40 +3 710 1073 2585 +3 2584 710 2585 +3 610 397 581 +3 397 610 1148 +3 1074 1076 1072 +3 671 655 674 +3 1082 595 1076 +3 1113 1762 1114 +3 290 1113 1114 +3 651 1081 1080 +3 685 651 1080 +3 654 1821 1820 +3 1075 1080 1081 +3 1073 1123 1074 +3 1092 1091 710 +3 709 708 1094 +3 2270 2269 2268 +3 1092 700 1091 +3 582 2008 696 +3 2008 582 1642 +3 1085 1078 595 +3 1078 1085 95 +3 591 1085 1084 +3 591 1086 1085 +3 1076 1075 1082 +3 1176 1171 404 +3 1908 1391 643 +3 1908 1923 1391 +3 688 2459 1100 +3 1074 1072 2585 +3 1819 1820 686 +3 172 1102 540 +3 1089 1088 2464 +3 1097 597 1089 +3 688 1097 1089 +3 1526 1525 1520 +3 592 1096 1097 +3 1075 1083 1082 +3 2566 324 1730 +3 595 1078 1077 +3 1960 1957 1110 +3 422 653 1086 +3 1077 1078 597 +3 1078 1079 597 +3 2419 2418 755 +3 2418 2419 2417 +3 402 2418 2417 +3 758 651 757 +3 758 1081 651 +3 48 313 274 +3 1147 1086 591 +3 2585 1073 1074 +3 2584 2585 1072 +3 1083 1075 1694 +3 1144 1146 400 +3 1144 590 1146 +3 1638 709 579 +3 709 2559 579 +3 589 780 1327 +3 1144 1145 587 +3 1145 400 585 +3 1085 1086 95 +3 1086 653 95 +3 653 660 95 +3 1817 599 1816 +3 2287 2277 2361 +3 2282 2287 2361 +3 1524 980 1591 +3 960 1122 1099 +3 1200 1201 614 +3 1091 839 1073 +3 1089 597 1088 +3 597 1087 1088 +3 2465 1088 2466 +3 1101 2457 1120 +3 2454 2457 1101 +3 397 2468 2469 +3 2468 397 1149 +3 2057 2058 26 +3 792 2233 2228 +3 597 1079 1087 +3 601 719 798 +3 719 718 798 +3 2114 2111 2112 +3 2462 2464 2463 +3 687 2462 2463 +3 2464 1088 2465 +3 2463 2464 2465 +3 624 2466 1087 +3 686 1090 687 +3 1817 687 1818 +3 1097 1077 597 +3 1124 331 337 +3 331 25 337 +3 704 684 1501 +3 681 684 704 +3 700 1092 1093 +3 960 1098 1090 +3 1076 1077 1096 +3 1077 1076 595 +3 2562 1744 341 +3 1072 1096 592 +3 1072 1076 1096 +3 592 1097 1100 +3 2558 2559 709 +3 839 1122 1073 +3 1096 1077 1097 +3 1457 1627 1458 +3 1757 328 1758 +3 248 1999 2759 +3 253 248 2759 +3 1625 1626 640 +3 1625 718 1626 +3 923 1102 172 +3 1820 1821 686 +3 1123 1122 960 +3 675 1630 1631 +3 1180 813 812 +3 1500 2278 2283 +3 2284 1500 2283 +3 2713 2714 1429 +3 854 540 1102 +3 856 854 1102 +3 856 855 854 +3 856 1102 923 +3 856 923 857 +3 592 2455 2456 +3 1100 1097 688 +3 2574 1024 2572 +3 1668 1037 868 +3 1105 1104 5 +3 1106 1105 5 +3 2273 2501 2497 +3 2273 2500 2501 +3 2501 1059 2497 +3 1669 1036 1696 +3 2363 368 1472 +3 2011 934 2029 +3 519 1788 1782 +3 1811 1052 864 +3 1812 1811 864 +3 1605 1604 468 +3 1604 1605 2683 +3 1152 2683 1605 +3 1106 865 1107 +3 1105 1106 1107 +3 1028 2510 2511 +3 1278 2258 1693 +3 2258 1278 2259 +3 1822 8 107 +3 1953 1952 1115 +3 2181 2180 287 +3 1001 2180 2181 +3 2220 2221 2185 +3 2222 2220 2185 +3 88 2561 2562 +3 184 446 1884 +3 1171 778 404 +3 285 231 284 +3 1831 1750 1743 +3 116 2018 2020 +3 2018 2010 2020 +3 1951 1960 1110 +3 1830 1829 1827 +3 618 622 616 +3 2756 1002 2184 +3 797 1521 2531 +3 2206 2196 2205 +3 1114 1117 290 +3 2412 1187 1186 +3 1518 2226 1522 +3 8 102 107 +3 1116 1950 1952 +3 1951 1950 1116 +3 1005 2192 2191 +3 1114 473 1610 +3 1111 1953 1954 +3 1949 1948 1118 +3 1947 289 1109 +3 880 2004 763 +3 1952 1961 1116 +3 1442 1441 1963 +3 1006 2198 471 +3 894 2695 2696 +3 681 705 798 +3 2238 2237 2239 +3 673 1684 679 +3 637 673 679 +3 1522 1526 1527 +3 2542 1623 3 +3 2457 839 1120 +3 910 911 1125 +3 910 1125 408 +3 951 408 1125 +3 808 825 173 +3 825 2472 173 +3 2477 2476 781 +3 2477 1125 2476 +3 843 844 2478 +3 2348 2349 2353 +3 1226 181 1225 +3 181 1227 1225 +3 1067 639 720 +3 639 1131 720 +3 2316 2315 689 +3 720 1130 1129 +3 1130 720 1131 +3 1899 389 1898 +3 429 146 430 +3 1226 180 421 +3 2312 2314 712 +3 2314 2312 1017 +3 1129 657 1017 +3 1129 1130 657 +3 2712 457 191 +3 1134 2 353 +3 459 2658 190 +3 534 2721 2722 +3 482 483 1459 +3 482 387 483 +3 971 2448 2446 +3 2448 919 2446 +3 2137 1888 354 +3 1437 1698 435 +3 1933 1932 13 +3 1406 2516 2515 +3 354 492 1450 +3 345 1757 1758 +3 328 1755 339 +3 1844 192 1842 +3 1843 1844 1842 +3 1853 1850 1686 +3 1244 1263 1857 +3 1392 1124 337 +3 152 364 941 +3 364 1264 941 +3 1795 523 1771 +3 2692 2686 2691 +3 361 2692 2691 +3 896 2691 300 +3 94 803 802 +3 1191 111 1140 +3 631 1802 1801 +3 1734 995 1733 +3 1514 1205 1515 +3 521 1514 1515 +3 713 2317 1617 +3 580 2470 2467 +3 580 2469 2470 +3 111 303 1140 +3 302 303 2688 +3 111 1191 903 +3 2132 356 2133 +3 303 305 1141 +3 151 305 303 +3 406 808 809 +3 2472 2474 2471 +3 911 2472 2471 +3 591 1146 1147 +3 590 1147 1146 +3 806 406 2237 +3 1146 591 1084 +3 592 2456 1072 +3 2455 1101 2456 +3 1555 2227 1518 +3 808 406 807 +3 807 406 806 +3 2271 2266 2268 +3 884 883 763 +3 1147 590 810 +3 590 809 810 +3 1194 608 1195 +3 2513 1773 521 +3 2720 2719 256 +3 56 2263 1706 +3 469 2179 1609 +3 226 2109 2108 +3 1605 1606 1607 +3 468 1606 1605 +3 313 312 232 +3 312 311 232 +3 1307 1306 230 +3 275 1307 1294 +3 1289 2409 2411 +3 48 370 312 +3 469 1607 1606 +3 2383 2384 160 +3 2387 2383 160 +3 224 1600 1153 +3 320 2063 2061 +3 1161 2063 320 +3 2257 470 2256 +3 1603 1152 1153 +3 1600 1599 1153 +3 1081 1694 1075 +3 2259 1278 1284 +3 1278 227 1284 +3 1608 224 1153 +3 1307 230 1294 +3 1303 1296 2109 +3 1274 1285 1286 +3 1285 1291 1286 +3 1691 1692 1276 +3 1692 1691 1278 +3 641 659 1801 +3 1379 659 641 +3 1276 1272 1653 +3 1275 1651 1652 +3 1154 1657 1289 +3 1288 1649 1650 +3 1288 1274 1286 +3 227 1285 1284 +3 227 1290 1285 +3 1967 1272 1270 +3 2343 2344 2342 +3 2287 2428 2427 +3 2428 2287 2282 +3 2010 2362 2020 +3 364 152 311 +3 2368 364 311 +3 368 2364 2365 +3 470 2257 1117 +3 1948 2293 2214 +3 2213 2293 1947 +3 2293 2213 2214 +3 1362 1363 773 +3 2202 2203 1007 +3 276 6 278 +3 276 1165 6 +3 442 1456 2739 +3 267 97 273 +3 819 821 820 +3 1455 1457 2739 +3 1457 1455 1454 +3 1003 2223 2189 +3 2155 1055 2154 +3 1916 2254 2253 +3 2165 1044 2761 +3 718 719 1626 +3 655 1168 1629 +3 1624 2543 1625 +3 2462 2461 1089 +3 2462 1090 2461 +3 1520 1591 1529 +3 424 2481 1179 +3 615 424 1179 +3 1193 2352 1196 +3 2352 1193 1194 +3 1178 0 616 +3 0 618 616 +3 1177 617 1172 +3 739 191 455 +3 1247 1251 1241 +3 1173 772 1174 +3 771 913 1178 +3 1633 1402 1632 +3 617 1177 1178 +3 460 191 739 +3 644 1908 643 +3 1908 644 1909 +3 769 1364 886 +3 627 1384 1907 +3 1923 627 1907 +3 1368 773 404 +3 1176 404 773 +3 1366 1176 773 +3 1437 2588 1698 +3 2586 1434 1433 +3 710 1091 1073 +3 1173 1172 772 +3 2480 617 1179 +3 2481 2480 1179 +3 2482 2483 778 +3 777 778 2483 +3 778 777 404 +3 98 271 283 +3 271 2395 283 +3 422 1184 653 +3 38 2081 1331 +3 492 491 1447 +3 1189 652 1188 +3 797 2531 1519 +3 810 1182 422 +3 1147 810 422 +3 1805 661 643 +3 810 1183 1182 +3 810 173 1183 +3 809 173 810 +3 1401 1425 2517 +3 1663 1665 859 +3 1186 652 1185 +3 2413 1186 2415 +3 882 2419 646 +3 645 1910 2393 +3 653 1184 1189 +3 2422 888 2412 +3 652 1186 1187 +3 269 2398 2397 +3 1190 904 898 +3 270 2394 97 +3 2413 2412 1186 +3 2422 2412 2413 +3 1188 2393 605 +3 652 1187 1188 +3 304 904 1190 +3 904 304 752 +3 652 1189 1184 +3 1933 108 1936 +3 1189 660 653 +3 605 660 1189 +3 660 605 661 +3 2442 1025 2444 +3 1567 2583 1584 +3 2583 1560 1584 +3 645 1911 1910 +3 1140 1141 304 +3 1190 1140 304 +3 2591 2635 189 +3 1470 2635 2591 +3 321 903 1191 +3 1191 1140 1190 +3 1193 392 1194 +3 913 0 1178 +3 2672 484 2571 +3 613 554 398 +3 1203 1202 554 +3 527 1203 554 +3 1202 398 554 +3 2207 349 2209 +3 2207 1958 349 +3 575 2467 2468 +3 574 575 2468 +3 803 395 802 +3 1192 392 1193 +3 2482 2481 424 +3 911 621 2473 +3 2632 575 94 +3 1628 717 718 +3 717 1628 2535 +3 1192 1193 611 +3 1193 1196 611 +3 614 2346 2345 +3 614 1148 2346 +3 526 2736 1508 +3 1206 1221 1207 +3 1221 2354 1207 +3 2238 405 2240 +3 83 1708 1299 +3 1297 83 1299 +3 1724 1723 577 +3 1642 577 2008 +3 1513 555 1506 +3 1218 1219 574 +3 1219 94 574 +3 611 1196 1199 +3 169 1713 262 +3 1352 526 1508 +3 1207 398 1206 +3 2763 2764 822 +3 2217 2192 2752 +3 2192 2217 2216 +3 568 1214 1216 +3 1214 568 518 +3 2735 1204 527 +3 1216 1690 1217 +3 1216 522 1690 +3 206 908 153 +3 1209 1210 572 +3 2354 1221 2353 +3 1201 398 1202 +3 1201 1206 398 +3 611 2345 2346 +3 2347 1200 2343 +3 1200 2344 2343 +3 397 1724 581 +3 499 1785 1784 +3 1968 1970 1969 +3 394 573 1128 +3 573 1222 1128 +3 2348 2353 1221 +3 1636 1723 580 +3 518 1215 1214 +3 495 516 1789 +3 2344 1199 2342 +3 241 1214 1215 +3 1205 2735 2736 +3 2735 527 2736 +3 276 2738 1165 +3 517 1782 1783 +3 1769 520 1768 +3 1215 823 241 +3 823 1215 498 +3 2020 2362 933 +3 241 1213 1214 +3 780 1324 1327 +3 56 1785 1786 +3 2627 2629 2624 +3 2627 2630 2629 +3 232 311 982 +3 1783 1782 1788 +3 1790 1781 1791 +3 568 1217 1773 +3 1220 614 571 +3 614 1202 571 +3 1773 2513 1780 +3 572 1218 1211 +3 1196 2352 2350 +3 1211 1220 571 +3 1220 1211 1218 +3 1208 1211 571 +3 417 622 623 +3 1512 417 623 +3 1148 1192 2346 +3 2451 1682 1677 +3 2282 2358 1169 +3 1692 1693 373 +3 1216 1217 568 +3 2355 613 1207 +3 2354 2355 1207 +3 1506 555 1509 +3 1233 723 1234 +3 947 944 1223 +3 182 944 947 +3 36 1229 996 +3 995 36 996 +3 872 1035 1041 +3 1223 1224 947 +3 1223 180 1224 +3 1121 700 1940 +3 738 737 1237 +3 1833 738 1237 +3 353 2 1888 +3 1226 1224 180 +3 1226 1225 1224 +3 1906 767 1355 +3 770 1906 1355 +3 921 1027 1026 +3 2174 1042 1671 +3 1229 36 948 +3 857 923 217 +3 923 1994 217 +3 922 216 1993 +3 1814 947 1227 +3 943 183 945 +3 2041 2045 2046 +3 2045 2041 2023 +3 2730 535 237 +3 1833 2492 2493 +3 1233 1018 733 +3 18 2638 2640 +3 1841 1836 1840 +3 1836 1841 1837 +3 1232 723 1233 +3 1240 1843 737 +3 1248 192 1844 +3 1363 1362 886 +3 1843 1247 1844 +3 1020 1839 1021 +3 456 1835 1239 +3 1839 1239 1838 +3 737 455 1240 +3 735 723 734 +3 2379 2382 2381 +3 2378 2379 2381 +3 1842 192 1837 +3 1252 192 1248 +3 183 533 945 +3 945 533 49 +3 533 1885 49 +3 1234 1236 1018 +3 1836 1835 1834 +3 1240 1247 1843 +3 191 454 455 +3 456 1239 1839 +3 1248 1249 1022 +3 338 2049 2048 +3 110 2062 2063 +3 1613 1614 130 +3 69 1613 130 +3 446 90 334 +3 1839 1838 1021 +3 2618 1415 2617 +3 1265 1267 365 +3 907 2047 2048 +3 2047 907 127 +3 1252 1838 192 +3 1244 1866 1865 +3 454 1251 455 +3 2548 60 2547 +3 1250 1251 454 +3 454 457 1246 +3 1246 437 1244 +3 1832 2492 1236 +3 2492 1832 2493 +3 1240 455 1251 +3 1493 1491 335 +3 2414 2415 761 +3 1274 1288 1650 +3 1906 1905 893 +3 1494 186 352 +3 2570 2226 2227 +3 1861 1862 1261 +3 1861 1262 1862 +3 438 2520 1409 +3 1251 1848 1241 +3 2304 2303 428 +3 1688 1689 1210 +3 1689 1212 1210 +3 1688 1687 1516 +3 448 1020 1255 +3 1906 1175 1905 +3 1260 1852 1259 +3 1022 1252 1248 +3 452 451 1256 +3 90 446 445 +3 446 185 445 +3 1253 1252 1022 +3 1252 1253 1021 +3 185 447 445 +3 1254 1257 54 +3 1021 1255 1020 +3 1021 1253 1255 +3 1253 1254 1255 +3 1255 1254 1256 +3 1242 1257 1249 +3 1485 2379 1282 +3 2379 1485 367 +3 1250 454 1859 +3 1858 1243 1859 +3 1364 766 1363 +3 1904 766 1364 +3 2760 1455 2739 +3 1456 2760 2739 +3 25 2049 338 +3 1260 1259 1863 +3 1516 1687 243 +3 1687 1209 243 +3 1454 384 1457 +3 1295 2107 2108 +3 1400 2323 2328 +3 2329 1400 2328 +3 2210 2215 2530 +3 2225 2215 2210 +3 2371 2376 2372 +3 140 74 906 +3 74 140 2051 +3 337 25 338 +3 518 568 569 +3 2594 249 2596 +3 1696 1036 1597 +3 1478 1476 367 +3 56 1786 2263 +3 1264 1267 1265 +3 1267 1264 364 +3 372 1264 1265 +3 431 1902 429 +3 1002 2182 2181 +3 350 1486 34 +3 1269 1798 1799 +3 2375 229 2374 +3 229 2373 2374 +3 1279 2390 53 +3 369 2679 2680 +3 1293 2104 2105 +3 1655 1290 227 +3 1311 98 284 +3 373 1279 1272 +3 1276 373 1272 +3 467 466 133 +3 1015 467 308 +3 1016 1015 308 +3 2389 1015 1016 +3 2680 2679 53 +3 2729 2728 2730 +3 549 2730 237 +3 553 535 2723 +3 2104 1293 1292 +3 1156 2104 1292 +3 1157 1288 1287 +3 1288 1286 1287 +3 1270 1279 53 +3 1266 1270 53 +3 1289 1157 2409 +3 311 152 310 +3 2122 17 1712 +3 2116 2117 1301 +3 2397 270 295 +3 1285 1274 1284 +3 2119 2122 2121 +3 373 1276 1692 +3 1653 1654 1276 +3 1653 1275 1654 +3 371 1966 1967 +3 422 1182 1184 +3 714 1620 640 +3 1129 714 640 +3 287 2180 2177 +3 2180 2178 2177 +3 1357 776 1356 +3 367 2380 2379 +3 2025 35 992 +3 368 1297 1316 +3 157 2097 2098 +3 226 2115 1303 +3 826 487 2678 +3 52 159 1475 +3 1302 52 1475 +3 1034 2425 1663 +3 1267 2374 365 +3 2374 1267 2375 +3 2726 2731 531 +3 1268 2371 2372 +3 1799 1268 1800 +3 1268 2372 1800 +3 1150 1304 1306 +3 1304 230 1306 +3 314 313 232 +3 230 1304 1292 +3 2108 2111 226 +3 1799 1800 1269 +3 2556 165 2545 +3 1156 2101 2103 +3 1156 2100 2101 +3 1151 1287 1286 +3 982 311 310 +3 1707 1706 2261 +3 1306 1308 468 +3 1151 1291 1292 +3 288 1333 2118 +3 2380 2382 2379 +3 1333 296 2118 +3 1297 228 1296 +3 83 1297 1296 +3 1604 1306 468 +3 48 1294 1310 +3 2268 1322 2271 +3 1322 2268 2269 +3 1419 1420 1396 +3 1112 1113 290 +3 1600 2297 1599 +3 1602 1305 1150 +3 1010 2207 2206 +3 369 2380 2387 +3 1114 1761 473 +3 1303 2109 226 +3 1277 1290 1655 +3 1600 224 1314 +3 1154 1600 1314 +3 473 1761 1760 +3 161 1473 1472 +3 2681 970 1813 +3 976 970 2681 +3 2111 2108 1298 +3 1312 1311 275 +3 1312 1294 274 +3 274 1294 48 +3 1312 275 1294 +3 2073 91 2074 +3 91 2073 2070 +3 2217 2756 2184 +3 1316 1299 1480 +3 367 1476 2383 +3 2380 367 2383 +3 159 52 158 +3 467 751 308 +3 1986 1988 321 +3 541 553 30 +3 553 2723 30 +3 188 1878 2433 +3 2392 1188 1187 +3 1007 2199 2202 +3 2103 2104 1156 +3 2104 2103 1295 +3 1287 2406 2409 +3 365 1799 1798 +3 1151 1292 1305 +3 1305 1292 1304 +3 1305 1304 1150 +3 47 279 282 +3 370 48 1310 +3 229 2366 1377 +3 1607 1152 1605 +3 1308 1306 1307 +3 234 313 314 +3 282 272 234 +3 2107 1298 2108 +3 98 1311 1312 +3 1308 275 1309 +3 275 1308 1307 +3 1657 1277 1656 +3 1309 1311 284 +3 1311 1309 275 +3 1298 2113 2112 +3 2112 2120 1300 +3 2120 1760 1300 +3 1008 2204 2202 +3 2406 2411 2409 +3 2647 2646 2138 +3 2408 2407 1151 +3 964 1153 1599 +3 1301 2117 2119 +3 1599 1155 1598 +3 2297 1289 2411 +3 1313 2405 2407 +3 2752 2192 2753 +3 645 2393 2392 +3 1354 775 1353 +3 1354 765 775 +3 909 776 621 +3 910 909 621 +3 609 909 912 +3 585 1647 1648 +3 803 573 394 +3 2474 781 2471 +3 950 2475 813 +3 403 1317 1318 +3 780 779 403 +3 2257 1011 1117 +3 1357 621 776 +3 1114 470 1117 +3 1319 1318 607 +3 1040 1127 2494 +3 1040 2765 1127 +3 2368 2375 364 +3 2375 1267 364 +3 2081 917 212 +3 2009 2669 1722 +3 1320 1319 607 +3 780 2295 2296 +3 1062 1597 869 +3 2270 1694 586 +3 2501 2502 1059 +3 1321 585 2266 +3 2396 283 2395 +3 2398 283 2396 +3 2071 975 2070 +3 975 2071 202 +3 2266 2265 1321 +3 402 2413 2414 +3 2413 2415 2414 +3 2559 2558 840 +3 2392 2393 1188 +3 1816 1819 686 +3 1327 1324 1325 +3 759 1327 1325 +3 1798 2260 1283 +3 2369 1472 1473 +3 916 1328 917 +3 1328 916 215 +3 1729 1727 1728 +3 2211 1947 1109 +3 77 1124 1392 +3 1754 1757 330 +3 1757 1137 330 +3 323 322 1741 +3 295 1333 269 +3 296 1333 295 +3 1036 869 1597 +3 1535 1531 1536 +3 726 1335 1334 +3 1337 1335 726 +3 1335 1337 1336 +3 1336 562 1335 +3 1336 567 562 +3 567 1336 563 +3 1343 1341 724 +3 562 1348 1347 +3 1348 562 1349 +3 449 1336 1337 +3 1336 449 563 +3 2164 2165 2761 +3 1346 1345 725 +3 448 1343 724 +3 953 955 409 +3 506 2263 2264 +3 451 1343 448 +3 1338 1344 725 +3 447 185 711 +3 1342 447 711 +3 1344 749 725 +3 449 1339 1340 +3 1346 725 478 +3 1340 711 564 +3 1341 711 1340 +3 711 1341 1342 +3 744 745 462 +3 461 2656 746 +3 2713 1429 465 +3 1341 1340 1339 +3 1344 726 749 +3 2656 177 746 +3 2655 177 2656 +3 1337 726 1344 +3 1337 1344 1338 +3 384 1342 451 +3 1342 1341 1343 +3 724 1339 1345 +3 724 1345 1346 +3 724 1346 448 +3 739 462 460 +3 739 742 462 +3 448 1346 1020 +3 1347 1348 727 +3 450 1350 1351 +3 1350 525 1351 +3 779 1357 1356 +3 409 2701 782 +3 567 1349 562 +3 1004 2197 2194 +3 495 1789 848 +3 885 886 401 +3 417 1513 613 +3 520 1769 524 +3 567 1350 1349 +3 450 1351 558 +3 559 450 558 +3 461 745 561 +3 774 404 777 +3 2439 1420 1419 +3 1376 883 884 +3 1359 1360 765 +3 1391 1907 642 +3 1907 1384 642 +3 1358 764 1359 +3 1573 1991 514 +3 588 1320 2267 +3 1354 1355 765 +3 1355 1358 765 +3 1404 1417 1397 +3 909 609 776 +3 609 770 1355 +3 1924 1919 756 +3 2327 1403 1399 +3 765 1358 1359 +3 886 1362 1361 +3 890 1360 1359 +3 1360 890 401 +3 1361 1360 401 +3 886 1361 401 +3 1174 770 1173 +3 764 890 1359 +3 772 1366 1367 +3 1174 772 1367 +3 1367 1365 766 +3 1175 1367 766 +3 1175 1174 1367 +3 1363 1365 773 +3 770 1174 1175 +3 2170 877 2169 +3 2170 2171 877 +3 2278 1159 2279 +3 2275 2278 1500 +3 1366 773 1365 +3 1367 1366 1365 +3 779 1356 403 +3 765 1360 1370 +3 707 706 2625 +3 1647 585 1321 +3 1643 606 1640 +3 1730 322 323 +3 1360 1361 1369 +3 2295 1319 2296 +3 765 1370 775 +3 1370 774 775 +3 1323 1694 2270 +3 1370 1360 1369 +3 1368 774 1369 +3 774 1370 1369 +3 1357 2473 621 +3 768 598 1373 +3 1371 768 1373 +3 1375 762 1376 +3 762 883 1376 +3 598 1374 1373 +3 1373 1374 764 +3 1231 722 1230 +3 1374 1375 764 +3 694 1183 693 +3 598 889 1374 +3 1026 1665 217 +3 552 216 922 +3 1375 1376 890 +3 764 1375 890 +3 1990 884 885 +3 1378 626 691 +3 668 1378 691 +3 1378 668 659 +3 1911 628 1912 +3 628 1913 1912 +3 1425 1414 1426 +3 1938 292 293 +3 1379 626 1378 +3 659 1379 1378 +3 2504 2505 1039 +3 2505 2508 1039 +3 978 218 977 +3 1806 218 978 +3 662 1385 1069 +3 649 1384 1387 +3 643 1381 600 +3 1070 1762 1113 +3 627 1387 1384 +3 627 1930 1387 +3 1867 1868 1262 +3 1871 1868 1867 +3 641 1801 1802 +3 2520 1407 2521 +3 642 1383 1382 +3 642 1384 1383 +3 626 1382 662 +3 642 1382 1380 +3 1380 1382 1379 +3 1382 626 1379 +3 1380 1379 641 +3 2519 1408 2329 +3 649 1385 1383 +3 1384 649 1383 +3 1931 1928 1929 +3 1928 648 1929 +3 2650 2649 594 +3 2650 2652 2649 +3 1612 1613 69 +3 1758 33 345 +3 642 1380 1381 +3 1926 1925 1922 +3 1388 1926 650 +3 596 1388 650 +3 596 1386 1388 +3 1385 1386 625 +3 1069 1385 625 +3 599 1815 1816 +3 1390 786 629 +3 1390 599 786 +3 289 1947 2294 +3 1385 662 1383 +3 1907 1391 1923 +3 1385 649 1386 +3 1404 2325 2326 +3 627 1923 1909 +3 1923 1908 1909 +3 636 663 664 +3 1386 649 1388 +3 438 1399 1403 +3 1663 860 1664 +3 860 1663 2425 +3 2668 698 2667 +3 92 1616 979 +3 1389 625 1386 +3 1391 642 1381 +3 1920 760 879 +3 1666 1669 1696 +3 199 2637 198 +3 126 260 1392 +3 259 1751 1749 +3 2120 473 1760 +3 473 2120 2113 +3 1260 1863 1862 +3 1493 352 75 +3 1494 352 1493 +3 1913 1919 1924 +3 1429 1428 1423 +3 1473 2716 1282 +3 2716 1473 1474 +3 2137 355 1888 +3 1438 1439 1132 +3 907 139 127 +3 836 835 1470 +3 305 151 306 +3 25 1000 2050 +3 188 1875 1878 +3 2324 2325 1404 +3 1433 439 2619 +3 2127 2128 355 +3 1408 1400 2329 +3 381 382 44 +3 1038 2509 1103 +3 1614 1613 127 +3 2445 1418 2524 +3 1407 2517 1425 +3 2517 1407 2516 +3 1808 860 1810 +3 1408 1403 1400 +3 1915 2255 1917 +3 628 1915 1917 +3 918 423 2446 +3 1436 2327 1399 +3 2327 1436 2440 +3 10 1410 2521 +3 1410 1409 2521 +3 1422 1421 458 +3 379 74 236 +3 1865 1866 1245 +3 2323 1405 2518 +3 1411 1410 439 +3 1415 1433 2619 +3 2697 1669 867 +3 1632 1412 1633 +3 2395 2394 270 +3 1406 2517 2516 +3 1413 1414 1401 +3 2310 2304 2307 +3 2326 1398 1417 +3 146 428 2303 +3 146 429 428 +3 1401 1414 1425 +3 352 1134 351 +3 2328 2323 1406 +3 2327 1398 2326 +3 187 440 1411 +3 348 74 374 +3 751 133 750 +3 133 1880 750 +3 1421 436 1402 +3 436 1421 1422 +3 2052 1000 142 +3 2050 1000 2052 +3 1876 2437 440 +3 577 581 1724 +3 2128 2127 2132 +3 1633 1412 1426 +3 1434 1438 1132 +3 1398 2439 1419 +3 437 1423 1424 +3 1423 1422 1424 +3 2256 2187 1011 +3 2439 2440 2438 +3 1804 1805 600 +3 1428 436 1423 +3 1428 1427 436 +3 2713 435 2714 +3 2710 2709 1430 +3 362 363 1880 +3 2521 2525 10 +3 2521 1407 2525 +3 1875 1877 1393 +3 836 2591 1432 +3 1876 188 2435 +3 458 1421 1418 +3 1878 1874 1395 +3 1874 1878 1875 +3 1431 2709 2710 +3 355 2136 2127 +3 1877 441 1393 +3 1394 441 1877 +3 440 1023 1394 +3 465 1429 1423 +3 1396 1420 1872 +3 1864 1867 1262 +3 1867 1864 1865 +3 1424 1422 458 +3 1245 1873 1872 +3 442 1458 434 +3 1423 436 1422 +3 2520 2521 1409 +3 2526 1944 1943 +3 1944 2526 701 +3 1804 631 624 +3 2400 285 2399 +3 108 1933 1934 +3 1416 1698 1697 +3 598 1918 889 +3 1697 1698 1133 +3 1414 1633 1426 +3 1403 2327 2326 +3 2616 2619 1410 +3 1910 1911 1912 +3 712 2286 2280 +3 2286 712 2314 +3 1700 2767 1699 +3 1402 1633 1414 +3 1413 1402 1414 +3 1916 1915 647 +3 2255 1915 1916 +3 2712 465 457 +3 66 350 196 +3 350 66 1486 +3 132 73 2529 +3 1435 433 187 +3 1456 433 1468 +3 439 1434 1435 +3 2648 44 383 +3 2440 1436 2438 +3 264 265 1499 +3 265 266 1499 +3 1497 2298 2301 +3 2436 2435 1399 +3 1434 439 1433 +3 1444 489 1448 +3 187 1411 1435 +3 1132 433 1435 +3 2589 1437 2590 +3 2197 1006 2194 +3 2647 2132 357 +3 2648 2647 357 +3 2488 2487 432 +3 1974 1593 1594 +3 2633 2634 1439 +3 432 1471 1467 +3 1447 491 1445 +3 2 491 492 +3 1442 489 1444 +3 490 1442 1444 +3 2591 836 1470 +3 2635 2634 2633 +3 2635 1440 2634 +3 411 489 1443 +3 411 509 489 +3 1443 834 411 +3 411 834 833 +3 412 834 1443 +3 489 1442 1443 +3 1444 1445 490 +3 1445 1446 490 +3 443 1452 1135 +3 483 387 484 +3 924 1677 1682 +3 386 1444 1448 +3 2594 2596 252 +3 1469 2588 2589 +3 189 1469 2589 +3 491 1446 1445 +3 483 484 1899 +3 1445 386 1447 +3 1451 1452 1453 +3 1132 2488 1468 +3 1448 509 482 +3 509 1448 489 +3 509 387 482 +3 1444 386 1445 +3 480 1464 479 +3 1963 1441 1964 +3 1448 482 1449 +3 1451 1446 491 +3 386 1450 1447 +3 386 1449 1450 +3 2481 2482 778 +3 1453 385 1451 +3 1452 2 1135 +3 549 79 2730 +3 550 79 549 +3 1903 1364 769 +3 1453 1452 443 +3 1899 484 2479 +3 778 1171 2480 +3 1455 385 1453 +3 1454 1455 1453 +3 1456 442 433 +3 1449 1459 481 +3 1449 482 1459 +3 1454 443 444 +3 519 1782 1770 +3 1321 2265 2267 +3 2265 588 2267 +3 1468 1467 1456 +3 1132 1468 433 +3 1467 1468 432 +3 2762 824 820 +3 2740 1781 1792 +3 937 2742 2744 +3 1791 1781 2740 +3 1449 481 1450 +3 1459 1460 481 +3 1466 354 1465 +3 480 1466 1465 +3 483 1460 1459 +3 617 2579 1172 +3 1171 2579 617 +3 828 827 2232 +3 2676 827 828 +3 390 2576 2234 +3 1463 1464 480 +3 940 1981 2241 +3 2251 1442 490 +3 1558 2234 792 +3 1462 429 430 +3 431 429 1462 +3 1463 430 1464 +3 60 2548 2002 +3 2548 245 2002 +3 1462 1461 147 +3 1452 491 2 +3 254 1889 60 +3 413 835 836 +3 354 1450 481 +3 1465 354 481 +3 480 1465 1461 +3 474 832 814 +3 474 411 832 +3 474 508 411 +3 1281 2370 2363 +3 2164 2761 2163 +3 2761 1044 2163 +3 2137 479 2136 +3 1466 479 2137 +3 1661 887 762 +3 2685 300 2690 +3 491 1452 1451 +3 2634 2488 1439 +3 2488 2634 2487 +3 2487 2634 1440 +3 834 148 833 +3 412 835 834 +3 412 1470 835 +3 835 148 834 +3 1709 170 1710 +3 2394 1165 97 +3 1165 2394 271 +3 1302 1482 52 +3 2261 2262 2335 +3 1473 161 1474 +3 66 196 1681 +3 2364 1377 2366 +3 368 2363 2364 +3 1299 1481 1480 +3 1316 161 1472 +3 1472 368 1316 +3 1899 2479 389 +3 2391 1015 2389 +3 19 1895 1476 +3 2385 160 2384 +3 1475 1476 1478 +3 1475 159 1476 +3 2719 529 256 +3 2746 1794 56 +3 928 34 174 +3 34 1486 174 +3 2365 2366 370 +3 1479 1480 1481 +3 1479 161 1480 +3 1713 1711 154 +3 1714 1713 154 +3 1302 1481 1482 +3 1481 171 1482 +3 2726 2725 530 +3 2299 1498 145 +3 2299 2298 1498 +3 146 2303 2302 +3 1563 1541 510 +3 1498 1497 113 +3 219 2077 2085 +3 2722 2721 536 +3 2388 2391 2389 +3 1474 1477 1485 +3 171 1483 1482 +3 1483 171 1484 +3 1015 2385 467 +3 160 2385 1015 +3 1709 1484 171 +3 1484 1709 1710 +3 1477 1478 1485 +3 2723 536 30 +3 536 537 30 +3 2723 2722 536 +3 534 2720 2721 +3 2720 256 2721 +3 1490 1489 333 +3 1855 1243 1856 +3 1023 54 1260 +3 1490 335 1491 +3 142 1490 1491 +3 2302 2305 2301 +3 2305 1497 2301 +3 26 2055 2056 +3 140 906 907 +3 1876 1875 188 +3 428 23 2304 +3 1495 1492 75 +3 90 1494 335 +3 233 150 850 +3 445 186 1494 +3 90 445 1494 +3 1023 453 54 +3 1492 1495 2053 +3 1495 141 2053 +3 2132 2127 356 +3 2304 2310 426 +3 2134 114 360 +3 769 886 885 +3 2290 2291 863 +3 2290 878 2291 +3 2318 2319 1619 +3 2682 863 1107 +3 461 561 560 +3 1503 1510 556 +3 1510 1503 557 +3 464 559 1502 +3 557 1502 1504 +3 1352 1508 178 +3 521 1217 1514 +3 2126 2144 114 +3 2700 2699 2654 +3 2701 2700 782 +3 2653 1503 2654 +3 1503 782 2654 +3 1437 2709 1431 +3 2590 1437 1431 +3 2656 464 2655 +3 554 1507 527 +3 1506 1507 554 +3 1506 178 1507 +3 1505 1509 557 +3 1506 1509 1505 +3 2699 464 2654 +3 2699 2655 464 +3 1723 2006 577 +3 577 2006 2007 +3 1219 572 573 +3 2703 416 2704 +3 2701 783 2700 +3 555 1511 1509 +3 2431 2430 845 +3 1783 499 1784 +3 1507 1508 527 +3 178 1508 1507 +3 528 2717 2719 +3 2717 529 2719 +3 534 528 2720 +3 728 747 729 +3 728 561 747 +3 623 1510 1511 +3 1511 1510 1509 +3 2126 2143 2144 +3 450 560 1348 +3 1204 2737 1203 +3 2247 418 1550 +3 294 2055 2054 +3 804 2239 805 +3 391 804 805 +3 268 267 2145 +3 484 387 2571 +3 387 507 2571 +3 1558 486 2234 +3 406 1143 2236 +3 406 1142 1143 +3 143 2129 2128 +3 785 1818 2649 +3 1442 2251 1441 +3 1551 1556 419 +3 790 1517 1519 +3 2704 1432 190 +3 1542 1539 55 +3 1539 1538 55 +3 2218 2752 2757 +3 1543 1538 1539 +3 1533 1538 1543 +3 2227 2226 1518 +3 2687 903 2685 +3 2511 1029 1030 +3 2321 1624 721 +3 1525 790 1519 +3 581 1642 1641 +3 1524 1521 420 +3 302 151 303 +3 2686 2690 2691 +3 2693 300 2684 +3 1162 1119 287 +3 2673 1119 1162 +3 1529 980 1530 +3 1527 1529 1530 +3 432 2487 1471 +3 2054 2055 293 +3 298 297 294 +3 789 1522 1528 +3 2537 1628 2538 +3 1552 1567 1585 +3 1569 1552 1585 +3 1996 252 2596 +3 419 1548 1547 +3 2581 2580 1565 +3 2580 2581 1564 +3 787 1533 1566 +3 702 1024 1942 +3 980 981 1531 +3 2056 2055 294 +3 2537 2536 1628 +3 2061 2054 320 +3 1528 1536 1532 +3 1536 1528 1535 +3 2054 2061 294 +3 1934 1939 108 +3 1403 2325 1400 +3 2325 2324 1400 +3 281 280 47 +3 1720 214 87 +3 1543 1545 1566 +3 1548 787 1546 +3 2666 1945 2665 +3 1559 789 1532 +3 1584 1586 1568 +3 1540 1541 511 +3 1549 1554 788 +3 1095 576 1944 +3 576 1095 1722 +3 1544 1545 1561 +3 1545 1544 1546 +3 1557 791 1556 +3 1619 2320 1620 +3 2320 721 1620 +3 496 1 1553 +3 1543 1534 1545 +3 675 676 635 +3 675 1631 676 +3 511 1534 1540 +3 1939 12 292 +3 292 12 281 +3 1537 1536 55 +3 1540 1539 1542 +3 1540 1534 1539 +3 1542 55 1531 +3 1536 1531 55 +3 796 418 795 +3 420 1541 981 +3 510 1550 418 +3 1554 1555 788 +3 1934 1935 12 +3 419 1549 1548 +3 131 132 134 +3 1541 1540 981 +3 1052 878 2290 +3 1531 981 1542 +3 1537 1532 1536 +3 1533 1532 1537 +3 841 840 2584 +3 1562 1561 511 +3 1534 1543 1539 +3 510 418 512 +3 1564 1562 1560 +3 1562 1564 1561 +3 1588 2606 16 +3 1553 1 1557 +3 496 1553 784 +3 1943 1945 699 +3 2319 2320 1619 +3 320 2060 109 +3 1549 419 1554 +3 1576 1577 514 +3 1566 1533 1543 +3 1160 23 78 +3 2583 2580 1560 +3 2583 1565 2580 +3 1548 1549 787 +3 1168 638 1629 +3 420 1550 1541 +3 1555 1518 788 +3 2250 793 2230 +3 1118 1948 2214 +3 510 1541 1550 +3 1546 787 1566 +3 2605 16 2606 +3 2277 2360 2361 +3 233 550 78 +3 1119 959 2183 +3 1551 1547 1552 +3 2456 2573 841 +3 497 2610 1575 +3 2610 497 1765 +3 492 1447 1450 +3 480 1461 1463 +3 792 2228 1555 +3 794 2248 2247 +3 791 792 1555 +3 502 2597 2598 +3 2609 502 2598 +3 486 2235 2234 +3 1902 150 429 +3 1 1558 1557 +3 1 849 1558 +3 1558 849 486 +3 2060 2054 293 +3 1549 1559 787 +3 788 1518 1559 +3 504 1588 1589 +3 1547 1548 2582 +3 2582 2581 1565 +3 1567 1565 2583 +3 1547 1565 1552 +3 1552 1571 784 +3 1566 1545 1546 +3 2599 2609 2598 +3 1571 2602 784 +3 785 786 1818 +3 1551 419 1547 +3 1562 1563 505 +3 1563 1562 511 +3 1541 1563 511 +3 841 2584 1072 +3 2582 1565 1547 +3 980 1529 1591 +3 280 12 1935 +3 1564 1560 2580 +3 1567 1552 1565 +3 2487 1441 1471 +3 1552 1569 1571 +3 974 210 973 +3 2600 1572 2601 +3 505 1588 1587 +3 46 974 202 +3 514 503 513 +3 1570 2614 2604 +3 1579 1578 497 +3 682 2285 2284 +3 949 1229 1228 +3 1572 513 2601 +3 1787 503 1786 +3 2315 2313 689 +3 2283 2278 2279 +3 1776 2749 1797 +3 570 1776 1797 +3 205 204 59 +3 1574 2608 2610 +3 1765 1574 2610 +3 2607 2597 502 +3 69 129 125 +3 1580 1579 936 +3 2738 276 64 +3 1577 503 514 +3 217 1992 921 +3 1578 1765 497 +3 1705 2337 1704 +3 2655 783 2657 +3 1769 239 524 +3 239 525 524 +3 2166 1043 2162 +3 1062 869 2501 +3 237 553 541 +3 1227 947 1225 +3 874 2154 2153 +3 1806 1807 221 +3 860 1806 221 +3 977 970 2094 +3 970 2095 2094 +3 970 976 2095 +3 1814 1736 182 +3 2283 2279 2280 +3 1048 2168 1049 +3 2160 2156 2163 +3 2156 1046 2163 +3 846 1897 1896 +3 2353 2349 612 +3 2338 2099 51 +3 2338 155 2099 +3 182 947 1814 +3 576 1945 1944 +3 1617 712 3 +3 444 2322 1454 +3 2667 2670 578 +3 1706 2743 56 +3 1119 2673 1118 +3 515 1577 1576 +3 1582 2768 2767 +3 1297 1299 1316 +3 1704 1580 570 +3 1786 503 2264 +3 1778 1580 936 +3 541 543 211 +3 1197 1221 1206 +3 1560 1562 1586 +3 505 1563 1589 +3 1587 1586 505 +3 1568 1586 1587 +3 784 1551 1552 +3 505 1589 1588 +3 1551 784 1553 +3 602 786 785 +3 1551 1553 1556 +3 1553 1557 1556 +3 1585 1568 1590 +3 1587 1590 1568 +3 1587 16 1590 +3 2213 2212 1946 +3 1524 1591 1523 +3 1591 1520 1523 +3 2396 2397 2398 +3 2320 2319 2321 +3 1130 637 2146 +3 1975 1595 938 +3 1595 1976 938 +3 1977 1976 1595 +3 924 1680 1678 +3 1835 456 1018 +3 1154 1289 2297 +3 938 1973 1972 +3 1595 1596 27 +3 867 1666 1667 +3 2593 1592 2595 +3 2639 31 1679 +3 1825 1822 1823 +3 1826 28 1827 +3 1111 1954 1955 +3 1960 1951 1116 +3 2555 42 1828 +3 1596 1595 1594 +3 101 2546 2545 +3 2260 1284 1283 +3 1798 1269 2260 +3 1274 1283 1284 +3 1291 1156 1292 +3 1608 1153 1152 +3 2190 2223 2222 +3 205 58 204 +3 58 2486 204 +3 964 1602 1603 +3 964 1603 1153 +3 2084 2083 966 +3 2083 972 966 +3 2081 2080 917 +3 310 152 306 +3 956 469 1606 +3 231 956 1606 +3 1011 2203 1117 +3 1601 964 1598 +3 964 1599 1598 +3 2223 1003 2188 +3 1604 1150 1306 +3 1150 1604 1602 +3 1603 1602 1604 +3 142 1000 1488 +3 1606 1309 231 +3 468 1309 1606 +3 1308 1309 468 +3 1011 2257 2256 +3 1614 127 139 +3 2005 881 2004 +3 501 2606 504 +3 1611 1613 1612 +3 125 1612 69 +3 1612 125 1615 +3 1761 1070 1760 +3 2770 136 377 +3 692 2005 880 +3 2253 2005 692 +3 2012 2030 2028 +3 73 1614 139 +3 73 132 131 +3 2210 2530 2212 +3 2530 1946 2212 +3 130 73 131 +3 130 1614 73 +3 129 69 130 +3 71 129 130 +3 1999 247 2000 +3 2665 1945 576 +3 2664 2665 576 +3 126 1611 1612 +3 216 552 914 +3 317 320 109 +3 141 1496 2051 +3 2530 2215 2224 +3 959 2530 2224 +3 2280 2279 3 +3 687 1090 2462 +3 2461 688 1089 +3 1631 1630 638 +3 675 674 1630 +3 674 675 634 +3 1629 638 1630 +3 470 1609 2256 +3 2540 2541 2542 +3 2359 2540 2542 +3 721 1625 640 +3 719 640 1626 +3 1627 384 451 +3 1621 1620 714 +3 1100 2459 2458 +3 2454 1100 2458 +3 1170 2539 2359 +3 960 1099 1098 +3 1099 2458 1098 +3 961 68 253 +3 720 1129 640 +3 1620 721 640 +3 1101 2455 2454 +3 2455 1100 2454 +3 1458 1627 452 +3 2575 828 2232 +3 2064 298 2062 +3 2067 2065 110 +3 2065 2067 302 +3 2064 2062 110 +3 2687 299 2688 +3 2442 45 2441 +3 151 2067 319 +3 319 2067 110 +3 111 2687 2688 +3 2358 2359 1169 +3 676 1631 638 +3 1618 1619 1620 +3 2179 2256 1609 +3 2253 2255 1916 +3 2253 692 2255 +3 436 1632 1402 +3 2663 2667 698 +3 1917 2255 692 +3 1410 1411 1409 +3 1632 436 1427 +3 1432 1431 2710 +3 1321 1320 399 +3 1647 1321 399 +3 1143 391 805 +3 709 1638 708 +3 1288 1157 1649 +3 500 936 497 +3 399 1643 1645 +3 1646 399 1645 +3 1644 606 1643 +3 2555 62 166 +3 2630 800 2622 +3 1644 1643 1320 +3 1645 1643 1640 +3 606 610 581 +3 1641 606 581 +3 1639 1640 582 +3 583 2630 2622 +3 2623 2625 2628 +3 583 2623 2628 +3 584 1646 2622 +3 800 584 2622 +3 1644 392 610 +3 610 606 1644 +3 392 1644 607 +3 2485 1034 1033 +3 611 2344 2345 +3 607 1644 1320 +3 399 1646 1647 +3 1651 1653 1273 +3 1646 584 1648 +3 1646 1648 1647 +3 2560 1732 1739 +3 2404 1009 2403 +3 1274 1650 1283 +3 1272 1273 1653 +3 1157 1651 1649 +3 1649 1651 1273 +3 156 477 120 +3 158 156 120 +3 477 121 120 +3 2098 82 157 +3 1290 1291 1285 +3 1657 1656 1275 +3 1896 494 1767 +3 1651 1275 1653 +3 1652 1657 1275 +3 1967 1966 1272 +3 1326 586 758 +3 2097 158 2098 +3 158 52 2098 +3 1483 82 2098 +3 2114 226 2111 +3 1291 2100 1156 +3 1659 1451 385 +3 1471 1658 1467 +3 2121 1301 2119 +3 1657 1652 1289 +3 1467 1659 385 +3 1660 1375 1374 +3 1375 1660 762 +3 2421 2418 757 +3 2421 755 2418 +3 1661 889 1662 +3 889 1661 1660 +3 1661 762 1660 +3 2417 2413 402 +3 887 882 762 +3 2413 2417 2422 +3 1664 1665 1663 +3 1665 1664 857 +3 1811 1809 861 +3 1663 859 1034 +3 2682 1107 865 +3 1027 859 1026 +3 1665 857 217 +3 1368 1362 773 +3 859 1665 1026 +3 1674 2171 2170 +3 2172 1674 2170 +3 1667 1666 1037 +3 1042 1672 1671 +3 1672 1041 1671 +3 956 231 2175 +3 46 548 974 +3 1672 1048 1032 +3 1842 1238 1843 +3 2158 1668 868 +3 870 1047 1054 +3 1668 1667 1037 +3 2291 1057 2292 +3 1057 2291 874 +3 1093 2498 700 +3 1719 1718 153 +3 872 1672 1032 +3 2170 2169 1042 +3 2172 2170 1042 +3 1120 1121 1940 +3 1035 872 1030 +3 1043 1667 1668 +3 872 1041 1672 +3 1831 261 1750 +3 1667 1673 867 +3 1667 1043 1673 +3 2331 944 945 +3 944 943 945 +3 200 4 1676 +3 1670 1675 1671 +3 2015 116 2020 +3 517 1771 2698 +3 660 661 604 +3 2660 690 2662 +3 1887 90 333 +3 1684 658 679 +3 1726 196 322 +3 2564 2563 342 +3 385 1455 2760 +3 2639 1679 9 +3 199 198 200 +3 2339 199 200 +3 119 118 122 +3 249 939 85 +3 249 1973 939 +3 1996 1995 252 +3 679 658 680 +3 2643 194 2644 +3 2005 2004 880 +3 174 1680 924 +3 925 174 924 +3 1683 1681 1679 +3 32 2032 2031 +3 32 2033 2032 +3 1611 1695 2047 +3 1592 2594 2595 +3 1680 1683 1678 +3 1863 1259 1870 +3 1259 1855 1870 +3 2014 2020 933 +3 1845 1247 1241 +3 1397 2523 1405 +3 1920 879 646 +3 677 630 1685 +3 677 665 630 +3 677 1685 1684 +3 673 677 1684 +3 601 1066 1067 +3 1685 630 705 +3 1849 1249 1847 +3 1879 2438 2433 +3 1858 1857 1243 +3 1690 1516 1514 +3 1516 1205 1514 +3 1217 1690 1514 +3 522 1688 1690 +3 1769 1768 519 +3 936 1779 1778 +3 1693 1315 373 +3 1654 1691 1276 +3 1654 227 1691 +3 1655 227 1654 +3 1278 1691 227 +3 1693 1692 1278 +3 1057 874 2152 +3 1323 1083 1694 +3 1094 701 1093 +3 1695 337 338 +3 1695 1392 337 +3 126 1392 1695 +3 126 1695 1611 +3 1703 1702 506 +3 1297 368 2365 +3 1433 1697 1133 +3 1697 1433 1415 +3 1579 1699 1583 +3 1578 1579 1583 +3 2004 891 763 +3 881 891 2004 +3 1415 2619 2616 +3 950 813 1180 +3 1814 948 1736 +3 2265 2271 1322 +3 2271 2265 2266 +3 1676 201 2451 +3 1787 1785 499 +3 1580 1700 1699 +3 377 376 2770 +3 2734 243 2733 +3 1708 171 1481 +3 1299 1708 1481 +3 824 2124 820 +3 2486 7 204 +3 2729 2730 79 +3 2470 2469 2468 +3 2467 2470 2468 +3 831 2571 488 +3 831 2672 2571 +3 1211 1208 1209 +3 847 2732 850 +3 2725 529 530 +3 2337 1581 1701 +3 1704 2337 1701 +3 2262 1581 2335 +3 2337 2336 1581 +3 2276 2426 2289 +3 155 2097 2099 +3 2097 157 2099 +3 170 83 223 +3 170 1708 83 +3 242 820 2124 +3 819 820 242 +3 171 1708 1709 +3 82 1483 1484 +3 1729 995 994 +3 1718 1716 153 +3 1710 170 1711 +3 1716 64 153 +3 170 1709 1708 +3 1473 1282 2377 +3 699 2666 706 +3 82 169 168 +3 271 98 272 +3 17 268 1712 +3 821 819 476 +3 154 1717 1714 +3 2444 1025 2072 +3 2443 2442 2444 +3 1714 262 1713 +3 262 1714 1715 +3 1716 1715 263 +3 1716 24 1715 +3 64 1716 263 +3 24 262 1715 +3 2072 7 2444 +3 2443 2444 7 +3 208 2080 2081 +3 38 208 2081 +3 265 1718 1720 +3 1718 265 24 +3 265 1720 87 +3 2641 2640 9 +3 1719 213 214 +3 1718 1719 1720 +3 1755 1756 339 +3 1711 1721 1710 +3 1721 1711 1713 +3 1713 169 1721 +3 1095 696 1722 +3 2671 1634 1635 +3 1634 1636 580 +3 574 1149 1220 +3 574 2468 1149 +3 992 2033 2039 +3 2007 1636 697 +3 2007 2006 1636 +3 1636 1637 697 +3 1575 2599 501 +3 2166 1674 1043 +3 2168 2167 1045 +3 2035 2021 2034 +3 260 258 1749 +3 818 242 842 +3 1726 1727 37 +3 322 1727 1726 +3 324 1330 327 +3 1330 324 1731 +3 1733 1728 324 +3 1730 1728 322 +3 1741 322 99 +3 2226 2570 1517 +3 790 2226 1517 +3 2560 2561 2569 +3 2561 2560 344 +3 324 1735 1734 +3 1740 325 339 +3 93 915 916 +3 259 340 1751 +3 1740 323 1741 +3 36 1735 1736 +3 1727 1729 37 +3 37 1729 994 +3 38 343 214 +3 324 327 1735 +3 1730 323 1732 +3 1124 336 331 +3 2569 2561 2565 +3 1738 1328 215 +3 1039 2508 873 +3 212 1330 1331 +3 36 995 1734 +3 339 1742 1739 +3 344 1742 1743 +3 1738 1329 1328 +3 2742 2746 2744 +3 2746 2742 1777 +3 1734 1735 36 +3 1068 1390 629 +3 1389 690 1815 +3 1888 2 492 +3 1886 334 1887 +3 354 1888 492 +3 36 1736 948 +3 1738 327 1329 +3 1070 225 1760 +3 1736 1735 327 +3 1737 1736 327 +3 1738 1737 327 +3 914 215 916 +3 215 1737 1738 +3 2138 143 2647 +3 1739 1740 339 +3 325 1740 1741 +3 99 325 1741 +3 326 325 99 +3 1751 336 77 +3 1731 324 2566 +3 2565 88 2567 +3 2566 2565 2567 +3 1747 342 2563 +3 341 1747 2563 +3 458 1418 1396 +3 1748 258 65 +3 259 1746 1745 +3 341 1745 1746 +3 1746 65 1747 +3 1747 341 1746 +3 2427 2426 2287 +3 326 99 350 +3 77 260 1749 +3 259 1749 1748 +3 340 1750 1751 +3 1750 1752 1751 +3 346 329 345 +3 1755 328 1754 +3 330 1139 1487 +3 1753 330 1487 +3 1139 89 1487 +3 1488 1487 89 +3 1489 1488 89 +3 1139 1138 89 +3 1750 261 1752 +3 946 329 180 +3 946 1138 329 +3 1847 1846 1241 +3 1847 1249 1846 +3 2017 2027 2026 +3 2027 2016 2026 +3 2015 2020 2014 +3 261 1756 1755 +3 261 1755 1754 +3 946 332 1138 +3 33 1759 326 +3 1759 325 326 +3 1759 33 1758 +3 328 1759 1758 +3 1610 473 2113 +3 1070 1071 225 +3 470 1114 1610 +3 40 103 104 +3 1113 291 1070 +3 4 929 1763 +3 1762 1070 1761 +3 1609 470 1610 +3 4 1763 201 +3 925 1682 201 +3 1763 925 201 +3 129 70 125 +3 929 4 930 +3 927 1764 926 +3 121 70 129 +3 1774 569 568 +3 547 92 965 +3 515 1766 1578 +3 1583 515 1578 +3 1766 515 1576 +3 1773 1774 568 +3 2654 782 2700 +3 2658 177 2703 +3 241 2764 1128 +3 494 519 1767 +3 1324 588 2265 +3 1350 567 525 +3 1770 1769 519 +3 1769 1770 239 +3 162 1891 19 +3 1771 523 1772 +3 1707 2743 1706 +3 528 238 524 +3 1783 516 499 +3 1205 1516 2734 +3 569 1774 1775 +3 2747 1707 2332 +3 1784 1785 1795 +3 2748 2745 2747 +3 1797 2748 2747 +3 569 2750 2751 +3 608 392 607 +3 500 498 1215 +3 936 500 1779 +3 1324 2265 1322 +3 2653 2654 464 +3 1773 1780 1774 +3 1502 2653 464 +3 1515 1205 2736 +3 1772 2513 521 +3 521 1796 1772 +3 1208 2733 243 +3 1771 1772 1796 +3 1783 1784 517 +3 1786 2264 2263 +3 2332 2333 1705 +3 503 1787 496 +3 1577 2264 503 +3 499 496 1787 +3 500 518 1779 +3 519 494 1788 +3 1702 1703 2769 +3 1788 1789 516 +3 1788 494 1789 +3 2329 2516 2519 +3 2513 1772 2512 +3 2513 2512 1780 +3 2515 2328 1406 +3 2734 1516 243 +3 312 2367 2368 +3 2262 1706 2263 +3 1777 1792 1793 +3 2519 1407 2520 +3 1790 1791 1775 +3 1774 1790 1775 +3 1795 1771 517 +3 1784 1795 517 +3 1792 1781 1793 +3 56 1794 1785 +3 524 238 520 +3 523 1794 1793 +3 1793 1794 1777 +3 2748 2749 937 +3 1785 1794 1795 +3 523 1795 1794 +3 312 370 2367 +3 2258 2259 1269 +3 1269 1800 2258 +3 1271 1266 365 +3 370 2366 2367 +3 659 603 1801 +3 659 683 603 +3 2415 1185 761 +3 2607 1573 2597 +3 1801 603 631 +3 603 632 631 +3 631 1803 1802 +3 641 1802 1803 +3 641 1803 600 +3 1381 641 600 +3 686 960 1090 +3 1821 960 686 +3 1380 641 1381 +3 604 1805 1804 +3 1123 1821 654 +3 1806 860 1808 +3 706 2668 2626 +3 650 757 2661 +3 650 1922 755 +3 697 1637 2663 +3 978 1616 1807 +3 1807 1616 544 +3 104 2338 51 +3 217 921 1026 +3 218 1808 1809 +3 1813 970 977 +3 1052 1053 1051 +3 2323 2324 1404 +3 472 2178 2186 +3 1227 948 1814 +3 2285 1500 2284 +3 1505 557 1504 +3 1080 1820 685 +3 42 8 1822 +3 1078 95 1079 +3 687 1817 686 +3 1816 686 1817 +3 94 575 574 +3 632 603 695 +3 2652 632 695 +3 632 2652 2650 +3 662 1382 1383 +3 599 1818 786 +3 960 1821 1123 +3 1952 1949 1115 +3 1824 80 1596 +3 1976 939 1973 +3 80 57 40 +3 1824 57 80 +3 1828 1826 1829 +3 1828 62 2555 +3 1742 1831 1743 +3 1823 1824 28 +3 1824 1596 28 +3 291 1113 1954 +3 1824 1823 57 +3 1829 62 1828 +3 42 1825 1826 +3 1825 28 1826 +3 1825 1823 28 +3 1412 2617 1426 +3 2618 2617 1412 +3 1756 1742 339 +3 1742 1756 1831 +3 1885 1886 49 +3 1592 1972 1973 +3 57 107 40 +3 42 1826 1828 +3 100 2557 2556 +3 8 2557 100 +3 2546 100 2556 +3 102 29 103 +3 1829 1830 43 +3 78 202 1025 +3 2331 49 946 +3 2330 2331 946 +3 944 2331 2330 +3 1835 1018 1236 +3 1834 1835 1236 +3 533 1884 1885 +3 736 455 737 +3 1836 1837 1239 +3 456 1839 1020 +3 1841 1238 1842 +3 1841 1840 1238 +3 1838 1252 1021 +3 1226 421 983 +3 2490 1237 2489 +3 1237 1840 2489 +3 1833 1237 2490 +3 2490 2489 1834 +3 1846 1845 1241 +3 1844 1845 1248 +3 1242 1852 1257 +3 1244 1424 1866 +3 1841 1842 1837 +3 1840 1237 737 +3 1238 1840 737 +3 737 1843 1238 +3 1242 1249 1849 +3 78 550 202 +3 2017 2019 930 +3 346 421 180 +3 2135 2142 360 +3 2142 2134 360 +3 1846 1249 1248 +3 1848 1847 1241 +3 1848 1686 1847 +3 1251 1250 1848 +3 1250 1686 1848 +3 1844 1247 1845 +3 1257 1852 54 +3 1242 1850 1851 +3 1850 1242 1849 +3 1852 1242 1851 +3 1866 1873 1245 +3 332 333 1489 +3 1137 1138 1139 +3 329 1138 1137 +3 1250 1859 1258 +3 1859 1243 1258 +3 1854 1851 1850 +3 1853 1854 1850 +3 1849 1686 1850 +3 1258 1854 1853 +3 1243 1855 1258 +3 1855 1854 1258 +3 1263 1244 1865 +3 1250 1258 1853 +3 1861 1261 1860 +3 767 1906 893 +3 1855 1856 1870 +3 25 2050 2049 +3 1856 1243 1857 +3 1246 1859 454 +3 1246 1858 1859 +3 893 1904 1903 +3 434 1458 452 +3 1263 1865 1864 +3 1860 1856 1857 +3 1263 1860 1857 +3 1861 1860 1864 +3 1263 1864 1860 +3 1863 1261 1862 +3 1856 1860 1261 +3 348 139 906 +3 1865 1245 1867 +3 2048 2049 140 +3 1869 1393 441 +3 1869 1862 1262 +3 1862 1869 441 +3 1869 1262 1868 +3 1868 1393 1869 +3 1261 1863 1870 +3 1870 1856 1261 +3 1855 1259 1854 +3 1872 1873 1396 +3 1245 1871 1867 +3 1873 458 1396 +3 458 1873 1866 +3 2436 2437 1876 +3 1871 1874 1868 +3 1395 1874 1871 +3 1874 1393 1868 +3 317 1161 320 +3 1492 2052 142 +3 1395 1871 1872 +3 1871 1245 1872 +3 1876 2435 2436 +3 1872 1420 1879 +3 1395 1872 1879 +3 1876 1394 1877 +3 1875 1876 1877 +3 1866 1424 458 +3 440 1394 1876 +3 1875 1393 1874 +3 45 2443 1932 +3 2434 188 2433 +3 1878 1395 1879 +3 1880 363 750 +3 133 1881 1880 +3 1881 362 1880 +3 134 362 1881 +3 197 2040 2046 +3 1695 338 2047 +3 2494 2495 1040 +3 1126 875 2494 +3 875 2495 2494 +3 958 2673 1162 +3 2637 2636 1883 +3 1882 193 35 +3 2024 197 2045 +3 2037 2021 2036 +3 213 1719 908 +3 537 2726 531 +3 855 222 854 +3 1884 446 334 +3 946 49 1886 +3 332 946 1886 +3 334 1886 1885 +3 1887 332 1886 +3 333 332 1887 +3 334 90 1887 +3 1892 1894 19 +3 101 2545 2544 +3 530 2731 2726 +3 1004 2200 2199 +3 163 71 164 +3 121 71 163 +3 119 70 121 +3 121 129 71 +3 477 20 119 +3 134 1881 1893 +3 1881 466 1893 +3 466 1881 133 +3 19 1891 1892 +3 1420 2438 1879 +3 1420 2439 2438 +3 176 529 2717 +3 529 176 565 +3 159 19 1476 +3 134 132 362 +3 1485 1478 367 +3 1767 846 1896 +3 848 493 849 +3 1900 240 847 +3 240 1900 846 +3 1898 846 1900 +3 1897 1898 389 +3 1899 1901 431 +3 1899 1898 1901 +3 86 1982 2241 +3 86 1984 1982 +3 147 483 1899 +3 495 848 849 +3 493 486 849 +3 2644 2642 2643 +3 1900 1901 1898 +3 1901 1902 431 +3 791 1558 792 +3 847 1902 1901 +3 847 150 1902 +3 847 850 150 +3 1135 186 443 +3 881 892 891 +3 891 892 769 +3 892 1903 769 +3 767 893 1372 +3 892 893 1903 +3 1372 893 892 +3 1175 766 1905 +3 1905 766 1904 +3 1246 1244 1858 +3 1906 770 1175 +3 1485 2716 1474 +3 190 2712 459 +3 1926 648 1925 +3 1930 648 1926 +3 1391 1381 643 +3 2420 761 589 +3 2337 1705 2336 +3 647 628 1911 +3 628 647 1915 +3 756 1922 1925 +3 669 664 665 +3 2256 472 2187 +3 647 889 1918 +3 1921 1920 646 +3 628 1917 1914 +3 1918 1916 647 +3 472 2186 2187 +3 2258 1315 1693 +3 762 882 883 +3 882 879 880 +3 883 882 880 +3 760 1914 1917 +3 932 2015 2014 +3 1024 2573 2572 +3 1913 1914 1919 +3 1914 760 1919 +3 628 1914 1913 +3 812 813 407 +3 1185 1184 694 +3 1920 1919 760 +3 2016 116 2015 +3 1697 2618 1416 +3 1920 1921 756 +3 1910 1931 1909 +3 1913 1924 1927 +3 1924 1925 1927 +3 1928 1927 648 +3 1927 1925 648 +3 1387 1930 1388 +3 1913 1927 1928 +3 1912 1913 1928 +3 1404 1397 1405 +3 2524 2523 1397 +3 1930 1926 1388 +3 593 663 1069 +3 1928 1931 1912 +3 1929 1930 627 +3 1929 627 1909 +3 1910 1909 644 +3 112 45 1932 +3 1929 648 1930 +3 2617 1415 2616 +3 1910 1912 1931 +3 1933 13 1934 +3 1934 13 1935 +3 1964 2487 1440 +3 1470 1964 1440 +3 108 1938 1937 +3 1939 292 1938 +3 108 1939 1938 +3 1937 1936 108 +3 2243 2242 1982 +3 2274 1062 2499 +3 1524 981 980 +3 1941 1940 700 +3 1941 1942 1940 +3 2666 699 1945 +3 2499 2272 2274 +3 1332 288 957 +3 957 288 958 +3 2529 139 2528 +3 2218 2757 2221 +3 1622 2321 2319 +3 701 1095 1944 +3 1943 1944 1945 +3 2572 2573 1120 +3 1060 2507 1126 +3 1941 1943 1942 +3 1943 702 1942 +3 1169 2359 2542 +3 633 676 638 +3 699 702 1943 +3 447 2322 444 +3 1952 1950 1949 +3 1162 957 958 +3 1118 1946 1119 +3 1946 959 1119 +3 1115 1949 1118 +3 1113 1112 1955 +3 291 1953 1115 +3 2182 1002 2219 +3 2193 1003 2189 +3 1010 2195 1009 +3 1111 1961 1953 +3 2217 2184 2216 +3 1109 289 1951 +3 1950 1951 289 +3 2140 358 357 +3 358 2648 357 +3 1112 349 1956 +3 1109 1951 1110 +3 1959 1962 1957 +3 1962 1959 1956 +3 1953 291 1954 +3 2222 2223 2674 +3 1961 1111 1959 +3 1961 1959 1960 +3 1953 1961 1952 +3 1962 1956 349 +3 42 15 8 +3 1956 1111 1955 +3 1110 1957 1958 +3 2557 15 2554 +3 1957 349 1958 +3 165 2554 2553 +3 2557 2554 165 +3 8 15 2557 +3 1960 1116 1961 +3 386 1448 1449 +3 412 1443 1963 +3 1442 1963 1443 +3 1649 1273 1965 +3 1650 1649 1965 +3 1198 1196 2349 +3 1198 1199 1196 +3 1966 1273 1272 +3 371 1650 1966 +3 1650 371 1283 +3 1650 1965 1966 +3 1965 1273 1966 +3 2553 2550 2549 +3 1283 371 1271 +3 347 63 2552 +3 1968 347 2552 +3 31 199 2339 +3 2453 31 2339 +3 2592 1592 2593 +3 62 1829 43 +3 679 2146 637 +3 1974 938 1972 +3 1974 1971 1593 +3 1974 1972 1971 +3 1593 43 1830 +3 2636 2637 18 +3 1593 1971 1970 +3 1972 1592 1971 +3 1593 1970 43 +3 1977 939 1976 +3 1979 1978 940 +3 1978 1979 1977 +3 1975 938 1974 +3 1594 1975 1974 +3 1830 1594 1593 +3 1827 1594 1830 +3 2243 85 2242 +3 940 2242 1979 +3 2241 2242 940 +3 2644 194 993 +3 18 1882 2636 +3 1882 18 2641 +3 168 1983 1981 +3 1980 168 1981 +3 418 2247 2248 +3 683 678 603 +3 1988 902 321 +3 1191 1190 321 +3 1190 1986 321 +3 80 81 1978 +3 80 1978 27 +3 1978 1977 27 +3 1979 939 1977 +3 2243 128 963 +3 85 939 1979 +3 1985 65 257 +3 2693 2694 300 +3 895 2694 2693 +3 1985 257 128 +3 1978 1980 940 +3 1978 81 1980 +3 963 85 2243 +3 1981 940 1980 +3 2229 793 2250 +3 168 81 167 +3 81 168 1980 +3 264 1499 86 +3 1499 1984 86 +3 168 169 1983 +3 1985 128 1984 +3 196 1725 1681 +3 1747 65 1985 +3 266 1747 1985 +3 87 1747 266 +3 266 1985 1984 +3 794 2246 2245 +3 797 2245 2246 +3 1989 1376 884 +3 586 1326 2269 +3 2266 585 1323 +3 1570 2604 2605 +3 1325 1324 1322 +3 1989 890 1376 +3 2607 2611 1991 +3 885 401 1990 +3 890 1989 401 +3 1989 1990 401 +3 2294 2615 289 +3 2615 2294 1948 +3 217 1994 1992 +3 1104 2449 5 +3 1993 1994 922 +3 1763 1764 925 +3 2450 1212 1689 +3 2450 1213 1222 +3 1212 2450 1222 +3 522 2450 1689 +3 2450 522 1213 +3 961 250 251 +3 962 905 961 +3 347 1995 1997 +3 246 347 1998 +3 63 347 246 +3 347 1997 1998 +3 1998 1997 41 +3 1998 2000 246 +3 1616 92 545 +3 2003 515 1583 +3 2002 2001 60 +3 246 2001 2002 +3 2001 247 60 +3 122 70 119 +3 247 2001 2000 +3 515 2003 1703 +3 2768 1582 2769 +3 2030 2014 933 +3 1364 1363 886 +3 2524 1413 2523 +3 2016 2015 932 +3 242 818 819 +3 1804 1803 631 +3 2341 2342 1199 +3 2627 2624 1635 +3 2013 2030 2031 +3 875 2496 2495 +3 921 2449 1104 +3 1038 2504 2502 +3 195 2024 2045 +3 1882 2024 195 +3 2045 197 2046 +3 2023 115 195 +3 35 2024 1882 +3 2041 2042 2023 +3 2042 2041 2022 +3 198 2044 200 +3 2013 932 2014 +3 2031 2030 2012 +3 2040 2035 2022 +3 2040 2036 2035 +3 96 985 984 +3 96 990 986 +3 1079 660 604 +3 931 2016 932 +3 2018 930 935 +3 2017 116 2027 +3 116 2016 2027 +3 2038 197 2025 +3 1676 2339 200 +3 1676 2453 2339 +3 2037 2036 2038 +3 61 991 992 +3 2039 2033 32 +3 201 1682 2451 +3 1696 2274 1061 +3 1995 1968 1969 +3 2041 2046 2040 +3 2038 2036 197 +3 1040 2496 1039 +3 2045 2023 195 +3 2026 2019 2017 +3 2019 2026 931 +3 2026 2016 931 +3 1500 1501 684 +3 2275 1500 684 +3 931 926 2019 +3 2011 2028 933 +3 2028 2030 933 +3 2032 2013 2031 +3 2032 986 2013 +3 2509 2503 1029 +3 2157 2156 2160 +3 2010 934 2011 +3 986 990 2013 +3 2507 875 1126 +3 1108 2292 873 +3 2508 1108 873 +3 2037 2039 32 +3 2012 2029 2021 +3 2029 2034 2021 +3 2029 934 2034 +3 2498 1941 700 +3 1943 1941 2526 +3 2447 918 2446 +3 992 991 2033 +3 2012 2037 32 +3 32 2031 2012 +3 2037 2012 2021 +3 991 61 999 +3 2034 934 2022 +3 2043 115 2042 +3 197 2036 2040 +3 866 1108 2508 +3 2039 2037 2038 +3 934 2042 2022 +3 1037 1061 1060 +3 1037 1060 868 +3 1666 1061 1037 +3 1598 1155 2405 +3 1043 1668 2162 +3 4 200 2044 +3 935 2044 2043 +3 2043 2044 115 +3 286 2754 2755 +3 876 2157 2160 +3 198 115 2044 +3 930 2044 935 +3 4 2044 930 +3 2305 2309 1497 +3 426 2309 2305 +3 2306 1497 2309 +3 26 1937 2055 +3 1937 293 2055 +3 2304 23 2307 +3 789 1528 1532 +3 113 2057 297 +3 2057 26 2056 +3 26 2058 1937 +3 1937 2058 1936 +3 2058 112 1936 +3 2059 112 2058 +3 425 112 2059 +3 112 425 45 +3 113 1497 2306 +3 2306 2059 113 +3 306 151 319 +3 2066 22 298 +3 298 294 2062 +3 2065 2066 2064 +3 2066 298 2064 +3 2065 2064 110 +3 342 214 343 +3 973 91 975 +3 2082 91 973 +3 204 203 2068 +3 477 156 20 +3 59 207 213 +3 207 59 2068 +3 22 1498 297 +3 1498 113 297 +3 151 302 2067 +3 2079 209 2075 +3 209 2079 2083 +3 2080 2076 917 +3 202 2071 1025 +3 203 2071 2070 +3 2072 2071 203 +3 1025 2071 2072 +3 2442 2441 1160 +3 2068 59 204 +3 2072 203 204 +3 7 2072 204 +3 24 1716 1718 +3 1419 1418 2445 +3 1418 1419 1396 +3 2077 2076 209 +3 213 2078 38 +3 547 210 546 +3 2078 208 38 +3 219 920 2077 +3 2075 2076 2080 +3 207 2074 2078 +3 2073 2074 207 +3 219 2088 968 +3 2075 2080 208 +3 2074 2075 208 +3 202 974 975 +3 156 155 20 +3 155 156 2097 +3 203 2069 2068 +3 2082 2079 91 +3 1314 1277 1154 +3 209 2083 2084 +3 2084 2085 2077 +3 2085 2084 966 +3 2084 2077 209 +3 547 965 2086 +3 966 547 2086 +3 966 2086 2085 +3 967 2087 965 +3 967 2088 2087 +3 2088 219 2087 +3 968 2090 969 +3 2069 207 2068 +3 205 59 206 +3 2092 92 979 +3 2094 220 977 +3 965 92 2092 +3 967 2091 2089 +3 11 58 205 +3 2092 979 220 +3 978 979 1616 +3 220 2091 2092 +3 967 2092 2091 +3 2682 2290 863 +3 2082 2096 2079 +3 2083 2096 972 +3 2079 2096 2083 +3 1314 224 2102 +3 1290 2100 1291 +3 2099 157 51 +3 2100 1290 1277 +3 2101 2100 1277 +3 1277 1314 2101 +3 1314 2102 2101 +3 1293 230 1292 +3 1294 2106 1310 +3 2105 228 2106 +3 1293 2105 2106 +3 2110 2109 1296 +3 2121 2122 223 +3 2107 1295 2103 +3 2102 2107 2103 +3 2105 2110 228 +3 1295 2109 2110 +3 2108 2109 1295 +3 1294 1293 2106 +3 230 1293 1294 +3 2103 2101 2102 +3 2102 1298 2107 +3 2120 2112 2113 +3 231 1309 284 +3 1295 2110 2105 +3 2121 2115 1301 +3 2115 2121 1303 +3 84 51 167 +3 226 2114 2115 +3 1298 2112 2111 +3 225 1071 2118 +3 1300 2116 2114 +3 2116 2115 2114 +3 2116 1301 2115 +3 1154 1277 1657 +3 1300 225 2116 +3 1300 1760 225 +3 2102 224 2113 +3 2102 2113 1298 +3 224 1610 2113 +3 1071 288 2118 +3 1333 288 1332 +3 2114 2112 1300 +3 296 2117 2118 +3 296 2119 2117 +3 2123 1712 170 +3 223 1303 2121 +3 82 168 167 +3 2122 1712 2123 +3 1711 170 1712 +3 170 223 2123 +3 2678 487 2677 +3 826 2678 824 +3 393 826 824 +3 824 2678 2124 +3 485 843 831 +3 1464 2144 479 +3 2144 2143 479 +3 2139 2135 360 +3 785 2649 2652 +3 2498 2526 1941 +3 2498 701 2526 +3 2533 1170 2358 +3 1888 2129 353 +3 1888 355 2129 +3 353 2129 2130 +3 1505 1504 178 +3 2646 2647 383 +3 2520 1408 2519 +3 2316 689 2311 +3 356 2126 2134 +3 146 2302 427 +3 352 351 2131 +3 356 2134 2133 +3 2126 114 2134 +3 896 144 361 +3 2143 2127 2136 +3 154 2145 1717 +3 2145 267 1717 +3 299 2687 2689 +3 2145 154 1712 +3 383 44 382 +3 2684 902 2693 +3 409 619 953 +3 2139 361 2135 +3 361 144 2135 +3 114 799 360 +3 241 823 2764 +3 2139 2300 145 +3 624 604 1804 +3 2685 903 2684 +3 300 2685 2684 +3 1525 1526 790 +3 2136 479 2143 +3 1712 268 2145 +3 267 268 97 +3 1130 2146 2147 +3 2146 679 2147 +3 657 1130 2147 +3 2148 1501 682 +3 2149 2148 682 +3 689 2313 2312 +3 2147 679 680 +3 2148 2147 680 +3 2279 2281 3 +3 1159 2281 2279 +3 712 2280 3 +3 657 2148 2149 +3 657 2147 2148 +3 1618 1620 1621 +3 1017 714 1129 +3 983 987 2150 +3 96 2150 987 +3 181 983 984 +3 2153 2152 874 +3 1058 868 1127 +3 292 109 2060 +3 1056 868 2151 +3 865 2681 2682 +3 2211 2212 2213 +3 286 1009 2190 +3 1057 2152 2151 +3 876 1668 2158 +3 2154 874 1047 +3 2162 1668 876 +3 870 1045 1046 +3 2156 1055 2155 +3 1108 863 2292 +3 2158 868 1056 +3 2165 2167 877 +3 2164 1046 1045 +3 2171 2165 877 +3 2171 2166 2165 +3 2172 1673 1674 +3 2166 1044 2165 +3 2275 2289 2278 +3 2289 1159 2278 +3 1042 2169 1672 +3 2169 1048 1672 +3 1198 2341 1199 +3 1201 1200 2347 +3 1198 2340 2341 +3 1315 2258 1800 +3 1675 1673 2174 +3 1673 1675 867 +3 2175 285 957 +3 285 1332 957 +3 2177 956 2176 +3 2176 956 2175 +3 957 2176 2175 +3 2218 1002 2756 +3 1895 19 1894 +3 2216 2184 2224 +3 2755 1958 286 +3 2262 2263 506 +3 2177 2178 956 +3 956 2179 469 +3 956 2178 2179 +3 2178 472 2179 +3 2694 896 300 +3 1417 2445 1397 +3 2445 2524 1397 +3 892 881 768 +3 2182 1003 1001 +3 2181 2182 1001 +3 2198 1007 2201 +3 964 1601 1602 +3 1006 1003 2193 +3 2184 1002 2183 +3 2180 2186 2178 +3 709 1092 2558 +3 709 1093 1092 +3 2177 2176 287 +3 2183 2181 287 +3 2191 2216 2225 +3 2194 1006 2193 +3 2226 790 1522 +3 2403 2402 2194 +3 1110 2755 1005 +3 2575 829 2675 +3 828 2575 2675 +3 1007 1011 2201 +3 2204 2203 2202 +3 2207 2209 2208 +3 2209 1112 2204 +3 2546 2556 2545 +3 2196 2208 2200 +3 2196 2207 2208 +3 2544 2545 244 +3 1313 2410 1601 +3 2408 1151 1305 +3 2545 165 244 +3 290 1117 2203 +3 2412 2423 1187 +3 1011 1007 2203 +3 290 2204 1112 +3 2204 290 2203 +3 1652 1157 1289 +3 1999 2000 1998 +3 1651 1157 1652 +3 2206 2205 2195 +3 1010 2206 2195 +3 1008 2200 2208 +3 2209 1008 2208 +3 8 100 102 +3 1010 1958 2207 +3 2294 2293 1948 +3 2294 1947 2293 +3 2211 2213 1947 +3 841 2573 1024 +3 295 269 2397 +3 1109 2191 2210 +3 2190 2189 2223 +3 1109 2210 2211 +3 2179 472 2256 +3 352 2131 75 +3 2753 2754 2185 +3 1109 1110 1005 +3 2191 1109 1005 +3 2210 2212 2211 +3 1333 1332 269 +3 2214 2213 1946 +3 1827 1829 1826 +3 2637 1883 198 +3 2228 2227 1555 +3 2218 2221 2219 +3 97 268 270 +3 18 2637 2638 +3 1332 285 2400 +3 959 2224 2184 +3 1517 797 1519 +3 2579 1176 772 +3 2228 2229 149 +3 793 2578 2230 +3 2577 2578 793 +3 2249 2250 2230 +3 1462 430 1463 +3 1462 1463 1461 +3 2239 804 405 +3 2579 1171 1176 +3 2675 2676 828 +3 147 1899 431 +3 2233 793 2229 +3 2229 2250 149 +3 2230 2231 794 +3 2245 2230 794 +3 1172 2579 772 +3 391 1143 587 +3 2463 2465 594 +3 2575 2577 2576 +3 2575 2232 2577 +3 1470 412 1964 +3 147 431 1462 +3 2577 793 2576 +3 390 2235 485 +3 826 827 487 +3 2235 486 493 +3 485 2235 493 +3 844 485 493 +3 2237 2238 806 +3 815 806 2238 +3 2239 405 2238 +3 2236 805 2237 +3 2237 406 2236 +3 2238 2240 815 +3 805 2236 1143 +3 795 2248 2231 +3 265 87 266 +3 2241 1981 86 +3 1521 797 2246 +3 2644 993 35 +3 193 2644 35 +3 2241 1982 2242 +3 1517 2244 797 +3 118 119 20 +3 2250 2249 149 +3 149 2227 2228 +3 1818 2463 594 +3 2575 390 829 +3 2572 1940 2574 +3 2233 2229 2228 +3 795 418 2248 +3 2245 2249 2230 +3 2251 1471 1441 +3 490 1471 2251 +3 2216 2224 2252 +3 2225 2216 2252 +3 2215 2252 2224 +3 2225 2252 2215 +3 2151 2152 1056 +3 2153 1056 2152 +3 271 6 1165 +3 284 98 2399 +3 2398 2400 2399 +3 2400 2398 269 +3 2194 2402 2401 +3 1004 2194 2401 +3 2531 1523 1519 +3 283 2398 2399 +3 2159 1056 2153 +3 1269 2259 2260 +3 2259 1284 2260 +3 570 1580 1778 +3 2336 2335 1581 +3 2336 2334 2335 +3 1705 2334 2336 +3 1581 2262 1702 +3 2262 506 1702 +3 531 2731 533 +3 2731 1884 533 +3 1990 1989 884 +3 2266 1323 2268 +3 403 2295 780 +3 702 2559 840 +3 2269 1325 1322 +3 1326 1325 2269 +3 759 1325 1326 +3 1061 2272 1060 +3 2503 1038 2502 +3 2503 2509 1038 +3 2496 875 2497 +3 2273 875 2507 +3 2506 2273 2507 +3 2499 1062 2500 +3 2361 716 2282 +3 2274 1597 1062 +3 2274 1696 1597 +3 716 2358 2282 +3 2362 2011 933 +3 2318 713 2319 +3 2280 2284 2283 +3 682 2286 2149 +3 1400 2324 2323 +3 2286 2284 2280 +3 1501 2285 682 +3 717 1158 684 +3 682 2284 2286 +3 1501 1500 2285 +3 1152 1603 2683 +3 1603 1604 2683 +3 2315 1618 1621 +3 2311 1617 2316 +3 2276 1158 2288 +3 2275 1158 2276 +3 684 1158 2275 +3 2275 2276 2289 +3 2008 577 2007 +3 2009 2008 2007 +3 2667 1637 2670 +3 1722 696 2009 +3 696 2008 2009 +3 696 1095 1094 +3 498 512 823 +3 2287 2288 2277 +3 2288 1158 2277 +3 2426 2427 2289 +3 2427 1159 2289 +3 2296 1324 780 +3 2296 588 1324 +3 2407 2406 1287 +3 2407 2405 2406 +3 1287 2409 1157 +3 1600 1154 2297 +3 1518 1522 789 +3 799 2299 2300 +3 799 427 2299 +3 145 2300 2299 +3 2300 2139 360 +3 799 2300 360 +3 2430 494 2432 +3 2059 2306 425 +3 2310 2306 2309 +3 2310 425 2306 +3 1497 1498 2298 +3 2307 23 2308 +3 425 2307 2308 +3 427 2302 2301 +3 426 2303 2304 +3 426 2310 2309 +3 2307 425 2310 +3 1493 75 1492 +3 45 425 2308 +3 2442 2443 45 +3 1025 2442 1160 +3 2445 1417 1419 +3 1417 1398 1419 +3 2525 1407 1425 +3 868 1060 1126 +3 2313 714 1017 +3 1621 714 2313 +3 2318 1619 1618 +3 2314 2149 2286 +3 2315 1621 2313 +3 1407 2519 2516 +3 1575 2609 2599 +3 511 1561 1534 +3 1170 2359 2358 +3 384 1454 2322 +3 1999 1998 41 +3 2759 1999 41 +3 2362 2010 2011 +3 2537 2538 715 +3 2540 2537 715 +3 2430 1789 494 +3 848 1789 2430 +3 2299 427 2429 +3 624 631 2651 +3 2320 2321 721 +3 1622 1624 2321 +3 2323 1404 1405 +3 384 447 1342 +3 384 2322 447 +3 2325 1403 2326 +3 2441 2308 1160 +3 2308 2441 45 +3 136 380 377 +3 136 379 380 +3 1833 2490 2491 +3 2492 1833 2491 +3 1223 944 2330 +3 2492 2491 1236 +3 136 374 379 +3 570 2332 1705 +3 2331 945 49 +3 504 1589 512 +3 512 498 504 +3 2191 2192 2216 +3 2340 1197 2341 +3 570 1797 2332 +3 286 2190 2754 +3 529 2725 256 +3 2746 56 2743 +3 2333 2334 1705 +3 2333 2261 2334 +3 2721 2724 536 +3 445 444 186 +3 1664 860 221 +3 155 2338 105 +3 51 84 104 +3 2603 2601 1569 +3 2338 104 105 +3 2458 2459 1098 +3 1968 43 1970 +3 2637 199 2638 +3 2748 937 2745 +3 1792 2742 2741 +3 2741 2740 1792 +3 2340 1221 1197 +3 2340 2348 1221 +3 1206 2343 1197 +3 2343 2342 1197 +3 613 398 1207 +3 2343 1206 2347 +3 2741 2742 937 +3 1775 2741 937 +3 2541 1622 1623 +3 2348 1198 2349 +3 615 613 2355 +3 615 417 613 +3 2352 2351 2350 +3 424 2351 2352 +3 2350 2349 1196 +3 775 777 2484 +3 777 775 774 +3 424 615 2351 +3 1194 424 2352 +3 424 1194 1195 +3 2351 615 2355 +3 2355 2354 612 +3 2353 612 2354 +3 2351 2355 612 +3 2350 2351 612 +3 716 2360 2532 +3 2533 716 2532 +3 2356 2535 2534 +3 2356 717 2535 +3 2356 2534 2533 +3 2532 2356 2533 +3 716 2533 2358 +3 715 2541 2540 +3 717 2356 2357 +3 717 2357 1158 +3 2360 2277 1158 +3 2357 2360 1158 +3 1310 2365 370 +3 2106 228 1310 +3 228 2365 1310 +3 1297 2365 228 +3 314 315 235 +3 2366 229 2367 +3 2363 1472 2369 +3 311 312 2368 +3 1281 2363 2369 +3 314 232 315 +3 2377 2369 1473 +3 2378 1282 2379 +3 2370 2371 1377 +3 1281 2371 2370 +3 2374 1799 365 +3 2374 1268 1799 +3 2377 2376 1281 +3 1281 2369 2377 +3 1800 2372 1315 +3 2375 2368 229 +3 2367 229 2368 +3 2371 1281 2376 +3 309 1264 372 +3 2388 309 372 +3 2385 466 467 +3 466 2385 1895 +3 2374 2373 1268 +3 2376 366 2372 +3 1476 2384 2383 +3 2376 2378 366 +3 2377 2378 2376 +3 1280 2381 2382 +3 161 1477 1474 +3 2384 1895 2385 +3 2377 1282 2378 +3 2378 2381 366 +3 2380 2383 2387 +3 19 159 162 +3 162 159 158 +3 1475 1478 1477 +3 2388 2387 2391 +3 309 2388 2389 +3 366 2386 1315 +3 2372 366 1315 +3 2386 366 2381 +3 2381 1280 2386 +3 1477 161 1479 +3 1475 1477 1479 +3 1480 161 1316 +3 1280 2680 53 +3 2393 644 605 +3 644 2393 1910 +3 373 2386 2390 +3 373 1315 2386 +3 369 2387 2388 +3 309 2389 1016 +3 373 2390 1279 +3 2387 160 2391 +3 79 2732 2729 +3 1922 650 1926 +3 1662 888 2422 +3 2395 271 2394 +3 98 283 2399 +3 270 2397 2396 +3 2401 2195 2205 +3 1004 2401 2205 +3 2399 285 284 +3 1009 2402 2403 +3 2402 1009 2195 +3 2402 2195 2401 +3 2189 1009 2404 +3 2404 2193 2189 +3 1151 2407 1287 +3 1305 1602 2410 +3 1305 2410 2408 +3 2408 2410 1313 +3 1602 1601 2410 +3 1007 2198 2199 +3 1313 1598 2405 +3 1601 1598 1313 +3 1155 2406 2405 +3 2407 2408 1313 +3 1155 2411 2406 +3 2411 1155 2297 +3 2423 2392 1187 +3 2422 2417 1662 +3 2417 887 1662 +3 2418 402 757 +3 2420 589 1327 +3 1662 887 1661 +3 759 2416 2420 +3 2416 2414 2420 +3 759 1326 2416 +3 650 2421 757 +3 650 755 2421 +3 1186 1185 2415 +3 2414 2416 402 +3 758 757 2416 +3 757 402 2416 +3 758 586 1081 +3 1326 758 2416 +3 2420 1327 759 +3 1911 2424 647 +3 2419 882 887 +3 2414 761 2420 +3 888 2423 2412 +3 2423 2424 2392 +3 2423 888 2424 +3 2424 645 2392 +3 1911 645 2424 +3 1921 2419 755 +3 888 647 2424 +3 646 2419 1921 +3 860 2425 1810 +3 2287 2426 2288 +3 427 2301 2429 +3 2429 2298 2299 +3 2435 1436 1399 +3 2431 845 493 +3 845 844 493 +3 848 2431 493 +3 2478 2479 843 +3 484 843 2479 +3 2432 1897 845 +3 2430 2432 845 +3 1128 2763 394 +3 2763 2762 394 +3 848 2430 2431 +3 1896 1897 2432 +3 494 1896 2432 +3 389 2479 2478 +3 438 2436 1399 +3 438 2437 2436 +3 438 1411 2437 +3 188 2434 2435 +3 2434 1436 2435 +3 1411 440 2437 +3 1398 2440 2439 +3 1436 2434 2438 +3 2434 2433 2438 +3 2443 7 13 +3 1932 2443 13 +3 2562 341 2563 +3 423 971 2446 +3 994 61 993 +3 919 2447 2446 +3 2449 921 1992 +3 2449 1992 919 +3 2448 2449 919 +3 2448 5 2449 +3 971 5 2448 +3 976 5 971 +3 1101 1120 2573 +3 1969 252 1995 +3 2452 2453 1676 +3 2452 31 2453 +3 2451 2452 1676 +3 249 85 251 +3 905 68 961 +3 1024 2574 1942 +3 841 1072 2456 +3 2538 718 1625 +3 2457 1099 839 +3 1099 1122 839 +3 1098 2459 2460 +3 688 2460 2459 +3 2454 1099 2457 +3 2454 2458 1099 +3 2460 1090 1098 +3 2466 2650 594 +3 2465 2466 594 +3 624 2651 2466 +3 688 2461 2460 +3 2461 1090 2460 +3 1818 687 2463 +3 1219 573 94 +3 2466 1088 1087 +3 797 2244 2245 +3 2357 2532 2360 +3 2467 1634 580 +3 1125 911 2471 +3 950 1180 414 +3 2472 911 2473 +3 1055 2157 2159 +3 950 414 951 +3 2477 950 951 +3 518 500 1215 +3 1634 1637 1636 +3 575 1634 2467 +3 1635 1634 575 +3 1724 2469 580 +3 2473 173 2472 +3 808 407 825 +3 2536 2758 1170 +3 2534 2536 1170 +3 1170 2758 2539 +3 2758 2537 2539 +3 1778 1776 570 +3 950 2477 781 +3 807 407 808 +3 813 2475 407 +3 1357 693 2473 +3 693 1357 779 +3 2474 2472 825 +3 2475 2474 825 +3 2474 2475 781 +3 2763 822 2762 +3 2476 1125 2471 +3 845 389 2478 +3 1897 389 845 +3 2478 844 845 +3 1317 2484 608 +3 2706 416 2705 +3 955 2706 2705 +3 783 2708 2702 +3 2708 2705 2702 +3 2705 2708 2701 +3 608 2484 1195 +3 1810 2425 2485 +3 1033 861 2485 +3 1195 2483 2482 +3 861 1810 2485 +3 1810 861 1809 +3 2484 2483 1195 +3 2484 777 2483 +3 2425 1034 2485 +3 2605 2604 16 +3 7 2486 13 +3 13 2486 1935 +3 2489 1836 1834 +3 1971 1592 2592 +3 251 85 963 +3 2592 1970 1971 +3 2489 1840 1836 +3 2491 2490 1834 +3 1234 1832 1236 +3 946 180 1223 +3 2491 1834 1236 +3 2493 1235 738 +3 2642 2641 9 +3 2493 738 1833 +3 1126 2494 1127 +3 2766 2292 1057 +3 2765 2766 1058 +3 875 2273 2497 +3 2500 1062 2501 +3 866 2508 2505 +3 2495 2496 1040 +3 1103 862 1104 +3 2502 2501 869 +3 2503 869 1035 +3 2502 869 2503 +3 1029 2503 1035 +3 1103 2505 1038 +3 2505 1103 866 +3 2272 1061 2274 +3 2506 2272 2499 +3 2500 2506 2499 +3 2500 2273 2506 +3 873 1040 1039 +3 2272 2506 1060 +3 862 2509 2510 +3 2509 862 1103 +3 862 2510 1028 +3 1772 1890 2512 +3 2734 2735 1205 +3 1775 2749 2750 +3 2514 1890 1781 +3 2514 2512 1890 +3 1790 2514 1781 +3 1790 1780 2514 +3 1780 2512 2514 +3 1164 381 44 +3 1987 301 897 +3 899 301 1987 +3 1406 2518 2517 +3 2517 2518 1401 +3 1986 1987 897 +3 2323 2518 1406 +3 438 1408 2520 +3 1421 1402 2524 +3 2524 1402 1413 +3 1418 1421 2524 +3 2518 1405 2522 +3 2518 2522 1401 +3 2522 1413 1401 +3 2522 2523 1413 +3 2522 1405 2523 +3 1675 2697 867 +3 374 375 348 +3 375 2527 348 +3 164 131 134 +3 375 135 2527 +3 135 2528 2527 +3 2528 348 2527 +3 139 348 2528 +3 73 139 2529 +3 74 348 906 +3 269 1332 2400 +3 2548 2547 244 +3 2356 2532 2357 +3 718 2538 1628 +3 250 253 2759 +3 839 1121 1120 +3 250 2759 41 +3 41 1996 250 +3 1628 2536 2535 +3 2536 2534 2535 +3 961 253 250 +3 2537 2540 2539 +3 2539 2540 2359 +3 2543 1624 715 +3 721 1624 1625 +3 1624 1622 2541 +3 1169 2542 3 +3 717 681 718 +3 2538 2543 715 +3 1889 101 2544 +3 29 100 2546 +3 100 29 102 +3 344 2560 1742 +3 255 2546 101 +3 255 29 2546 +3 60 1889 2547 +3 244 2549 2548 +3 2549 245 2548 +3 244 2547 2544 +3 2547 1889 2544 +3 166 2553 2554 +3 166 2550 2553 +3 67 254 247 +3 2552 63 2551 +3 2550 245 2549 +3 166 62 2551 +3 166 2551 2550 +3 2551 63 2550 +3 254 255 101 +3 67 255 254 +3 2553 2549 244 +3 165 2553 244 +3 2552 62 43 +3 1968 2552 43 +3 1677 31 2452 +3 62 2552 2551 +3 2554 2555 166 +3 2555 2554 15 +3 15 42 2555 +3 2558 1092 710 +3 840 2558 710 +3 2570 2227 149 +3 585 1648 1145 +3 2559 702 579 +3 2561 344 1744 +3 1732 323 1739 +3 2566 2567 1731 +3 2564 2567 88 +3 2567 2564 2568 +3 1732 2560 2569 +3 340 1744 1743 +3 88 2563 2564 +3 342 343 2564 +3 2565 1732 2569 +3 2565 2566 1732 +3 1731 2567 2568 +3 1330 212 1329 +3 430 146 799 +3 1728 1730 324 +3 1330 1731 2568 +3 2568 1331 1330 +3 1331 2568 343 +3 343 2568 2564 +3 430 799 114 +3 430 114 1464 +3 1464 114 2144 +3 2571 507 488 +3 1461 1460 147 +3 2231 2578 2232 +3 1101 2573 2456 +3 242 2678 2677 +3 842 242 2677 +3 2578 2231 2230 +3 2232 795 2231 +3 2233 2576 793 +3 2240 405 816 +3 1939 1934 12 +3 1546 1544 2582 +3 2582 1544 2581 +3 2581 1544 1564 +3 1544 1561 1564 +3 2582 1548 1546 +3 2584 840 710 +3 2586 1433 1133 +3 2586 2587 1438 +3 1469 1438 2587 +3 1469 1439 1438 +3 2589 2588 1437 +3 2586 1133 2587 +3 1698 2588 1133 +3 2587 1133 2588 +3 1434 2586 1438 +3 1469 2587 2588 +3 307 305 306 +3 2591 1431 1432 +3 2488 432 1468 +3 2591 2590 1431 +3 2596 250 1996 +3 2593 1970 2592 +3 2594 1592 1973 +3 250 249 251 +3 2596 249 250 +3 2594 1973 249 +3 1969 2595 252 +3 2595 2594 252 +3 548 546 974 +3 2613 1585 1590 +3 1588 504 2606 +3 2598 2600 1570 +3 972 547 966 +3 1569 2601 1571 +3 2598 1570 2599 +3 2608 2609 2610 +3 2609 1575 2610 +3 79 550 233 +3 850 79 233 +3 2601 513 2602 +3 2605 2599 1570 +3 2605 2606 2599 +3 513 496 2602 +3 2599 2606 501 +3 2612 1590 2604 +3 2608 2607 502 +3 2608 2611 2607 +3 1949 2615 1948 +3 2603 1569 2612 +3 1573 513 1572 +3 1573 1572 2597 +3 2609 2608 502 +3 2608 1574 2611 +3 1574 1991 2611 +3 1574 1576 1991 +3 1766 1576 1574 +3 1570 2603 2614 +3 2615 1950 289 +3 2612 2613 1590 +3 1569 2613 2612 +3 2613 1569 1585 +3 2616 1410 10 +3 2617 2616 10 +3 1426 2617 10 +3 10 2525 1426 +3 2525 1425 1426 +3 439 1410 2619 +3 583 2622 2621 +3 1639 1638 2620 +3 1645 1639 2620 +3 583 2621 2623 +3 606 1641 1640 +3 2621 1646 1645 +3 706 707 579 +3 396 2630 2627 +3 2631 2627 1635 +3 2625 2623 707 +3 2626 2624 2625 +3 2623 2620 707 +3 2623 2621 2620 +3 1645 2620 2621 +3 2625 706 2626 +3 2631 1635 575 +3 2624 2626 578 +3 396 801 800 +3 2629 2630 583 +3 2629 583 2628 +3 396 2627 2631 +3 2628 2625 2624 +3 2629 2628 2624 +3 396 800 2630 +3 1149 397 1148 +3 1192 1148 610 +3 2632 94 802 +3 843 484 2672 +3 2635 1470 1440 +3 214 1720 1719 +3 2639 2640 2638 +3 2141 2646 383 +3 199 31 2639 +3 199 2639 2638 +3 2641 18 2640 +3 1883 2645 195 +3 2643 2642 9 +3 1681 1725 2643 +3 1725 194 2643 +3 2641 193 1882 +3 1681 2643 9 +3 993 992 35 +3 2642 2644 193 +3 2641 2642 193 +3 1725 1726 194 +3 2645 1882 195 +3 2132 2133 357 +3 2647 2648 383 +3 143 2132 2647 +3 358 44 2648 +3 359 44 358 +3 602 785 633 +3 2651 2650 2466 +3 2651 632 2650 +3 2651 631 632 +3 1523 1525 1519 +3 783 2699 2700 +3 783 2655 2699 +3 557 2653 1502 +3 1503 2653 557 +3 2703 2702 416 +3 1430 465 2711 +3 2702 2657 783 +3 464 2656 559 +3 559 2656 560 +3 556 782 1503 +3 1832 1234 2659 +3 2659 1234 723 +3 723 1235 2659 +3 1832 1235 2493 +3 1832 2659 1235 +3 2660 685 1819 +3 685 1820 1819 +3 690 1816 1815 +3 690 1389 2662 +3 1386 596 2662 +3 2626 2668 578 +3 1188 605 1189 +3 651 2661 757 +3 510 1589 1563 +3 795 827 796 +3 1589 510 512 +3 395 801 802 +3 2009 2007 697 +3 2664 576 2669 +3 1637 2667 2663 +3 2009 697 2669 +3 576 1722 2669 +3 2756 2752 2218 +3 1635 2624 2671 +3 2671 2624 578 +3 578 2670 2671 +3 396 2632 802 +3 396 2631 2632 +3 1634 2671 2670 +3 2670 1637 1634 +3 1642 581 577 +3 1118 2673 1115 +3 2752 2756 2217 +3 1954 1113 1955 +3 1115 2673 958 +3 2678 242 2124 +3 830 2676 2675 +3 2388 372 2679 +3 369 2388 2679 +3 53 2679 1266 +3 365 1266 1265 +3 1266 372 1265 +3 372 1266 2679 +3 865 976 2681 +3 1052 2682 864 +3 1052 2290 2682 +3 903 902 2684 +3 903 321 902 +3 145 2692 361 +3 2687 111 903 +3 2686 2689 2690 +3 894 144 2695 +3 2686 299 2689 +3 2686 22 299 +3 361 2691 896 +3 2686 2692 22 +3 2688 303 111 +3 2695 896 2694 +3 2694 895 2695 +3 1498 22 2692 +3 2696 2695 895 +3 897 2696 895 +3 301 2696 897 +3 2698 1771 1770 +3 1782 2698 1770 +3 2698 1782 517 +3 433 442 434 +3 2709 1437 435 +3 519 1768 1767 +3 525 1352 1351 +3 2711 465 2712 +3 2706 837 2707 +3 1797 2747 2332 +3 955 2701 409 +3 2703 2657 2702 +3 415 955 953 +3 2701 2708 783 +3 2704 413 1432 +3 413 836 1432 +3 1792 1777 2742 +3 2707 2704 416 +3 2706 2707 416 +3 490 1446 1658 +3 837 413 2707 +3 190 1432 2711 +3 2711 1432 2710 +3 1428 2715 1427 +3 1427 2715 1416 +3 1428 2714 2715 +3 2714 1428 1429 +3 2714 435 2715 +3 1698 1416 2715 +3 751 753 308 +3 14 305 307 +3 1015 2391 160 +3 307 306 152 +3 537 2725 2726 +3 2728 2727 535 +3 238 2727 2728 +3 2731 184 1884 +3 530 184 2731 +3 2729 520 238 +3 2729 238 2728 +3 97 2738 273 +3 2738 97 1165 +3 2737 571 1203 +3 1204 2733 2737 +3 937 2744 2745 +3 2749 1775 937 +3 2745 2743 1707 +3 1779 569 2751 +3 1776 2751 2750 +3 2537 2758 2536 +3 2192 2754 2753 +3 1005 2754 2192 +3 2754 1005 2755 +3 2755 1110 1958 +3 2221 2757 2753 +3 2752 2753 2757 +3 385 2760 1467 +3 2762 822 824 +3 823 822 2764 +3 1700 1582 2767 +3 1040 873 2765 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_curved_hole.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_curved_hole.off new file mode 100644 index 00000000000..b4959a80fe6 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_curved_hole.off @@ -0,0 +1,8091 @@ +OFF +2700 5389 0 +0.262933 0.102269 0.138247 +0.0843142 0.0418575 -0.0419302 +0.0676609 -0.0308717 0.133371 +0.202895 0.468475 0.0802072 +0.113075 -0.465378 -0.0546734 +0.225577 -0.277149 -0.193776 +-0.146525 -0.22403 -0.169286 +-0.0249865 -0.129931 -0.13238 +-0.160965 -0.480027 -0.0707824 +0.0794063 -0.415277 -0.0839096 +0.0469116 -0.050008 0.252355 +-0.0998372 -0.193745 -0.16268 +-0.111131 -0.104825 -0.14166 +-0.061459 -0.0977343 -0.133353 +-0.247783 -0.131539 0.0722694 +-0.145972 -0.486627 -0.0633275 +0.0916759 0.0333604 -0.133002 +-0.184954 -0.325468 -0.133853 +0.0847778 -0.432659 -0.0978527 +-0.210776 -0.299151 0.0751516 +-0.151539 -0.388715 0.01282 +-0.154564 -0.438244 -0.0249412 +-0.123411 -0.0182656 0.0135824 +0.00773278 -0.053391 -0.0428874 +-0.0774524 -0.292395 -0.106335 +0.0201594 -0.263586 0.119859 +-0.105646 -0.0365155 -0.0770751 +-0.113391 -0.41896 -0.0906771 +-0.128213 -0.46259 -0.0994907 +-0.160526 -0.468057 -0.0393445 +0.197609 -0.127492 -0.0574767 +0.0757306 -0.449539 -0.0614557 +0.147148 -0.412461 -0.0801639 +0.103782 -0.333007 0.0288926 +0.108917 -0.401981 -0.00841926 +0.11392 -0.408931 -0.0973654 +0.129733 -0.31331 -0.0672325 +0.0904388 -0.356531 -0.0803906 +0.0359798 -0.255445 -0.113562 +-0.22312 -0.107007 -0.0611904 +-0.163408 -0.433458 -0.0704785 +-0.0915185 -0.473885 -0.0165533 +-0.141417 -0.474418 -0.0834065 +-0.0944539 -0.479454 -0.0663683 +-0.085985 -0.101282 0.158093 +-0.0225438 -0.0889567 -0.0848587 +0.092707 -0.109496 -0.114561 +-0.159213 -0.159272 -0.138793 +-0.24541 -0.230248 -0.110578 +0.183744 -0.231931 0.0176086 +0.294273 -0.0955008 0.116328 +-0.16477 -0.385872 -0.0413331 +-0.185303 -0.313456 -0.00374653 +-0.297084 -0.262835 -0.00415653 +0.167756 -0.128776 0.197921 +-0.0273811 0.0608812 -0.0989637 +0.208303 0.00452459 -0.0746544 +-0.150831 -0.448909 -0.0901866 +-0.0720206 -0.147118 -0.154796 +-0.0197986 -0.210658 -0.154154 +-0.130593 -0.498558 -0.021161 +0.129662 -0.373473 -0.0794411 +-0.120692 -0.481168 -0.0685411 +-0.108692 -0.494274 -0.0429275 +-0.0970902 -0.252938 -0.14843 +-0.0098054 -0.335319 -0.0147292 +0.0769246 -0.410346 -0.0391239 +-0.132409 -0.464154 -0.0197707 +-0.102806 -0.4217 0.00855496 +-0.0760332 -0.34128 0.100617 +-0.104435 -0.377391 0.0553722 +-0.14788 -0.33188 0.0922673 +-0.151409 -0.218926 0.165812 +-0.111518 -0.286925 0.148566 +-0.0458796 -0.210094 0.18627 +0.0439919 -0.147905 0.137964 +-0.0358575 -0.361749 0.0457868 +0.0284346 -0.311464 0.0537885 +0.0409609 -0.0869988 -0.085353 +0.118462 -0.0465078 -0.0483438 +-0.141108 -0.422593 -0.0846889 +-0.129145 -0.379198 -0.0712284 +-0.149426 -0.329507 -0.0473837 +-0.212723 -0.300322 -0.0706413 +-0.156151 -0.403775 -0.0651516 +-0.077704 -0.400019 -0.0437424 +-0.0783601 -0.342543 -0.0687412 +-0.0202922 -0.309739 -0.0758353 +0.0501325 -0.290557 -0.0430839 +0.0954448 -0.256567 0.0733017 +0.144565 -0.158299 0.0913557 +0.0562207 -0.179498 -0.140905 +0.16863 -0.175124 -0.176771 +0.121523 -0.241503 -0.138152 +0.196749 0.136407 0.00365942 +0.14057 0.277481 0.154966 +0.156168 -0.385879 -0.0324162 +-0.146564 -0.288069 -0.168907 +-0.212533 -0.256019 -0.170893 +0.0775241 -0.353084 -0.0221894 +-0.161054 -0.48311 -0.0516067 +-0.151386 -0.488726 -0.0297486 +-0.167299 -0.464731 -0.058517 +-0.167494 -0.44542 -0.0440266 +-0.166175 -0.416312 -0.0405929 +-0.155665 -0.409399 -0.0112037 +-0.130777 -0.428881 -0.00549876 +-0.162855 -0.460869 -0.0783452 +-0.0949104 -0.0628065 -0.118829 +-0.171364 -0.0681205 -0.104606 +-0.189411 -0.0391257 -0.0301772 +-0.201329 -0.0450332 0.0672375 +-0.0621659 -0.0595357 -0.0819357 +-0.0724451 -0.0386843 -0.0212262 +-0.0317016 -0.00827391 0.0812953 +0.125617 -0.445138 -0.086335 +0.16914 -0.45638 -0.0514974 +-0.188699 -0.102786 0.151505 +-0.127982 -0.406882 0.0143939 +-0.130706 -0.384 0.0373578 +-0.17253 -0.34721 0.0442322 +-0.136499 -0.357829 0.0655808 +-0.101729 -0.398953 0.0314689 +-0.06477 -0.393705 0.00175031 +-0.0683606 -0.382507 0.0422398 +-0.0619729 -0.361557 0.0725343 +-0.0129886 -0.329893 0.099078 +-0.0485077 -0.306718 0.14972 +-0.0586671 -0.359537 -0.0297503 +-0.105132 -0.354471 0.0834642 +-0.111953 -0.324339 0.110194 +-0.146952 -0.298663 0.122985 +-0.147935 -0.259899 0.146585 +-0.224685 -0.230598 0.12386 +-0.194785 -0.274899 0.125615 +-0.1144 -0.250007 0.185149 +-0.10665 -0.185071 0.204627 +-0.155805 -0.154327 0.174517 +-0.215755 -0.165279 0.142947 +-0.0743299 -0.277016 0.17853 +-0.0218198 -0.257755 0.16445 +0.000800113 -0.199671 0.138749 +-0.0254547 -0.133829 0.140633 +0.0635315 -0.20852 0.111271 +-0.0256804 -0.0569419 0.140514 +-0.0948894 -0.0414189 0.110395 +-0.0705488 -0.0374163 0.0415111 +-0.00760713 -0.0195458 0.0164934 +0.0499878 0.0289775 0.0673286 +0.140466 0.0718009 0.144428 +-0.00188983 0.0792593 -0.003093 +0.0559872 -0.0140882 -0.011506 +-0.227407 -0.0888195 0.0117762 +-0.273528 -0.167121 -0.0102922 +-0.0402782 -0.263586 -0.140793 +-0.137564 -0.296782 -0.109847 +-0.166109 -0.381665 -0.0120175 +-0.16983 -0.360755 0.0137933 +-0.16456 -0.354211 -0.0308766 +-0.185156 -0.334386 0.0190529 +-0.207978 -0.298552 0.0310885 +-0.252507 -0.243462 0.0511336 +-0.223388 -0.268692 -0.019703 +-0.193938 -0.322649 0.048456 +-0.175095 -0.332532 0.0736524 +-0.176111 -0.310734 0.103586 +-0.147337 -0.494175 -0.0467278 +-0.129359 -0.490613 -0.0537016 +-0.148829 -0.364106 -0.0543963 +-0.120087 -0.343197 -0.0662243 +-0.130345 -0.305692 -0.0722136 +-0.171529 -0.299424 -0.0833938 +-0.181343 -0.292949 -0.0416997 +0.207831 -0.217496 -0.0966998 +0.180453 0.174523 0.151623 +0.0997558 -0.44202 -0.0211251 +0.141829 -0.427452 -0.0246256 +0.231902 -0.0518172 0.0262484 +0.222165 -0.00765217 0.131632 +0.257605 0.0468554 0.0496674 +0.134457 -0.362329 0.00455646 +0.162364 -0.298449 0.0119315 +0.167632 -0.334853 -0.0258239 +0.166781 -0.258058 -0.0451734 +0.196618 -0.203737 -0.0367216 +0.204966 -0.148702 0.029823 +0.188775 -0.0899398 0.0842549 +0.118735 -0.0897053 0.120666 +0.108518 -0.0623755 0.19827 +0.0987744 0.0186293 0.19077 +0.164162 -0.016078 0.17849 +0.217401 -0.0732307 0.174029 +0.244384 -0.159022 0.158735 +0.0938974 -0.414078 -0.0986619 +0.0882094 -0.386204 -0.0874415 +0.110237 -0.433985 -0.106491 +0.0752909 -0.377302 -0.0545033 +0.136893 -0.424401 -0.103861 +0.101623 -0.446793 -0.0879738 +0.0803589 -0.447974 -0.0828166 +0.0955794 -0.458697 -0.0690652 +0.0852254 -0.472952 -0.043714 +0.0423481 -0.131534 -0.117698 +0.0102534 -0.163639 -0.135844 +-0.0294235 -0.16777 -0.154302 +-0.0581903 -0.19678 -0.162941 +-0.0495263 -0.23206 -0.157295 +0.0213258 -0.204668 -0.142847 +0.0591534 -0.221375 -0.128414 +0.094939 -0.204956 -0.158559 +0.102368 -0.149902 -0.152017 +0.161838 -0.127189 -0.119413 +0.0883157 -0.255475 -0.0965547 +0.00337956 -0.243572 -0.138992 +-0.00441584 -0.28038 -0.109802 +0.139454 -0.244447 -0.0884262 +0.17799 -0.253819 -0.13106 +0.239512 -0.249475 -0.139746 +0.239769 -0.199663 -0.201225 +0.139899 -0.220537 -0.184787 +0.188104 -0.214287 -0.208834 +0.241446 -0.186766 -0.139849 +0.209446 -0.161297 -0.101029 +-0.199048 -0.317265 -0.100601 +-0.293252 -0.31357 -0.122798 +-0.243299 -0.355691 -0.130502 +-0.247594 -0.319033 -0.0988683 +-0.291668 -0.287409 -0.0637038 +-0.248832 -0.272185 -0.0865389 +-0.259174 -0.220646 -0.0469428 +-0.282126 -0.263379 -0.124759 +-0.269731 -0.294935 -0.18724 +-0.247297 -0.165961 -0.0866554 +0.0601914 -0.0464014 -0.0549033 +-0.211085 -0.18579 -0.128927 +-0.200721 -0.132547 -0.108259 +-0.0634953 -0.15489 0.179525 +0.153912 -0.0887253 -0.0733484 +0.185145 -0.0471144 -0.0260532 +0.211443 0.0144377 0.0032337 +0.139575 0.0029693 0.000737671 +0.166751 0.0710484 -0.0323169 +0.107842 0.107181 0.0410238 +0.241648 0.0800111 -0.0150955 +-0.140262 -0.4992 -0.033581 +-0.123763 -0.497978 -0.0364981 +-0.108133 -0.495253 -0.0202341 +-0.1219 -0.481038 -0.0158085 +-0.110456 -0.461331 -0.014079 +-0.087635 -0.441699 -0.0445804 +-0.0916102 -0.451765 -0.0239283 +-0.0811529 -0.421697 -0.020421 +-0.0723115 -0.470105 -0.0423155 +-0.102577 -0.44033 -0.0062072 +-0.139118 -0.480546 -0.0199347 +-0.149266 -0.466768 -0.0254061 +0.222317 -0.0925366 -0.0161067 +-0.0417433 -0.361447 0.00632817 +-0.00965295 -0.347119 0.0218202 +0.0216724 -0.318231 0.010836 +-0.00474667 -0.341486 0.0613973 +0.0698488 -0.285166 0.0205835 +-0.108371 -0.29389 -0.0941984 +-0.11094 -0.279255 -0.127432 +-0.0852691 -0.31423 -0.083395 +-0.0516331 -0.309713 -0.0908278 +-0.0463843 -0.329032 -0.0615785 +-0.13427 -0.295211 -0.140976 +-0.16029 -0.312528 -0.151535 +-0.208046 -0.313472 -0.188061 +-0.177638 -0.29982 -0.178676 +-0.173332 -0.259819 -0.179118 +-0.186949 -0.225139 -0.161631 +-0.121077 -0.271737 -0.158365 +-0.222098 -0.229029 -0.143015 +-0.254895 -0.254361 -0.158387 +-0.119307 -0.241249 -0.168619 +-0.0940058 -0.224454 -0.161034 +-0.119452 -0.213541 -0.164903 +-0.133444 -0.181194 -0.153714 +-0.123212 -0.142937 -0.146434 +-0.154852 -0.114002 -0.127562 +-0.16919 -0.193253 -0.151916 +-0.202578 -0.281459 -0.18846 +-0.238459 -0.276537 -0.185897 +-0.240282 -0.308392 -0.197824 +-0.31592 -0.411023 -0.222975 +-0.28556 -0.354091 -0.210885 +-0.235315 -0.349789 -0.176342 +-0.247249 -0.413591 -0.205119 +-0.313616 -0.39085 -0.145549 +-0.265064 -0.38952 -0.162643 +-0.137308 -0.0765217 -0.126585 +-0.138269 -0.043252 -0.101811 +-0.149787 -0.024537 -0.0569204 +-0.190238 -0.325155 -0.164883 +-0.214126 -0.342005 -0.145019 +-0.11169 -0.0249744 -0.0351987 +-0.154494 -0.0206052 -0.0150451 +-0.170024 -0.0235376 0.033341 +-0.149964 -0.0212297 0.0915499 +-0.146292 -0.0570396 0.143171 +-0.204533 -0.050976 0.0222898 +-0.222839 -0.0748301 0.0497298 +-0.218112 -0.0836084 0.106186 +-0.241131 -0.10804 0.0423425 +-0.253857 -0.126023 0.000914005 +-0.268045 -0.155579 0.0359862 +-0.254096 -0.191499 0.0837602 +-0.284127 -0.206805 0.0257642 +-0.255388 -0.139415 -0.0455141 +-0.266486 -0.179542 -0.0496151 +-0.255448 -0.200689 -0.0776309 +-0.238672 -0.192995 -0.107883 +-0.225097 -0.163824 -0.109937 +-0.22995 -0.135947 -0.0896828 +-0.209528 -0.114818 -0.0862766 +-0.197715 -0.0771741 -0.074156 +-0.18152 -0.102481 -0.104911 +-0.212552 -0.0754645 -0.0336012 +-0.179069 -0.0426745 -0.0757348 +-0.191113 -0.0400122 0.118805 +0.0761558 -0.344791 -0.0536197 +0.0734921 -0.316433 -0.0291825 +0.0865869 -0.298841 -0.0691012 +0.0805876 -0.328744 0.0029047 +0.0952029 -0.361348 0.00820626 +0.11906 -0.273469 -0.0673767 +0.0841053 -0.310717 0.0264162 +0.125408 -0.292597 0.041066 +0.0878905 -0.285295 0.052224 +0.0491288 -0.272854 0.0806291 +0.143869 -0.242882 0.0528378 +0.117789 -0.207199 0.0870858 +0.169353 -0.193132 0.0552639 +0.0969256 -0.166289 0.115505 +0.054006 -0.288058 0.0505697 +0.0199581 -0.301066 0.0971587 +-0.00766116 -0.296894 0.132807 +0.0766599 -0.302889 0.00259846 +0.0459981 -0.299327 0.00649094 +0.0275534 -0.307808 -0.0222832 +0.0149271 -0.300169 -0.0594622 +0.0407712 -0.276916 -0.0798141 +0.0598138 -0.291021 -0.0166231 +0.105499 -0.310063 0.042044 +0.129965 -0.318676 0.0271739 +-0.0843085 -0.494264 -0.0321529 +-0.0752323 -0.238787 0.196776 +-0.295928 -0.43397 -0.176216 +0.0851801 -0.382062 -0.0130588 +0.0187394 -0.0952484 0.145146 +0.0700063 -0.10227 0.135872 +0.0221841 -0.0461712 0.144279 +0.0234739 0.0145751 0.123876 +-0.00955997 -0.0145334 0.135796 +-0.0455413 -0.0274983 0.116817 +-0.0630042 -0.0646849 0.123712 +-0.0996182 -0.0685448 0.139479 +-0.129134 -0.0937854 0.159793 +-0.112763 -0.133107 0.183753 +-0.0586283 -0.0384282 0.0801443 +-0.0976008 -0.0306336 0.0712047 +-0.187313 -0.236737 0.146886 +-0.186919 -0.194456 0.158247 +-0.276732 -0.200888 -0.0224537 +-0.291326 -0.23573 -0.0313163 +-0.262172 -0.26119 -0.0228289 +-0.244304 -0.258186 0.0138536 +-0.238049 -0.253808 -0.053252 +-0.278468 -0.245353 0.0237178 +-0.250374 -0.233381 -0.0762153 +-0.317786 -0.266287 -0.0397057 +-0.29694 -0.227134 0.00135872 +-0.28761 -0.282597 -0.0302299 +-0.0768305 -0.203891 0.202176 +-0.107975 -0.220055 0.202264 +-0.134773 -0.20066 0.190676 +-0.13214 -0.167949 0.192848 +-0.157713 -0.187173 0.17141 +-0.0792541 -0.17391 0.197354 +-0.103166 -0.157466 0.196315 +-0.0861693 -0.139966 0.183699 +-0.0642112 -0.126048 0.16286 +-0.0525585 -0.0978366 0.139755 +0.173523 -0.0454835 0.124705 +0.124762 -0.0100876 0.132612 +0.0801162 0.0231847 0.117816 +0.0903158 0.0691509 0.0824377 +0.111706 0.138719 0.113497 +0.109897 0.0476799 0.0291314 +0.0568194 0.0789592 0.018431 +0.166721 0.186565 0.0672199 +0.252858 0.160254 0.0700128 +0.103948 0.0891733 -0.0142249 +0.151331 0.103958 0.00831307 +0.156258 0.148984 0.0332697 +0.195526 0.176469 0.0301312 +0.246249 0.159404 0.0147221 +0.272985 0.107792 0.0403664 +0.220496 0.208803 0.0718273 +0.172006 0.242405 0.105809 +0.284857 0.213191 0.163319 +0.220004 0.262975 0.168971 +0.243752 0.187223 0.124992 +0.303317 0.156118 0.132187 +0.124557 0.160014 0.070217 +0.145476 0.178627 0.113721 +0.143822 0.145597 0.146983 +0.199699 0.112576 0.148784 +0.221259 0.0552492 0.134196 +0.124553 0.109697 0.139987 +0.100062 0.0751807 0.125633 +0.107686 0.0453443 0.15701 +0.152453 0.0251604 0.154394 +0.160741 0.1045 0.158385 +0.183054 0.0708926 0.1447 +0.188656 0.0314673 0.13741 +0.286002 0.0789154 0.0896861 +0.044874 0.0868553 -0.0397086 +0.0292084 0.0351428 -0.0773123 +-0.00652383 0.0868322 -0.0563984 +0.153395 -0.330946 0.00521793 +0.165687 0.227811 0.159326 +0.176713 -0.253714 -0.180764 +0.276141 0.126578 0.0974557 +-0.0329659 -0.0648403 -0.0508016 +-0.022748 -0.0460692 -0.0136176 +-0.0397109 -0.0394184 0.0195973 +0.00993129 -0.0278328 -0.0155697 +0.0270531 -0.00832198 0.0106523 +0.0103826 0.00500549 0.0538795 +0.0666135 0.0125544 0.0261568 +0.103369 0.00889595 0.155654 +0.11659 -0.0298082 0.170544 +0.153029 -0.0696813 0.168481 +0.113461 -0.0186162 0.216944 +0.10035 -0.0580327 0.251516 +0.150235 -0.084971 0.233939 +0.0719166 -0.0391569 0.214813 +0.10687 -0.103697 0.22877 +0.136543 -0.144876 0.235107 +0.147147 -0.0351617 0.149371 +0.1197 -0.0491892 0.122959 +0.148505 -0.0696344 0.112799 +0.152678 -0.114026 0.101195 +0.181641 -0.136376 0.0700095 +0.177794 -0.0667748 0.102185 +0.219377 -0.0856118 0.124697 +0.231869 -0.0572983 0.0801841 +0.250938 -0.00881912 0.0578761 +0.198815 -0.0628459 0.124187 +0.177363 -0.0676828 0.147605 +0.177944 -0.101552 0.169756 +0.213844 -0.114113 0.199683 +0.250347 -0.109904 0.165803 +0.259893 -0.130195 0.122038 +0.180633 -0.0723966 0.203599 +0.201886 -0.0333539 0.161782 +0.240288 -0.0485439 0.141813 +0.261312 -0.0227503 0.104643 +0.273982 -0.0593402 0.119899 +0.280362 -0.074792 0.0701015 +0.238595 0.0177583 0.0951404 +0.14643 -0.0478943 0.212489 +-0.227331 -0.265687 0.0979085 +-0.244646 -0.230401 0.0887962 +-0.293688 -0.268968 -0.164669 +-0.297979 -0.308788 -0.162348 +-0.312868 -0.346598 -0.144794 +-0.344082 -0.367401 -0.192127 +-0.317302 -0.337357 -0.184462 +-0.280828 -0.350074 -0.123607 +0.105148 0.105807 0.112878 +0.112708 0.122082 0.0774818 +0.133565 0.128779 0.0503619 +-0.153371 -0.370618 0.0324641 +0.254239 -0.0926281 0.0998171 +-0.0128437 0.0136567 0.10826 +0.0175667 0.0217155 0.0871281 +0.0477136 0.0340255 0.104217 +0.0750182 0.0489044 0.100742 +0.0776037 0.0433948 0.0700673 +0.0973389 0.0603657 0.0539823 +0.0861821 0.0686274 0.0252903 +0.0735784 0.0589072 -0.0094551 +0.0829016 0.102631 0.0164944 +0.0811061 0.0911963 0.0569078 +0.0940457 0.0476479 0.121838 +0.105428 0.0231317 0.131003 +0.0916425 -0.00738665 0.126455 +0.0604145 5.34629e-05 0.128347 +0.10359 0.0595398 0.00049955 +0.144344 0.0457444 0.00327488 +0.122523 0.0419513 -0.0300499 +0.11811 0.0162342 -0.0830375 +0.170091 0.0155571 -0.145681 +0.138389 0.0626357 -0.0743287 +0.165069 0.0235027 -0.0532363 +0.177768 0.0409007 -0.100742 +0.136707 0.0380317 -0.122381 +0.124141 0.00775387 -0.157586 +0.154959 -0.000810753 -0.105169 +0.105591 0.0562623 -0.100272 +0.0594242 0.0548004 -0.106957 +0.201162 -0.0168583 -0.120783 +0.0976411 0.0972697 0.0801317 +0.0943337 0.0848541 0.102457 +0.0890479 0.0650811 0.109825 +0.0389773 0.0745551 -0.0779593 +0.0138551 0.0593589 -0.108474 +0.0773146 0.0765993 -0.0629692 +0.118409 0.00125651 -0.11931 +0.14578 -0.0101392 -0.137264 +0.178622 -0.0192175 -0.148664 +0.15461 0.0388676 -0.0266866 +0.193622 0.0322602 -0.0272748 +0.1942 0.050466 -0.0642106 +0.173634 0.0303747 -0.00069076 +0.179101 -0.0110744 -0.00523936 +0.230507 0.0422098 -0.0173425 +0.202418 0.070871 -0.0135348 +0.22302 0.0184239 -0.0441485 +0.215157 -0.0248187 0.00288885 +0.233855 -0.00344678 0.0259658 +0.238719 0.033163 0.0205233 +0.25481 0.0672767 0.0179763 +0.222129 -0.0581209 -0.00731524 +0.227145 -0.0819987 0.0145053 +0.219253 -0.118982 0.0109807 +0.211654 -0.158762 -0.0192499 +0.210611 -0.101269 0.0490966 +0.200451 -0.190104 0.0116714 +0.203938 -0.0712158 -0.0282028 +0.173774 -0.0735362 -0.0475631 +0.2027 -0.10102 -0.0400541 +0.212795 -0.129107 -0.0298945 +0.206091 -0.151217 -0.0455168 +0.202467 -0.150775 -0.0745887 +0.209378 -0.187531 -0.0743719 +0.181149 -0.126003 -0.0892617 +0.205972 -0.177843 -0.0383337 +0.188301 -0.142819 -0.114464 +0.208779 -0.164491 -0.140437 +0.171227 -0.151151 -0.147387 +0.136617 -0.138704 -0.143839 +0.131975 -0.166643 -0.169617 +0.128263 -0.113939 -0.11894 +0.116875 -0.0858965 -0.091059 +0.0786764 -0.0829677 -0.090746 +0.187859 -0.214057 -0.0686071 +0.175679 -0.237132 -0.0957975 +0.178163 -0.10588 -0.0665832 +0.269129 0.0763722 0.0451229 +0.27889 0.058723 0.0679827 +0.267652 0.0453551 0.105512 +0.2613 0.0363273 0.0775663 +0.250278 0.0199214 0.0566543 +0.250269 0.00638094 0.0769677 +0.262967 -0.0160504 0.0796628 +0.285344 -0.0433845 0.0872574 +0.24971 -0.0386027 0.0640826 +0.229012 -0.0528564 0.0533874 +0.210073 -0.0746435 0.0657137 +0.221889 -0.0775407 0.0410909 +0.302572 -0.0710887 0.0949218 +0.236871 -0.0290995 0.0413907 +0.21774 0.0486965 -0.0445342 +0.224846 0.0339602 -0.0740774 +0.244042 0.0044793 -0.10874 +0.254336 0.102378 0.0100739 +0.220262 0.108437 -0.00385435 +0.184431 0.103867 -0.0063665 +0.227766 0.138272 0.00117268 +0.21603 0.168687 0.00560537 +0.214962 0.252952 4.36931e-05 +0.24674 0.211475 0.00674743 +0.208103 0.206716 0.00898043 +0.198252 0.239152 0.0425261 +0.241235 0.183275 -0.00372162 +0.24846 0.187657 0.0253371 +0.236173 0.217937 0.0406376 +0.208251 0.202717 0.0430183 +0.190765 0.204953 0.0676283 +0.199822 0.228771 0.0907818 +0.212055 0.262964 0.121847 +0.167888 0.20936 0.0941323 +0.230768 0.216285 0.106419 +0.226441 0.220307 0.1523 +0.160904 0.217518 0.126833 +0.151535 0.251202 0.133586 +0.158786 0.306935 0.0984538 +0.193903 0.396086 0.195106 +0.119767 0.364922 0.154966 +0.158434 0.284691 0.125614 +0.188265 0.327264 0.175224 +0.139712 0.323472 0.144742 +0.247398 0.226772 0.208026 +0.162628 0.357991 0.158091 +0.132463 0.334186 0.215838 +0.184892 0.418747 0.128073 +0.148158 0.405567 0.1589 +0.116952 0.392105 0.208798 +0.128904 0.307582 0.18276 +0.173163 0.280669 0.197839 +0.237808 0.190239 0.0542196 +0.242415 0.187695 0.0885314 +0.257589 0.159811 0.105872 +0.25799 0.149475 0.1552 +0.249199 0.167605 0.0439231 +0.270589 0.141138 0.0478035 +0.291007 0.120776 0.0668204 +0.27986 0.0943457 0.0648346 +0.262028 0.128688 0.0220064 +0.283888 0.104244 0.08796 +0.278117 0.09277 0.114653 +0.296211 0.119268 0.134225 +0.25745 0.0686993 0.129638 +0.231499 0.0874258 0.144645 +0.23624 0.121986 0.150481 +0.21822 0.158716 0.152133 +0.276736 0.0681718 0.110294 +0.286087 0.0545245 0.0921962 +0.114064 0.342002 0.184102 +0.184346 0.361594 0.187357 +0.161147 0.378013 0.229421 +0.186402 0.32651 0.232026 +0.224199 0.278314 0.231623 +0.178684 0.387524 0.165454 +0.207571 0.416517 0.162223 +0.115261 0.360345 0.210089 +0.111327 0.375408 0.183082 +0.123148 0.405595 0.17979 +0.161317 0.441861 0.200022 +0.134075 0.42215 0.208124 +0.166581 0.413272 0.221996 +0.184888 0.467555 0.155941 +0.139501 0.435526 0.173911 +0.158717 0.435906 0.144337 +0.167498 0.45215 0.103084 +0.137763 0.359978 0.22921 +0.165611 0.348074 0.227085 +0.15984 0.318857 0.217125 +0.185554 0.304169 0.211919 +0.205103 0.278784 0.204981 +0.244841 0.279219 0.196675 +0.226891 0.25345 0.209087 +0.216714 0.31142 0.225032 +0.18164 0.33693 0.20427 +0.203702 0.303717 0.18726 +0.193627 0.296232 0.146589 +0.191637 0.257284 0.18429 +0.157803 0.257523 0.177293 +0.175634 0.311565 0.125155 +0.161107 0.457828 0.173386 +0.194169 0.447882 0.185268 +0.194408 0.477711 0.118315 +0.219599 0.449898 0.13857 +0.135294 0.387364 0.228733 +0.145147 0.282789 0.187345 +0.143956 0.303159 0.203618 +0.177446 0.366384 0.212315 +0.179329 0.391491 0.217312 +0.18672 0.412483 0.210145 +0.202606 0.421792 0.189409 +0.174085 0.42914 0.210627 +0.153641 0.426813 0.21312 +0.144424 0.408706 0.223131 +0.190464 0.428693 0.201747 +0.178837 0.441581 0.19921 +0.169704 0.452082 0.187978 +0.180705 0.459908 0.173619 +0.202088 0.458198 0.166952 +0.151672 0.449754 0.186725 +0.142475 0.436806 0.198199 +0.127991 0.425256 0.188222 +0.210178 0.437176 0.172385 +0.119636 0.410278 0.199562 +0.206557 0.46857 0.145869 +0.215386 0.468035 0.123827 +0.207969 0.436894 0.106764 +0.212477 0.477963 0.10116 +0.128023 0.4054 0.215288 +0.223073 0.454408 0.0921651 +0.184017 0.321535 0.149004 +0.164058 0.339436 0.133054 +0.141763 0.356765 0.138374 +0.138767 0.331395 0.111494 +0.18387 0.5 0.0894472 +0.178253 0.341112 0.15974 +0.158692 0.397227 0.229447 +0.261987 0.258572 0.22454 +0.209557 0.191204 0.156985 +0.19703 0.220129 0.168363 +0.114158 0.395299 0.191384 +0.237163 0.239354 0.0176536 +0.22873 0.228755 -0.0079498 +0.204237 0.229854 -0.000985107 +0.191898 0.248869 0.0164149 +0.195144 0.299533 0.0501168 +0.211408 0.277777 0.0261684 +0.181525 0.269092 0.042102 +0.232338 -0.0296485 0.018274 +0.220704 0.448894 0.117889 +0.211836 0.430361 0.128709 +0.200007 0.22745 0.0221073 +0.206622 0.221816 0.0395427 +0.223655 0.239447 0.0484776 +0.206846 0.263872 0.061817 +0.192412 0.289403 0.0880222 +0.200823 -0.0669613 0.089238 +0.1998 0.487191 0.0879627 +0.178418 0.478766 0.0726805 +0.171907 0.478 0.098484 +0.179607 0.4432 0.070784 +0.215421 0.44036 0.0572748 +0.206111 0.438517 0.081171 +0.184196 0.432818 0.0953164 +0.172787 0.433405 0.115219 +0.16681 0.454422 0.128591 +0.158037 0.463512 0.080819 +0.300027 -0.106441 0.0798503 +0.301565 -0.138608 0.110073 +0.223785 -0.0676095 0.104371 +0.244386 -0.0720528 0.0937201 +0.25624 -0.0594904 0.0758547 +0.271472 -0.0437947 0.0690266 +0.283677 -0.0568988 0.0744319 +0.294284 -0.0698767 0.0795338 +0.293906 -0.0887216 0.0736412 +0.275743 -0.101071 0.0877101 +0.309738 -0.0894098 0.0874741 +0.287014 -0.123527 0.0945964 +0.311125 -0.118131 0.0991123 +0.298899 -0.117613 0.118193 +0.276193 -0.109289 0.135451 +0.270493 -0.137621 0.153632 +0.286312 -0.136798 0.132025 +0.257826 -0.0797919 0.144654 +0.303792 -0.0864306 0.104131 +0.28817 -0.0747287 0.113826 +0.276632 -0.0878111 0.128274 +0.30695 -0.103289 0.107245 +0.287682 -0.0559229 0.10414 +0.272738 -0.0407993 0.108633 +0.253435 -0.0365139 0.124117 +0.295415 -0.0573592 0.0898843 +0.270105 -0.0629299 0.0693418 +0.263375 -0.0783235 0.0820667 +-0.216962 -0.20051 0.140681 +-0.236047 -0.180496 0.115013 +-0.230292 -0.136771 0.112494 +-0.247625 -0.159292 0.0914591 +-0.209896 -0.129892 0.141237 +0.222682 0.288177 0.190351 +0.233778 0.296853 0.212089 +0.209365 0.287061 0.167624 +0.208618 0.271128 0.146657 +0.223776 0.247151 0.14266 +0.250594 0.280585 0.221005 +0.215525 0.238928 0.164607 +0.248724 0.243405 0.176599 +0.282927 0.23674 0.194658 +0.253819 0.208937 0.178714 +0.265424 0.184312 0.155732 +0.308614 0.169998 0.183237 +0.273365 0.179729 0.192265 +0.265912 0.204786 0.204674 +0.300509 0.203464 0.194384 +0.281969 0.151677 0.177526 +0.279246 0.127373 0.158699 +0.31079 0.143896 0.162421 +0.30954 0.171009 0.155179 +0.288086 0.1804 0.137744 +0.264265 0.175268 0.132545 +0.241184 0.168571 0.143536 +0.282052 0.162312 0.123541 +0.290218 0.138764 0.11928 +0.232003 0.191432 0.146429 +0.237199 0.211128 0.131059 +0.175486 0.13591 0.157401 +0.244193 0.0453066 0.121153 +0.216838 0.0295154 0.115567 +0.0778181 0.0182774 -0.0959304 +0.132697 0.385267 0.165833 +0.155812 0.38306 0.160495 +-0.00373338 0.0386319 -0.0871428 +0.0052284 0.0508015 -0.0521262 +-0.0272532 0.0521944 -0.0650671 +-0.0417118 0.0760468 -0.0274796 +0.0432101 0.0478592 -0.0430105 +0.0360437 0.064037 -0.0095129 +0.0264403 0.0878588 0.0105855 +0.0200841 0.0963175 -0.0204482 +0.0508265 0.0939603 -0.0091335 +0.0753367 0.087282 -0.0290458 +-0.0114666 0.0989277 -0.0268583 +0.189464 0.426182 0.111762 +-0.04038 -0.0265907 0.0536548 +0.188037 0.19051 0.048384 +0.170897 0.170857 0.0404072 +0.180803 0.154042 0.0195245 +0.168583 0.128396 0.0100026 +0.150344 0.161847 0.0580756 +0.146195 0.173828 0.0846654 +0.123104 0.163389 0.100752 +0.131952 0.158423 0.126057 +0.154039 0.169296 0.137953 +0.163282 0.191526 0.127822 +0.170691 0.206066 0.147249 +0.123979 0.136658 0.135 +0.136161 0.125537 0.148878 +0.153818 0.131557 0.161379 +0.111897 0.12133 0.126074 +0.111889 0.144276 0.0890707 +0.11658 0.140768 0.0690434 +0.119959 0.124948 0.0613596 +0.107779 0.107117 0.0626571 +0.122618 0.115267 0.0466942 +0.127454 0.104238 0.0219653 +0.136258 0.119892 0.0320023 +0.129073 0.0915077 -0.00265103 +0.130797 0.0780035 -0.0369633 +0.10768 0.094992 0.00979378 +0.163926 0.154671 0.152149 +0.0894836 0.0909923 0.00058556 +0.0689505 0.0963924 0.00171312 +0.0612997 0.100634 0.0224348 +0.0675451 0.0846698 0.038694 +0.0795109 0.103357 0.0384133 +0.0848094 0.0754581 0.0444653 +0.110567 0.10366 0.130086 +0.12281 0.0864143 0.139975 +0.117855 0.062854 0.143513 +0.13666 0.0472165 0.155281 +0.128164 0.0235742 0.176647 +0.163067 0.0498951 0.143567 +0.143932 0.0949004 0.145284 +0.179917 0.317727 0.0742859 +0.183725 0.275085 0.0676723 +0.16838 0.29297 0.0787056 +0.0930951 0.102542 0.05002 +0.100339 0.0681106 0.0373411 +0.102886 0.0622715 0.0197467 +0.121511 0.0540863 0.0117598 +0.124719 0.0242285 0.0166428 +0.0967861 -0.00310471 -0.0020113 +0.12138 0.0519179 -0.0102922 +0.0990646 0.0492208 -0.022422 +0.0873807 -0.0275369 -0.03209 +0.200694 -0.191636 -0.0546067 +0.206298 -0.170055 -0.0598788 +0.209964 -0.168421 -0.0791806 +0.221182 -0.183261 -0.0963771 +0.222775 -0.172837 -0.120159 +0.235715 -0.195921 -0.115182 +0.253933 -0.218526 -0.134037 +0.311213 -0.253911 -0.191866 +0.279294 -0.244732 -0.16099 +0.266185 -0.201338 -0.169529 +0.285572 -0.216415 -0.213382 +0.273765 -0.285731 -0.187819 +0.259679 -0.265381 -0.248632 +0.24894 -0.227823 -0.231771 +0.232153 -0.25966 -0.225227 +0.254118 -0.290735 -0.220386 +0.336364 -0.328047 -0.241676 +0.281317 -0.319577 -0.26697 +0.295033 -0.317038 -0.218433 +0.327766 -0.263669 -0.27537 +0.320681 -0.238904 -0.235706 +0.333487 -0.28367 -0.222752 +0.25789 -0.299076 -0.25318 +0.280382 -0.278404 -0.287734 +0.262726 -0.334272 -0.234674 +0.315714 -0.303377 -0.28762 +0.358898 -0.298323 -0.270079 +0.292961 -0.250812 -0.263064 +0.260427 0.269097 0.206442 +0.273912 0.251948 0.207483 +0.274266 0.226866 0.218876 +0.254508 0.262332 0.186312 +0.268737 0.247011 0.182676 +0.278883 0.230014 0.174886 +0.292676 0.216891 0.181537 +0.301666 0.196568 0.170643 +0.235991 0.25839 0.179999 +0.216996 0.262302 0.191107 +0.233602 0.240223 0.192553 +0.26623 0.217767 0.166603 +0.291208 0.219735 0.206357 +0.285626 0.200003 0.208179 +0.295054 0.181857 0.198439 +-0.119559 -0.0454446 0.130205 +-0.148541 -0.0288065 0.124554 +-0.122421 -0.0280036 0.104512 +-0.169628 -0.0428483 0.136658 +-0.192691 -0.0700149 0.138018 +-0.165949 -0.0805689 0.151606 +-0.157867 -0.111652 0.162619 +-0.182289 -0.134815 0.160033 +-0.171616 -0.0265274 0.119564 +-0.182821 -0.0294707 0.089096 +-0.207158 -0.0941133 0.130893 +-0.0813687 -0.408143 0.0168626 +-0.0493082 -0.255289 0.183439 +-0.0417823 -0.281988 0.16825 +-0.0232624 -0.242141 -0.150317 +0.237084 0.148575 0.150278 +0.21825 0.135883 0.152701 +0.196547 0.147262 0.152063 +0.248839 0.134889 0.149793 +0.25417 0.116897 0.146677 +0.154738 -0.248351 -0.113516 +0.149894 -0.252291 -0.14374 +0.127807 -0.247316 -0.112579 +0.100037 -0.239188 -0.118127 +0.171952 -0.258325 -0.155783 +0.206243 -0.267544 -0.164319 +0.152779 -0.244265 -0.170212 +0.238869 -0.271194 -0.164355 +0.19948 -0.240785 -0.114164 +0.228533 -0.228656 -0.117975 +0.0806348 -0.448964 -0.0364622 +0.092817 -0.46403 -0.0236687 +0.131465 -0.464547 -0.0186627 +0.111576 -0.45856 -0.0162136 +0.12236 -0.437795 -0.0167687 +0.116113 -0.473014 -0.0333379 +0.141834 -0.466374 -0.0462667 +0.15629 -0.45187 -0.0265272 +0.162053 -0.430562 -0.0436087 +0.170805 -0.433786 -0.074571 +0.150694 -0.440322 -0.089161 +0.142403 -0.453672 -0.0687084 +0.20922 0.0225383 -0.118012 +0.245897 0.00269769 -0.0710137 +-0.0868896 -0.445579 -0.0827631 +-0.0899978 -0.418668 -0.0662628 +-0.0919895 -0.382051 -0.0731611 +-0.286076 -0.18977 0.00251657 +0.166397 -0.235956 -0.0665238 +0.18289 -0.231659 -0.0402536 +0.183601 -0.256036 -0.0114407 +0.19304 -0.222737 -0.0114233 +0.168396 -0.264129 0.0198747 +0.175145 -0.292863 -0.0261367 +0.159612 -0.311932 -0.0502102 +0.151795 -0.349231 -0.058414 +0.168467 0.120276 0.165442 +0.179322 0.109989 0.151163 +0.191745 0.091503 0.1476 +0.207409 0.0731218 0.143583 +0.170472 0.088013 0.148441 +0.198308 0.0526608 0.137187 +-0.288444 -0.322548 -0.196751 +-0.258254 -0.336596 -0.201797 +-0.260706 -0.370334 -0.191889 +-0.262012 -0.38355 -0.234182 +0.169409 0.331718 0.106522 +-0.0883279 -0.427369 -0.00320489 +-0.0757242 -0.410706 -0.00350047 +-0.0694098 -0.396348 -0.0215868 +-0.339105 -0.28249 -0.133907 +0.14338 -0.190029 -0.185968 +0.113197 -0.189729 -0.178573 +0.161752 -0.208101 -0.1989 +0.163143 -0.233988 -0.192556 +0.187542 -0.24244 -0.20457 +0.214342 -0.231174 -0.221761 +0.200695 -0.263551 -0.191549 +0.0888974 -0.174918 -0.165344 +0.0728578 -0.155488 -0.148655 +0.0857975 -0.13271 -0.133069 +0.0496654 -0.153477 -0.133288 +0.208417 -0.252602 -0.211864 +0.214499 -0.20684 -0.209109 +0.212326 -0.182246 -0.176825 +0.196622 -0.193456 -0.194925 +-0.0366034 0.0848157 -0.0747335 +-0.0106036 0.0767347 -0.0825468 +-0.248014 -0.143811 -0.0711582 +0.156176 -0.353723 -0.00967102 +0.161881 -0.35946 -0.0354879 +0.154192 -0.374021 -0.054565 +0.153835 -0.401954 -0.0551512 +0.147106 -0.376782 -0.0111704 +0.141013 -0.401853 -0.0175381 +0.127378 -0.38782 -0.00428773 +0.152558 -0.410563 -0.0345712 +0.144573 -0.387551 -0.0699167 +0.129797 -0.395951 -0.0860393 +0.110844 -0.383365 -0.0877166 +0.111358 -0.362136 -0.0828181 +0.10863 -0.332992 -0.0757964 +0.131091 -0.348484 -0.0736181 +0.114528 -0.372564 0.00601769 +0.116893 -0.350867 0.0177725 +0.143657 -0.369483 -0.0686154 +0.0433039 -0.239647 0.0998892 +-0.318832 -0.357055 -0.211401 +-0.299837 -0.377374 -0.238049 +-0.340344 -0.383626 -0.224893 +-0.356366 -0.419986 -0.188103 +-0.285529 -0.404192 -0.228972 +-0.356375 -0.393121 -0.201407 +-0.349321 -0.392013 -0.165399 +-0.328811 -0.42272 -0.163607 +-0.345548 -0.417553 -0.216974 +-0.322795 -0.427865 -0.195551 +-0.33518 -0.363207 -0.161311 +-0.0812327 -0.396788 0.0342935 +-0.065289 -0.38943 0.0224745 +-0.0508718 -0.371639 0.0298172 +-0.260668 -0.216401 0.0653687 +-0.2704 -0.185201 0.0538295 +0.187032 0.486356 0.0996338 +0.279593 -0.136382 0.110973 +0.26837 -0.117918 0.105466 +0.248285 -0.109463 0.116456 +0.232397 -0.125931 0.141691 +0.210603 -0.141776 0.171116 +0.137574 -0.108705 0.207737 +0.169921 0.29167 0.0522744 +0.00992085 -0.113945 -0.0964453 +0.258261 -0.257702 -0.154872 +0.275321 -0.267702 -0.17038 +0.295633 -0.272896 -0.184932 +0.295815 -0.294739 -0.20199 +0.314713 -0.27743 -0.201437 +0.327332 -0.256197 -0.214678 +0.340385 -0.261017 -0.241446 +0.313356 -0.232789 -0.209684 +0.296344 -0.226073 -0.182212 +0.31592 -0.301772 -0.216769 +0.318635 -0.326842 -0.222796 +0.307178 -0.325937 -0.251416 +0.274745 -0.303144 -0.21295 +0.263287 -0.308346 -0.232527 +0.255382 -0.319889 -0.248754 +0.332002 -0.310475 -0.229091 +0.353636 -0.307458 -0.245121 +0.335859 -0.313851 -0.265914 +0.340499 -0.300896 -0.286697 +0.344989 -0.280039 -0.276203 +0.327449 -0.28026 -0.295194 +0.304942 -0.268737 -0.28762 +0.34983 -0.283684 -0.251927 +0.343136 -0.265469 -0.261534 +0.326713 -0.248963 -0.256716 +0.307917 -0.24034 -0.252462 +0.279159 -0.231625 -0.241522 +0.300353 -0.229376 -0.234338 +0.311358 -0.251222 -0.26759 +0.299024 -0.289572 -0.301481 +0.279907 -0.305571 -0.290358 +0.263002 -0.29286 -0.276914 +0.260616 -0.313748 -0.268771 +0.275922 -0.322371 -0.224156 +0.284975 -0.33259 -0.244221 +0.303023 -0.336946 -0.233483 +0.289605 -0.333838 -0.221905 +0.166435 0.39886 0.154509 +0.189152 0.404825 0.153461 +0.197133 0.400723 0.1737 +0.17424 0.413608 0.143911 +0.169142 0.426834 0.132439 +0.188725 0.386035 0.180698 +0.186219 0.378081 0.198788 +-0.267025 -0.372115 -0.138391 +-0.248022 -0.367522 -0.158602 +0.174505 0.292586 0.0990952 +0.186251 0.309263 0.0928235 +0.181697 0.30513 0.109614 +0.189499 0.279776 0.119317 +0.172647 0.294457 0.120787 +0.158057 0.303956 0.130265 +0.143476 0.291331 0.139139 +0.131312 0.30031 0.159002 +0.186095 0.298863 0.131041 +0.198975 0.28677 0.132576 +0.172236 0.277192 0.117866 +0.184313 0.260452 0.109718 +0.15755 0.265746 0.122578 +0.145983 0.269471 0.137935 +0.151234 0.256355 0.155644 +0.124293 0.323596 0.164277 +0.126678 0.342635 0.150186 +0.129524 0.341544 0.128525 +0.146576 0.349856 0.118779 +0.192269 0.30374 0.0759625 +0.202728 0.285813 0.0690781 +0.210479 0.281567 0.0483558 +0.222196 0.26209 0.0407369 +0.224073 0.261141 0.0186008 +0.162756 0.306191 0.114529 +0.149682 0.318744 0.121136 +0.152677 0.341974 0.100993 +0.164071 0.331208 0.0841361 +0.146523 0.323278 0.093798 +0.15695 0.312461 0.0714443 +0.22266 -0.203518 -0.100877 +0.262076 -0.292278 -0.202356 +0.249754 -0.28212 -0.183581 +0.242451 -0.284733 -0.203885 +0.229725 -0.273053 -0.211906 +0.243386 -0.275428 -0.225419 +0.255999 -0.283472 -0.239546 +-0.261873 -0.405224 -0.222848 +-0.280772 -0.420055 -0.201182 +-0.274389 -0.414773 -0.173401 +-0.298626 -0.411672 -0.158377 +-0.28738 -0.389898 -0.148508 +-0.300008 -0.369107 -0.135836 +-0.257381 -0.39915 -0.185758 +-0.257531 -0.421709 -0.186727 +-0.319983 -0.369357 -0.146016 +-0.25404 -0.39271 -0.206532 +-0.269186 -0.375948 -0.213104 +0.171129 0.312683 0.0555484 +0.186538 0.309469 0.0612947 +0.17697 0.322584 0.0897939 +0.180094 0.317456 0.102692 +0.0389455 -0.294719 0.0707663 +0.19085 0.129482 0.148059 +0.26893 -0.330546 -0.250405 +0.261495 -0.324416 -0.260179 +0.163955 0.0845671 -0.00775852 +0.172992 0.467003 0.114773 +0.17962 0.47069 0.135115 +0.167392 0.460661 0.148013 +0.0927702 -0.0102964 0.178794 +0.0791092 -0.00358862 0.211868 +0.0484002 -0.0727004 0.143042 +0.0857054 -0.0664246 0.132462 +0.170606 0.462905 0.162683 +0.107346 -0.291576 0.0507084 +0.123054 -0.26548 0.0555752 +0.1033 -0.273351 0.0618915 +-0.217347 -0.0684085 0.0793768 +-0.232534 -0.1003 0.0785864 +0.160705 0.203815 0.112095 +0.157448 0.189802 0.0951937 +0.163855 0.222961 0.107992 +0.178039 0.226994 0.0939715 +0.157779 0.236558 0.121407 +0.156862 0.233096 0.141593 +0.254115 0.147478 0.0328869 +0.246739 0.139758 0.0163119 +-0.313249 -0.26088 -0.138114 +-0.319034 -0.272336 -0.0954566 +-0.312031 -0.286413 -0.151154 +-0.318615 -0.301412 -0.127758 +-0.31358 -0.30952 -0.0911544 +-0.342054 -0.297563 -0.104135 +-0.285707 -0.289103 -0.098473 +-0.332554 -0.290038 -0.0650158 +0.224391 0.444149 0.0748945 +0.224127 0.466497 0.0733316 +0.00933378 -0.0890982 -0.073455 +-0.196836 -0.0544369 -0.0547609 +-0.268852 -0.35939 -0.204575 +-0.134821 -0.144762 0.184037 +-0.134018 -0.119846 0.172991 +-0.108849 -0.110436 0.169417 +-0.142893 -0.258813 -0.176858 +0.163435 0.422628 0.144619 +0.149105 0.425301 0.157986 +0.151653 0.445126 0.160854 +0.205634 0.453218 0.0682861 +0.196116 0.437078 0.0613117 +0.305429 0.136514 0.131635 +0.304223 0.128705 0.150462 +0.294739 0.1352 0.16485 +0.29983 0.148475 0.176204 +0.293633 0.16134 0.186506 +0.312816 0.146868 0.144611 +0.290574 0.119539 0.149687 +0.280449 0.10933 0.137413 +0.285959 0.112117 0.117297 +0.154398 0.116961 0.162863 +0.147042 0.108372 0.152274 +0.179394 0.214392 0.162515 +0.185651 0.194518 0.157404 +0.180628 0.232354 0.173507 +0.198969 0.238329 0.174545 +0.207694 0.253512 0.177641 +0.203869 0.264161 0.186147 +0.189501 0.273156 0.193533 +0.17312 0.263127 0.188581 +-0.206119 -0.0619918 0.116346 +-0.201545 -0.0465532 0.095691 +0.256266 0.152102 0.0503785 +0.264034 0.143148 0.0672501 +0.26342 0.152022 0.0867622 +0.269601 0.144159 0.103885 +0.281713 0.137095 0.0629023 +0.296165 0.127981 0.0376256 +0.300117 0.13462 0.0559043 +0.287642 0.140563 0.0456708 +0.278661 0.132147 0.0309413 +0.271646 0.118273 0.028754 +0.262921 0.1025 0.0261376 +0.261118 0.0855637 0.0169037 +0.25422 0.0767023 0.000233527 +0.237362 0.0575218 0.00198963 +0.283388 0.119704 0.0383643 +0.282941 0.112062 0.0540402 +0.249937 0.0937398 -0.00575339 +0.231931 0.0954578 -0.0107377 +0.210437 0.0914748 -0.0140972 +0.239252 0.109782 0.000233887 +0.191402 0.0870306 -0.0134669 +0.184376 0.0704441 -0.0225342 +0.184719 0.0606504 -0.044543 +0.166145 0.0578967 -0.0668264 +0.200251 0.061117 -0.0313226 +0.217304 0.057967 -0.0199728 +0.227686 0.12158 0.00370932 +0.20937 0.123042 0.000300618 +0.244333 0.124524 0.00810813 +0.295429 0.120597 0.0522453 +0.178132 0.0791963 -0.0112798 +0.177197 -0.279627 -0.000252101 +0.173639 -0.299787 -0.00606886 +0.172196 -0.313975 -0.0223573 +0.166117 -0.326159 -0.00858114 +0.168079 -0.321719 -0.0379096 +0.162521 -0.339731 -0.0445028 +0.151373 -0.32895 -0.0576036 +0.312369 -0.105021 0.0899766 +0.306 -0.11652 0.0866674 +0.301418 -0.129182 0.0942967 +0.290875 -0.135236 0.101483 +0.289966 -0.143698 0.1109 +0.295915 -0.13953 0.122573 +0.279108 -0.148197 0.122497 +0.27841 -0.152315 0.142258 +0.265867 -0.157983 0.158785 +0.256687 -0.14661 0.137703 +0.25422 -0.140442 0.172759 +0.232237 -0.161116 0.192798 +0.192807 -0.160413 0.202508 +0.178601 -0.140578 0.237092 +0.154384 -0.117167 0.24831 +0.17845 -0.105479 0.223698 +0.247464 -0.158843 0.179106 +0.226891 -0.158442 0.171794 +0.209982 -0.159856 0.187271 +0.217821 -0.141328 0.207646 +0.23745 -0.141109 0.186416 +0.229503 -0.142546 0.156329 +0.214657 -0.125289 0.155947 +0.193847 -0.12199 0.171057 +0.217246 -0.105649 0.140104 +0.198069 -0.0856194 0.142621 +0.193693 -0.14343 0.18682 +0.198045 -0.145975 0.222277 +0.178989 -0.164931 0.225321 +0.158831 -0.146831 0.218292 +-0.290841 -0.208347 -0.00770324 +-0.29533 -0.224009 -0.017137 +-0.30561 -0.24462 -0.0155011 +-0.278365 -0.220452 -0.0277869 +-0.267819 -0.241114 -0.0357093 +-0.286737 -0.259306 -0.0462551 +-0.310093 -0.264404 -0.0203987 +-0.307167 -0.250649 -0.0341839 +-0.307612 -0.281242 -0.0310235 +-0.321036 -0.286281 -0.0471544 +-0.310491 -0.270102 -0.0639157 +-0.311345 -0.301149 -0.0633156 +-0.297683 -0.291436 -0.0450671 +-0.294949 -0.304108 -0.0790095 +-0.285459 -0.27779 -0.0488974 +-0.296472 -0.275126 -0.0168658 +-0.276222 -0.270671 -0.00788631 +-0.246454 -0.248267 -0.0329014 +-0.244456 -0.252303 -0.00937036 +-0.304286 -0.259682 -0.0492577 +-0.294933 -0.27203 -0.0604957 +-0.300998 -0.278796 -0.0743602 +-0.316674 -0.274623 -0.0789273 +-0.337714 -0.280945 -0.0853892 +-0.325825 -0.275251 -0.0655092 +-0.332977 -0.302425 -0.0833069 +-0.293564 -0.290291 -0.0772666 +-0.298024 -0.281309 -0.0905074 +-0.293634 -0.272694 -0.109468 +-0.270428 -0.274072 -0.107657 +-0.256077 -0.253991 -0.120812 +-0.261078 -0.296954 -0.0999473 +-0.2381 -0.297373 -0.0849839 +-0.232752 -0.278906 -0.0645746 +-0.272041 -0.319246 -0.10842 +-0.21032 -0.284441 -0.0448701 +-0.256436 -0.341131 -0.11181 +-0.225098 -0.336223 -0.113241 +-0.200175 -0.288996 -0.0158483 +-0.223009 -0.317757 -0.0905879 +-0.301096 -0.262202 -0.123506 +-0.32405 -0.263071 -0.116908 +-0.292477 -0.257052 -0.14263 +-0.270149 -0.255918 -0.142108 +-0.275486 -0.258003 -0.162669 +-0.259523 -0.2674 -0.178244 +-0.251069 -0.250018 -0.0970302 +-0.24056 -0.260706 -0.172311 +-0.232499 -0.247239 -0.154361 +-0.34182 -0.274562 -0.107339 +-0.294559 -0.307923 -0.0994756 +-0.275844 -0.269552 -0.0355918 +-0.227344 -0.270897 -0.045083 +0.25093 0.170443 0.120028 +0.248384 0.184009 0.106523 +0.235777 0.198062 0.103222 +0.23641 0.211305 0.086191 +0.221152 0.226047 0.0898201 +0.223243 0.24123 0.111495 +0.203883 0.250541 0.105061 +0.226958 0.225862 0.123117 +0.219737 0.240254 0.12789 +0.214138 0.253162 0.132941 +0.232275 0.224561 0.138088 +0.109391 -0.247931 -0.0995264 +0.104952 -0.262437 -0.0820427 +0.080763 -0.274056 -0.0783487 +0.0604155 -0.262392 -0.0950373 +-0.227936 -0.329497 -0.190147 +-0.214125 -0.337031 -0.170051 +0.263325 -0.0528405 0.0685009 +0.251926 -0.0484757 0.0715634 +0.237277 -0.0480579 0.0658708 +0.244491 -0.055646 0.0790843 +0.239659 -0.0616442 0.0888399 +0.226162 -0.0616059 0.0920824 +0.21522 -0.0631162 0.0781895 +0.212545 -0.0629682 0.0966232 +0.196781 -0.0599901 0.105959 +0.210127 -0.0657511 0.11188 +0.250495 -0.0660959 0.0846797 +0.234672 -0.0671026 0.0978575 +0.237261 -0.0846396 0.108485 +0.25989 -0.0423809 0.0666642 +0.259987 -0.0257531 0.0664908 +0.247883 -0.0247631 0.0554477 +0.242689 -0.0135836 0.0440572 +0.246291 0.00496067 0.0457059 +0.245187 0.0234669 0.0372413 +0.250061 0.17416 0.133813 +0.259114 0.167602 0.148828 +0.26511 0.166925 0.171546 +0.238618 0.181672 0.138204 +0.229669 0.176644 0.149535 +0.262049 0.187134 0.176237 +0.261795 0.200868 0.165371 +0.276513 0.199318 0.153854 +0.292677 0.199982 0.157209 +0.302715 0.186361 0.157188 +0.308755 0.181779 0.171774 +0.305926 0.190608 0.185482 +0.312423 0.167782 0.169221 +0.31381 0.157653 0.158921 +0.310783 0.154703 0.171639 +0.301108 0.177938 0.144841 +0.293264 0.189309 0.147256 +0.279322 0.188458 0.145304 +0.262483 0.193127 0.192418 +0.274289 0.192768 0.20161 +0.254841 0.206509 0.193978 +0.245154 0.222549 0.189318 +0.253012 0.22552 0.174345 +0.265429 0.23121 0.17081 +-0.253206 -0.236908 -0.0443888 +0.149428 0.386275 0.232451 +0.147867 0.371017 0.232576 +0.152926 0.356705 0.229375 +0.149032 0.338169 0.225131 +0.166114 0.363727 0.223417 +0.172256 0.353426 0.215568 +0.179541 0.338962 0.221969 +0.181625 0.354174 0.201921 +0.186426 0.343494 0.187951 +0.192075 0.328517 0.215563 +0.192453 0.320313 0.195502 +0.17815 0.351274 0.174302 +0.17655 0.370022 0.172318 +0.165276 0.33179 0.225541 +0.00939661 -0.323412 0.0804555 +0.120353 -0.125008 0.233582 +0.05563 -0.0732275 0.247968 +0.0616189 -0.0543441 0.232231 +0.0811821 -0.0784737 0.231059 +0.0764784 -0.0353683 0.254905 +0.0608765 -0.028919 0.235586 +0.087271 -0.018263 0.234864 +0.113798 -0.076403 0.258582 +0.127442 -0.0600385 0.234949 +0.132794 -0.0953943 0.252522 +0.0606107 -0.0431898 0.263976 +0.0971312 -0.036293 0.245012 +0.110687 -0.0488392 0.23675 +0.126176 -0.0414728 0.221378 +0.136057 -0.0243951 0.201716 +0.122078 0.00127519 0.196707 +0.142291 0.00027007 0.178375 +0.0664164 -0.0191578 0.217877 +0.0802696 -0.0234954 0.199319 +0.0910082 -0.0454502 0.20083 +0.102454 0.00166634 0.210465 +0.0802091 -0.00534582 0.192641 +0.0863635 0.00814252 0.179895 +0.0946306 0.0282399 0.168655 +0.0981336 0.029523 0.148764 +0.101777 0.0395859 0.135111 +0.102082 0.0581642 0.134881 +0.0956437 0.0321468 0.122829 +0.0938658 0.0161985 0.122282 +0.107901 0.00369122 0.128399 +0.078491 0.00576055 0.124425 +0.0841199 0.0382034 0.11313 +0.0659972 0.0331947 0.109714 +0.0520056 0.0196069 0.12098 +0.108345 -0.0142416 0.126349 +0.0915975 -0.0313276 0.129913 +0.122833 -0.0287943 0.124051 +0.146418 -0.0426624 0.119895 +0.142658 -0.0228961 0.131632 +0.132595 -0.0194368 0.150249 +0.160419 -0.0327892 0.133975 +0.163125 -0.050543 0.147173 +0.060233 0.0422739 0.0970401 +0.0469107 0.0353785 0.0851224 +0.0330985 0.0252247 0.0760721 +0.0344131 0.0145341 0.0525338 +0.0185411 0.0141735 0.0691085 +-0.00651953 0.00766464 0.081092 +0.0314926 0.0314677 0.0951056 +0.0155266 0.0258059 0.107793 +0.11957 0.0050674 0.144577 +0.11348 -0.010764 0.15919 +0.0864989 0.00930931 0.196192 +0.112679 0.0343949 0.172228 +0.110056 0.0172326 0.144505 +-0.231861 -0.256194 -0.0373807 +-0.233847 -0.249852 -0.0220477 +-0.230235 -0.258784 -0.00973726 +-0.217151 -0.280061 0.00814621 +-0.228026 -0.273051 0.0389012 +-0.222798 -0.271648 -0.00409819 +-0.229682 -0.268052 0.0118625 +-0.212876 -0.279385 -0.0140325 +-0.214439 -0.277583 -0.0303969 +-0.199886 -0.285356 -0.0320197 +-0.187179 -0.295224 -0.0255156 +-0.167219 -0.315028 -0.0304058 +-0.156845 -0.302235 -0.0544314 +-0.236758 -0.254924 0.00227314 +0.0884351 -0.404348 -0.0195924 +0.0722252 -0.268984 0.0670772 +0.070147 -0.245252 0.0862941 +0.0966471 -0.229612 0.0882203 +0.0926053 -0.203806 0.103764 +0.0777673 -0.186021 0.118999 +0.0417862 -0.182948 0.126604 +0.0709209 -0.158179 0.128709 +0.095465 -0.128791 0.124296 +0.0102764 -0.16375 0.133447 +-0.0233099 -0.171526 0.153541 +-0.0499934 -0.0465621 -0.00582837 +-0.0749973 -0.0355191 0.0101971 +-0.0645299 -0.324704 -0.077104 +0.221779 0.470802 0.0892895 +0.219761 0.464582 0.1032 +0.246597 0.0246927 0.0795416 +0.253586 0.0320272 0.0977802 +0.252394 0.0305168 0.0670227 +0.261064 0.0424817 0.0637394 +0.267205 0.0556508 0.058182 +0.262106 0.0615289 0.0436471 +0.250683 0.0500973 0.0298185 +0.272972 0.0454164 0.0731281 +0.274554 0.0385023 0.090004 +0.285852 0.0505507 0.0780368 +0.287544 0.066644 0.0791877 +0.280213 0.0764884 0.0661465 +0.226162 0.0537579 -0.00800313 +0.231726 0.0372941 0.00212281 +0.226833 0.070796 -0.0125112 +-0.0228881 0.0822405 -0.0141151 +-0.0164496 0.062439 -0.0353807 +-0.0311204 0.09353 -0.0291259 +-0.0468617 0.0890411 -0.0503417 +-0.0192694 0.0958145 -0.0445491 +-0.0451838 0.0631149 -0.0497516 +-0.0349277 0.0970377 -0.0439657 +-0.0281121 0.0908295 -0.0597278 +-0.0422149 0.0875756 -0.0360098 +-0.0493018 0.0748281 -0.0407497 +-0.0508974 0.0756362 -0.0555946 +-0.045787 0.0616401 -0.0714534 +-0.0463878 0.0860458 -0.0643425 +-0.0469 0.0754389 -0.0734442 +-0.0361876 0.0721397 -0.0877453 +-0.0344753 0.0506229 -0.0835042 +-0.0209274 0.0429352 -0.0951495 +-0.00835098 0.0548898 -0.109767 +-0.0439408 0.0675081 -0.0809412 +-0.0384794 0.0604865 -0.0888934 +-0.0325578 0.0529818 -0.0938199 +-0.0250287 0.0507859 -0.100857 +-0.0171358 0.0586173 -0.103485 +-0.00108771 0.0669554 -0.09638 +0.0141047 0.0764389 -0.0789872 +-0.0166767 0.0687863 -0.0931008 +-0.0154196 0.0443974 -0.106822 +0.00804033 0.0334573 -0.118139 +-0.00353356 0.0420783 -0.115203 +0.00267945 0.0333406 -0.10199 +0.0284162 0.0260832 -0.102463 +0.0140719 0.0342408 -0.0876383 +0.01206 0.042083 -0.0690778 +0.0262722 0.0834922 -0.057317 +0.052314 0.0257381 -0.0888721 +0.0550064 0.0153199 -0.121681 +0.0742668 0.0307726 -0.0684202 +0.0254542 0.0462258 -0.0537161 +0.0192751 0.0579365 -0.0299961 +0.043388 0.0389601 -0.0621497 +0.0632571 0.0407552 -0.0511604 +0.0628168 0.0511918 -0.0295138 +-0.00769957 0.0468719 -0.0674097 +0.0356439 0.036944 -0.129564 +0.00985644 0.0486694 -0.11871 +0.0293481 0.0500299 -0.116265 +0.034304 0.0639803 -0.0982281 +0.0203799 0.0394103 -0.126099 +0.0274107 0.0238815 -0.120304 +-0.00989932 0.038173 -0.0977698 +0.0409915 0.0204434 -0.130582 +0.0603476 0.0361414 -0.135064 +0.0745924 0.0111822 -0.144256 +0.0995383 0.0164619 -0.152082 +0.079494 0.0098491 -0.119596 +0.109969 -0.00178903 -0.14121 +0.128369 -0.00667529 -0.145234 +0.147176 -0.000628591 -0.159936 +0.143478 0.0207956 -0.143584 +0.15945 -0.0140125 -0.151421 +0.167046 -0.013357 -0.130058 +0.175024 -0.000463673 -0.161193 +0.200548 0.00730904 -0.144289 +0.228188 0.00606999 -0.13371 +0.232374 -0.0225206 -0.12062 +0.217352 -0.0205681 -0.149989 +0.196446 -0.0094088 -0.159916 +0.0468892 0.0318746 -0.136603 +0.0588847 0.0194871 -0.141629 +0.0497176 0.0425705 -0.12546 +0.067316 0.0466181 -0.121528 +0.0829023 0.0554408 -0.10632 +0.0702884 0.0671402 -0.0864572 +0.0736048 0.0280122 -0.141966 +-0.0393368 0.0927115 -0.058201 +-0.074253 -0.462729 -0.0674302 +-0.0882268 -0.46748 -0.0836924 +-0.10265 -0.454789 -0.102517 +-0.100302 -0.434985 -0.0953132 +-0.123508 -0.439573 -0.0964816 +0.30376 -0.329009 -0.220778 +-0.34576 -0.287787 -0.1184 +-0.333412 -0.299886 -0.118936 +-0.318278 -0.306436 -0.109371 +-0.342798 -0.273541 -0.122349 +-0.330946 -0.265681 -0.13448 +-0.32759 -0.278136 -0.147142 +-0.313986 -0.269795 -0.152301 +-0.304937 -0.277784 -0.160852 +-0.289134 -0.290053 -0.171285 +-0.300398 -0.29313 -0.159904 +-0.305136 -0.304081 -0.143109 +-0.303823 -0.326091 -0.148763 +-0.297334 -0.338307 -0.131821 +-0.0297344 -0.320795 0.126249 +-0.0440833 -0.337561 0.102751 +-0.0635963 -0.3222 0.124646 +-0.0820192 -0.303394 0.145977 +-0.0280108 -0.346215 0.0792887 +0.190023 -0.166658 -0.160984 +0.187606 0.489479 0.0788413 +0.169798 0.492699 0.0805537 +0.160239 0.479513 0.0724411 +0.160997 0.477019 0.0876359 +0.167909 0.48647 0.0907839 +0.168839 0.465921 0.0685027 +0.185848 0.461592 0.0756332 +0.163713 0.449815 0.0719867 +0.171034 0.442192 0.0868531 +0.172622 0.439121 0.100638 +0.176648 -0.0540189 0.138439 +0.191763 0.435033 0.0761478 +0.150024 0.450095 0.173316 +0.142684 0.444609 0.180888 +0.134925 0.435737 0.185852 +0.0901553 -0.0455623 0.257862 +0.218445 0.190081 -0.00453558 +0.212983 0.187132 0.0158667 +0.234912 0.203072 -0.0090602 +0.217724 0.208098 -0.00630956 +0.209095 0.231498 0.0538229 +0.223398 0.222537 0.0510417 +0.229495 0.205818 0.051858 +0.241614 0.200114 0.0387668 +0.245196 0.212463 0.0252865 +0.232616 0.199508 0.066443 +0.245867 0.187445 0.0704899 +0.218046 0.211438 0.0580939 +0.206013 0.207163 0.0667587 +0.208167 0.217137 0.0808695 +0.189985 0.216171 0.0819923 +-0.328288 -0.282754 -0.0562593 +-0.321215 -0.270892 -0.0527491 +-0.321885 -0.294532 -0.0580289 +-0.324301 -0.301836 -0.070993 +-0.309665 -0.294095 -0.0515043 +-0.298437 -0.298535 -0.0585809 +-0.293755 -0.297175 -0.0685565 +-0.301865 -0.303693 -0.0670723 +-0.312242 -0.307406 -0.0760424 +0.113855 0.0103494 0.135894 +0.117356 -0.000872108 0.134011 +0.24192 0.231796 0.179613 +0.236568 0.24336 0.180529 +0.226028 0.250706 0.186633 +0.280884 -0.220307 -0.163899 +0.26654 -0.211351 -0.150233 +0.265056 -0.233891 -0.14678 +0.318482 -0.331697 -0.239506 +0.324395 -0.322699 -0.253479 +0.31194 -0.314679 -0.269415 +0.329739 -0.334727 -0.229668 +0.336703 -0.323152 -0.229076 +0.344428 -0.313085 -0.23571 +0.342498 -0.293727 -0.236916 +0.350543 -0.322922 -0.2465 +0.353252 -0.314 -0.261759 +0.347047 -0.326986 -0.235121 +0.0827363 -0.465408 -0.0592863 +0.0757733 -0.45735 -0.0483001 +0.0758332 -0.442944 -0.0486429 +0.0763754 -0.427162 -0.064874 +0.0810297 -0.429275 -0.0354104 +0.0760881 -0.402196 -0.0628009 +0.0803331 -0.462498 -0.0366385 +0.075746 -0.427719 -0.0496393 +0.213629 0.454927 0.154222 +0.216172 0.433851 0.152191 +0.213875 -0.163106 0.208849 +0.228479 0.0837143 -0.0171959 +0.214862 0.0777937 -0.0178642 +0.203914 0.0820668 -0.0169156 +0.213551 0.066976 -0.0133462 +-0.291696 -0.291685 -0.053913 +-0.288445 -0.286967 -0.0453936 +-0.283457 -0.280518 -0.0392925 +0.198493 0.267303 0.113918 +-0.00816198 -0.315253 0.11742 +0.312224 -0.337685 -0.224702 +0.0776115 -0.0114015 0.225043 +0.094616 -0.00802053 0.222738 +0.212523 -0.00317223 -0.153514 +0.228944 -0.0069181 -0.146501 +0.230166 -0.0223035 -0.138067 +0.212902 -0.0238532 -0.132712 +0.194522 -0.0219296 -0.138137 +0.240306 -0.00819778 -0.130311 +0.24497 -0.0122967 -0.113875 +0.221562 -0.0094445 -0.0973672 +0.242491 -0.00970392 -0.0927411 +-0.195428 -0.293105 -0.0588105 +-0.174639 -0.293714 -0.0615636 +-0.159198 -0.295096 -0.0708856 +-0.150745 -0.297027 -0.0916319 +-0.165094 -0.309633 -0.116063 +-0.129532 -0.293794 -0.0901166 +-0.12154 -0.29002 -0.105668 +-0.103655 -0.284754 -0.110478 +-0.083304 -0.273535 -0.126518 +-0.126229 -0.291149 -0.124142 +-0.0551206 -0.282297 -0.123125 +-0.0279253 -0.280704 -0.123568 +-0.0254074 -0.296918 -0.100527 +-0.143636 -0.296672 -0.0765836 +0.228772 0.249576 0.00807469 +0.246793 0.197559 -0.000456927 +0.249351 0.185655 0.00965958 +0.077471 -0.38535 -0.0716786 +0.0780138 -0.366405 -0.0698751 +0.0796117 -0.349597 -0.0694382 +0.0817673 -0.324046 -0.067713 +0.0920794 -0.339278 -0.0766687 +0.0745961 -0.308674 -0.0513846 +0.0686559 -0.285979 -0.0584538 +0.0701691 -0.296007 -0.0346939 +0.0958416 -0.324563 -0.0739969 +0.111686 -0.315208 -0.0712996 +0.118212 -0.295045 -0.0671537 +0.145789 -0.285221 -0.0572786 +0.142444 -0.258951 -0.0651148 +0.125807 -0.256448 -0.0777825 +0.0725557 -0.302564 -0.0188272 +0.0757738 -0.318738 -0.0113816 +0.0755625 -0.334153 -0.022547 +0.0716925 -0.292684 -0.00740334 +0.0574002 -0.292216 -0.00131701 +0.0442788 -0.29974 -0.0118635 +0.0322898 -0.309073 -0.00126775 +0.0158934 -0.319374 -0.00927168 +0.00270388 -0.318254 -0.036966 +0.00321031 -0.33353 0.006095 +0.0101246 -0.330737 0.0331595 +0.0571801 -0.291727 0.0142738 +0.0411549 -0.302632 0.0323113 +0.0568056 -0.290026 0.0325413 +0.0726196 -0.279494 0.0399911 +0.0843075 -0.293947 0.0355701 +0.0802412 -0.296732 0.0208207 +0.0757523 -0.290551 0.00911073 +0.0904109 -0.307387 0.0401159 +0.0937218 -0.321431 0.0333001 +0.0876185 -0.332554 0.0196986 +-0.261918 -0.356193 -0.123562 +-0.274572 -0.363058 -0.128675 +-0.283885 -0.374671 -0.137095 +0.0993425 -0.475253 -0.0345906 +0.105878 -0.470302 -0.022596 +0.161209 0.00758193 -0.157082 +0.162861 -0.00496129 -0.160125 +0.14622 0.0234899 0.00861402 +0.16407 0.00688456 0.00334424 +0.187476 0.0108016 -0.000104135 +0.198618 0.0267239 -0.00776275 +0.213159 0.032032 -0.0211609 +0.229764 0.0271876 -0.0288068 +0.229938 0.0432028 -0.0342052 +0.231973 0.0361819 -0.05417 +0.241585 0.0230077 -0.0674939 +0.235826 0.0200922 -0.0913851 +0.229532 0.00831192 -0.0604593 +0.228417 0.0182383 -0.11087 +0.214387 0.0313739 -0.095916 +0.23826 0.0319925 -0.0407356 +0.240603 0.0153722 -0.0478262 +0.185434 0.0390225 -0.0120783 +0.174046 0.035224 -0.0278333 +0.183039 0.0254835 -0.0435084 +0.185088 0.013208 -0.0664572 +0.184517 -0.00115634 -0.0944301 +0.15883 0.0112792 -0.0789407 +0.166768 0.0454452 -0.0125857 +0.149871 0.0473393 -0.0127261 +0.24097 0.0273212 -0.0523021 +0.244689 0.0183228 -0.0578172 +0.239121 0.00955592 -0.0564169 +0.23067 0.0133196 -0.0511149 +0.217815 0.013095 -0.0555127 +0.202953 0.0215885 -0.0445658 +0.223255 0.0309758 -0.00933388 +0.246338 0.00680161 -0.0920968 +-0.29666 -0.251794 -0.0420083 +-0.282377 -0.246563 -0.0382484 +-0.274248 -0.257163 -0.0411355 +0.121069 0.3764 0.220244 +0.124178 0.361607 0.222425 +0.12316 0.347289 0.21517 +0.120818 0.335014 0.200629 +0.131773 0.318764 0.203442 +0.240354 -0.189104 -0.174254 +0.226426 -0.17846 -0.157236 +0.25469 -0.197929 -0.186668 +0.262527 -0.207499 -0.20859 +0.275709 -0.206748 -0.189755 +0.268196 -0.218714 -0.226562 +0.252109 -0.214264 -0.221034 +0.231966 -0.219863 -0.222417 +0.16439 -0.290409 -0.045741 +0.174232 0.353361 0.161991 +0.167416 0.346038 0.151615 +0.153417 0.351454 0.147309 +0.141711 0.365653 0.160008 +0.174784 0.33351 0.146976 +0.172695 0.32064 0.137876 +0.171538 0.327653 0.122668 +-0.153467 -0.465689 -0.0917447 +-0.142244 -0.458217 -0.0978282 +-0.137315 -0.444624 -0.0945322 +-0.142546 -0.468457 -0.0929801 +-0.130113 -0.470071 -0.0887414 +-0.111868 -0.466578 -0.0912306 +-0.129822 -0.476932 -0.0773011 +-0.116192 -0.47396 -0.0799073 +-0.102072 -0.471199 -0.0816089 +0.0648327 -0.288276 0.006469 +0.290523 -0.14969 0.120852 +0.286341 -0.149084 0.132395 +0.276561 -0.154417 0.131433 +0.266874 -0.144863 0.128327 +0.266123 -0.155511 0.139202 +0.254682 -0.156501 0.14847 +0.243072 -0.144724 0.147014 +0.246658 -0.132891 0.13506 +0.271484 -0.158645 0.148826 +0.262513 -0.161728 0.150556 +0.255383 -0.163883 0.160093 +0.258182 -0.154155 0.170424 +0.247063 -0.165211 0.168804 +0.236375 -0.166699 0.177267 +0.223809 -0.16596 0.182974 +0.219971 -0.167303 0.19665 +0.224247 -0.15536 0.203023 +0.206877 -0.166582 0.198203 +0.201256 -0.167208 0.210293 +0.187949 -0.165778 0.214542 +0.175727 -0.151043 0.207983 +0.205839 -0.156778 0.218275 +0.191606 -0.158183 0.226132 +0.180969 -0.154585 0.235065 +0.174695 -0.121433 0.234619 +0.192199 -0.123695 0.219574 +0.158231 -0.157867 0.22927 +0.169715 -0.162656 0.235355 +0.0970603 -0.116879 0.246491 +-0.208269 -0.22401 0.141633 +-0.20692 -0.250284 0.132437 +0.0965268 -0.427234 -0.105996 +0.0991486 -0.439673 -0.0998914 +0.19126 -0.17619 0.0390751 +0.184715 -0.204433 0.0324441 +0.164304 -0.221583 0.0465757 +0.1444 -0.208807 0.0686986 +0.0226172 -0.0147867 0.137076 +-0.142255 -0.49298 -0.0216335 +0.233691 0.0208001 -0.0385404 +-0.192672 -0.315988 0.0839294 +-0.202286 -0.295403 0.104035 +-0.212462 -0.276423 0.111373 +-0.218066 -0.285356 0.0914372 +-0.230517 -0.270625 0.068595 +0.136055 0.0355608 0.0131192 +0.121886 0.0399552 0.0198872 +0.106186 0.0275039 0.0255554 +0.0928691 0.0373146 0.0446539 +0.107832 0.0113031 0.0106037 +0.0853288 0.00897116 0.0135994 +0.0648776 -0.00152148 0.00684991 +0.301901 0.1917 0.196837 +0.304498 0.181718 0.192274 +0.29757 0.171529 0.192207 +0.283611 0.170157 0.190984 +0.17589 0.332048 0.230978 +0.176274 0.318104 0.221305 +0.189786 0.308195 0.22975 +0.199452 0.291101 0.221444 +0.210647 0.278153 0.221165 +0.212403 0.290739 0.232707 +0.229872 0.295702 0.229994 +0.238851 0.283146 0.23072 +0.237981 0.260514 0.227763 +0.248013 0.243086 0.221386 +0.245976 0.271423 0.230129 +0.237201 0.240055 0.208931 +0.239318 0.292509 0.222434 +0.244312 0.28734 0.210021 +0.234086 0.289095 0.199595 +0.221914 0.298769 0.201947 +0.1778 0.322602 0.229777 +0.232474 0.299285 0.221376 +0.223334 0.304746 0.213608 +0.207337 0.311267 0.204764 +0.224642 0.304397 0.226583 +0.214619 0.302742 0.233384 +0.203769 0.313465 0.232857 +0.204968 0.319702 0.218324 +0.201735 0.298965 0.232154 +-0.0492057 -0.0812756 -0.10551 +-0.0710597 -0.075701 -0.12067 +-0.0879497 -0.0905516 -0.13677 +-0.0843511 -0.119489 -0.147588 +-0.0762899 -0.059326 -0.102542 +-0.0985707 -0.0477827 -0.098696 +-0.118275 -0.0536394 -0.113913 +-0.11441 -0.0717159 -0.128365 +0.179503 0.303256 0.0436704 +0.192013 0.290229 0.0290644 +0.17689 0.287515 0.0370015 +0.192038 0.271729 0.0156116 +0.209167 0.267708 0.00969983 +0.200133 0.255704 0.00478026 +-0.247504 -0.392344 -0.224787 +-0.247477 -0.405986 -0.218212 +-0.243099 -0.400741 -0.206484 +-0.246703 -0.405341 -0.193269 +-0.249065 -0.417066 -0.193806 +-0.263856 -0.417281 -0.202583 +-0.253854 -0.410374 -0.185389 +-0.264275 -0.407223 -0.177693 +-0.272044 -0.40206 -0.166216 +-0.284666 -0.409799 -0.163624 +-0.28689 -0.423019 -0.170791 +-0.283285 -0.428723 -0.186577 +-0.301536 -0.424549 -0.197331 +-0.276684 -0.426319 -0.176604 +-0.270204 -0.426002 -0.18843 +-0.267033 -0.421163 -0.178871 +-0.28572 -0.431162 -0.176917 +0.0984334 0.0428629 0.147655 +0.0984512 0.0370662 0.158757 +-0.324734 -0.278381 -0.0492733 +-0.319049 -0.278035 -0.0388895 +-0.314693 -0.271902 -0.0298211 +-0.0814975 -0.486596 -0.0514846 +-0.0716057 -0.47534 -0.0576231 +-0.0807984 -0.475501 -0.0687174 +-0.0782273 -0.46782 -0.0773567 +-0.0794515 -0.454639 -0.076562 +-0.0865219 -0.442019 -0.0638219 +-0.0826697 -0.456554 -0.0896798 +-0.0913604 -0.446861 -0.0969099 +-0.0924184 -0.432044 -0.0753911 +-0.098273 -0.416607 -0.0817744 +-0.111942 -0.395187 -0.0818225 +-0.0923505 -0.401008 -0.0727607 +-0.110463 -0.376831 -0.0757945 +-0.0955645 -0.358515 -0.0727168 +-0.0748788 -0.367775 -0.053732 +-0.099584 -0.336657 -0.0718408 +-0.0617229 -0.346951 -0.0508932 +-0.0372908 -0.340191 -0.0358611 +-0.187209 -0.0514446 0.134371 +-0.172275 -0.062062 0.144345 +-0.181772 -0.0387772 0.12984 +0.27325 0.225257 0.167666 +0.283037 0.221467 0.169903 +0.141164 -0.00931766 -0.150578 +0.223335 -0.262546 -0.149684 +0.199958 -0.258684 -0.141852 +0.218212 -0.249649 -0.131577 +-0.0730224 -0.485274 -0.0383372 +-0.0765985 -0.473674 -0.025717 +-0.0833487 -0.485599 -0.0202509 +-0.0969784 -0.487241 -0.0157338 +-0.106328 -0.475595 -0.0156679 +-0.107519 -0.486132 -0.0147883 +-0.117398 -0.491224 -0.0155421 +-0.11866 -0.497871 -0.0255495 +0.192205 -0.0198585 -0.151725 +0.281772 0.238327 0.210562 +0.269826 0.243309 0.222088 +0.243244 0.207816 -0.00325363 +0.239729 0.221932 -0.000908316 +0.243256 0.225044 0.0142927 +0.235434 0.23543 0.00346349 +0.158954 -0.447934 -0.074517 +0.164 -0.440163 -0.0849532 +0.160645 -0.422992 -0.0839209 +0.160099 -0.41995 -0.0633914 +0.170063 -0.432118 -0.0580684 +0.170775 -0.442201 -0.0470561 +0.167356 -0.452883 -0.036848 +0.157537 -0.464023 -0.0432353 +0.154265 -0.458207 -0.0582632 +0.146921 -0.466798 -0.0291891 +0.17099 -0.445942 -0.0649823 +0.152813 -0.426396 -0.0985179 +0.142833 -0.435406 -0.0989063 +0.126573 -0.436557 -0.100225 +0.120949 -0.42189 -0.103936 +0.130685 -0.411647 -0.0938972 +0.160351 -0.460975 -0.0324222 +0.164884 -0.460693 -0.0398836 +0.167083 -0.430709 -0.0834012 +0.161089 -0.432508 -0.0931652 +0.165433 -0.424956 -0.0749657 +0.155909 -0.417913 -0.0743018 +0.149825 -0.407366 -0.067413 +0.142015 -0.399818 -0.0764637 +0.153043 -0.435416 -0.0966096 +0.148842 -0.431897 -0.101759 +0.145045 -0.424265 -0.10134 +0.147732 -0.418014 -0.0911084 +0.138977 -0.417451 -0.0965307 +0.139635 -0.411036 -0.0878314 +0.14174 -0.430413 -0.104765 +0.134784 -0.434536 -0.101822 +0.135086 -0.440748 -0.0918112 +0.13766 -0.447456 -0.0800542 +0.122938 -0.455334 -0.0698495 +0.127914 -0.428797 -0.106691 +0.135671 -0.430083 -0.106069 +-0.0268041 -0.304928 0.142542 +-0.0182344 -0.281255 0.151927 +0.000262015 -0.258244 0.142866 +0.0151742 -0.229959 0.128466 +-0.00970849 -0.227931 0.154073 +0.0337917 -0.209923 0.115845 +0.0199495 -0.192987 0.125832 +-0.154293 -0.0335699 -0.082135 +-0.129631 -0.0324487 -0.0813475 +-0.120097 -0.027431 -0.0586998 +-0.0956922 -0.0340394 -0.0533561 +-0.0814148 -0.0448428 -0.0722969 +-0.0594432 -0.0515596 -0.0534184 +-0.160793 -0.0482086 -0.0989707 +-0.166155 -0.0307425 -0.0663998 +-0.169924 -0.0270352 -0.0414151 +-0.183311 -0.0375758 -0.0551581 +-0.174206 -0.0274939 -0.0203147 +-0.192353 -0.0397338 -0.00141151 +-0.170447 -0.0249801 0.0063437 +-0.211587 -0.0636911 -0.00501259 +-0.0018753 -0.187141 -0.149775 +0.0183103 -0.182965 -0.142326 +0.0322217 -0.167313 -0.134641 +0.0236675 -0.146992 -0.123167 +-0.00232452 -0.142332 -0.126149 +0.0375806 -0.18533 -0.140019 +0.0530379 -0.201545 -0.137283 +0.0772348 -0.20845 -0.140694 +0.0988175 -0.224384 -0.140468 +0.119251 -0.222512 -0.162731 +0.03788 -0.218276 -0.135529 +0.0772845 -0.19139 -0.155355 +0.080882 -0.225907 -0.127445 +0.0653619 -0.242778 -0.113036 +0.0731805 -0.173068 -0.155239 +0.0897045 -0.191329 -0.166141 +0.102707 -0.199007 -0.171074 +0.119058 -0.208637 -0.176942 +0.127514 -0.196293 -0.185172 +0.13998 -0.205302 -0.190755 +0.149824 -0.215626 -0.194546 +0.161245 -0.221969 -0.199237 +0.175364 -0.230409 -0.20401 +0.173584 -0.215336 -0.204853 +0.178202 -0.198362 -0.197173 +0.188397 -0.22907 -0.211289 +0.202734 -0.22056 -0.215065 +0.199745 -0.239634 -0.214151 +0.0815106 -0.18364 -0.162988 +-0.172104 -0.359269 -0.00938238 +-0.172319 -0.335226 -0.0164663 +-0.16873 -0.368903 -0.0231312 +-0.292266 -0.291505 -0.0889456 +-0.288266 -0.299574 -0.0955502 +-0.280983 -0.308012 -0.105167 +-0.278654 -0.297571 -0.101297 +-0.274336 -0.285615 -0.103446 +-0.260134 -0.28158 -0.0989442 +-0.257005 -0.265144 -0.10215 +-0.26942 -0.305285 -0.10276 +-0.257003 -0.309674 -0.100476 +-0.244993 -0.306014 -0.0938734 +-0.249351 -0.292113 -0.0926885 +-0.25954 -0.322424 -0.104282 +-0.267093 -0.332079 -0.111051 +-0.283312 -0.328944 -0.119574 +-0.249017 -0.331591 -0.10481 +-0.232981 -0.32784 -0.100164 +-0.240291 -0.342062 -0.113719 +-0.229688 -0.345883 -0.126712 +-0.23058 -0.352629 -0.145077 +-0.21352 -0.337371 -0.127344 +-0.269191 -0.344874 -0.117105 +-0.208623 -0.327937 -0.112241 +-0.191793 -0.321843 -0.117022 +-0.180909 -0.311277 -0.104708 +0.11012 0.10505 0.0238496 +0.213679 0.221732 0.163906 +-0.0357839 -0.0025294 0.108473 +-0.0312254 -0.0135193 0.128152 +-0.0238807 -0.033229 0.139313 +-0.00300831 -0.046529 0.144036 +-0.00364169 -0.0760125 0.145155 +-0.0103288 -0.10643 0.141831 +0.015326 -0.129347 0.142131 +-0.041062 -0.0443202 0.130625 +-0.0555252 -0.0465254 0.114753 +-0.0556686 -0.0325657 0.0996413 +-0.0768736 -0.0422105 0.0949058 +-0.0167984 0.000564353 0.123722 +0.00524698 0.0020139 0.129964 +-0.0281137 -0.0861213 0.139333 +-0.0785841 -0.0379469 0.0747431 +-0.0762529 -0.0505618 0.114297 +-0.032521 -0.108383 0.136839 +-0.0633754 -0.0458183 0.101476 +-0.0250298 0.00663901 0.112981 +-0.0219675 0.00393164 0.0935556 +-0.147404 -0.304789 -0.127071 +0.192111 0.473304 0.143665 +0.202701 0.475169 0.131787 +0.206558 0.475874 0.120017 +0.202492 0.480449 0.108775 +0.157654 -0.366957 -0.0205798 +0.26661 -0.307414 -0.281977 +0.270077 -0.295571 -0.288815 +0.283263 -0.291236 -0.297392 +0.290598 -0.279448 -0.297082 +0.304158 -0.276932 -0.29882 +0.315035 -0.2885 -0.301158 +0.307588 -0.298676 -0.297006 +0.297613 -0.307939 -0.283621 +0.293787 -0.301201 -0.295424 +0.318389 -0.297707 -0.296483 +0.328066 -0.301032 -0.289042 +0.324582 -0.309109 -0.276338 +0.33579 -0.291676 -0.2964 +0.346867 -0.288071 -0.287976 +0.353956 -0.299169 -0.28317 +0.345495 -0.307423 -0.274703 +0.352866 -0.288693 -0.277818 +0.351312 -0.284395 -0.265224 +0.355354 -0.294774 -0.257468 +0.360217 -0.304818 -0.260578 +0.35682 -0.308388 -0.269609 +0.359106 -0.312264 -0.252967 +0.356474 -0.316127 -0.245135 +0.351445 -0.319298 -0.237976 +-0.26647 -0.314705 -0.199507 +-0.27426 -0.329739 -0.204261 +-0.290128 -0.337563 -0.206145 +-0.303723 -0.332243 -0.195363 +-0.303858 -0.323407 -0.176279 +-0.302757 -0.349394 -0.210447 +-0.304665 -0.364526 -0.223447 +-0.321319 -0.375627 -0.232938 +-0.285437 -0.371465 -0.224735 +-0.28011 -0.37957 -0.242654 +-0.314609 -0.397575 -0.24523 +-0.31498 -0.344154 -0.199865 +-0.330892 -0.351901 -0.189469 +-0.332902 -0.388937 -0.243068 +-0.348245 -0.402805 -0.233911 +-0.328232 -0.404959 -0.235266 +-0.273541 -0.396265 -0.240028 +-0.293049 -0.39498 -0.245656 +-0.355214 -0.402159 -0.217135 +-0.360108 -0.415844 -0.205721 +-0.346381 -0.42668 -0.201491 +-0.340374 -0.436455 -0.180032 +-0.360217 -0.406031 -0.193698 +-0.356506 -0.391255 -0.182727 +-0.356512 -0.407116 -0.177427 +-0.347384 -0.421732 -0.172779 +-0.348669 -0.37532 -0.17511 +-0.341266 -0.408591 -0.160307 +-0.332592 -0.391247 -0.153464 +-0.323849 -0.407723 -0.153687 +-0.349384 -0.43169 -0.189135 +-0.335815 -0.43119 -0.192046 +-0.324454 -0.435806 -0.181733 +-0.331465 -0.433295 -0.170921 +-0.314528 -0.431132 -0.168412 +-0.260177 -0.397767 -0.235 +-0.252953 -0.401301 -0.227678 +-0.247407 -0.394723 -0.238053 +-0.24372 -0.401046 -0.225417 +-0.243948 -0.396615 -0.216223 +-0.258003 -0.38952 -0.247437 +-0.272162 -0.387844 -0.252537 +-0.287147 -0.384539 -0.255755 +-0.302942 -0.384129 -0.252391 +-0.315505 -0.382766 -0.24459 +-0.323099 -0.390444 -0.249836 +-0.312399 -0.390336 -0.253745 +-0.328503 -0.399215 -0.245058 +-0.340635 -0.398589 -0.24271 +-0.266346 -0.382624 -0.244488 +-0.267321 -0.391914 -0.245578 +-0.0266812 0.0695328 -0.0242573 +-0.00773299 0.0681739 -0.0184911 +0.0122858 0.0669077 -0.0123781 +0.0150035 0.0767227 0.00239352 +0.0141467 0.0954062 -0.00215996 +0.0325338 0.098411 -0.00617133 +0.0450676 0.0983028 0.010086 +0.0314473 0.0730983 0.00401189 +0.0505593 0.0686309 0.00292132 +0.0698817 0.067505 0.00832925 +0.145383 0.180744 0.0984363 +0.132189 0.17376 0.0925198 +0.121241 0.164951 0.0850023 +0.133425 0.169934 0.0774819 +0.11505 0.153676 0.07879 +-0.083942 -0.368893 -0.0674225 +-0.0809876 -0.385027 -0.0581697 +-0.0723248 -0.382058 -0.0416794 +-0.00904893 0.0914446 -0.0120745 +0.00504523 0.0987359 -0.0150796 +0.0060609 0.0932522 -0.034057 +0.0248461 0.0873188 -0.0377031 +0.0363994 0.089055 -0.023789 +0.00213821 0.0914225 -0.00482177 +0.0092558 0.0863088 0.00212053 +0.106375 0.0274106 0.14138 +-0.263884 -0.385451 -0.252252 +0.258755 0.24689 0.225661 +0.259085 0.23306 0.219814 +0.249971 0.25591 0.228242 +-0.322841 -0.345115 -0.164492 +-0.323706 -0.355326 -0.152393 +-0.279169 -0.265328 -0.0439542 +-0.285416 -0.267917 -0.0516616 +-0.294745 -0.263175 -0.0517725 +0.23393 -0.0149701 -0.10397 +0.219738 -0.0165453 -0.112039 +0.204608 -0.00981825 -0.104246 +0.187184 -0.00954937 -0.110855 +0.228145 0.230452 0.102316 +0.214447 0.238029 0.0983297 +0.23229 0.220992 0.0943503 +0.215398 0.247623 0.105271 +0.217938 0.25177 0.117669 +0.210276 0.258003 0.111405 +0.220949 0.241286 0.103103 +0.290344 -0.337843 -0.233955 +0.276226 -0.337233 -0.22831 +0.296573 -0.339782 -0.226215 +0.227663 0.461812 0.0838481 +0.234265 0.455281 0.0718225 +0.229698 0.445794 0.0603386 +0.225781 0.470182 0.0813133 +0.214396 0.4698 0.0788369 +0.208406 0.478123 0.0862021 +0.214031 0.460896 0.0711899 +0.217085 0.451741 0.0628259 +0.219354 0.474333 0.0827819 +0.21619 0.47758 0.0903862 +0.217994 0.472178 0.097233 +0.209525 0.481852 0.0939712 +0.227208 0.456115 0.0633709 +0.234329 0.451682 0.0642008 +0.23166 0.462658 0.0759848 +0.273713 -0.249314 -0.252993 +0.274317 -0.268417 -0.267071 +0.263304 -0.282613 -0.260934 +-0.240326 -0.404033 -0.2139 +-0.241182 -0.408607 -0.207233 +0.243855 0.194683 0.113624 +0.235959 0.206195 0.114609 +-0.329827 -0.30598 -0.098469 +-0.057071 -0.0425853 0.0117122 +-0.0551192 -0.0420888 0.0309046 +-0.0534835 -0.0402863 0.0500454 +-0.0435993 -0.0469165 0.00748095 +-0.0255629 -0.0374196 0.00481763 +-0.00817324 -0.0328811 -0.0061182 +-0.00350439 -0.0437548 -0.0255784 +-0.0349503 -0.0490115 -0.00492533 +-0.0419875 -0.0536475 -0.0293419 +-0.0139014 -0.0607747 -0.0378374 +-0.0105205 -0.0780801 -0.0585195 +-0.0335249 -0.0540562 -0.0180409 +-0.0278411 -0.0595083 -0.0313207 +0.193253 0.49569 0.0858481 +0.189805 0.494474 0.0949255 +0.179559 0.491992 0.0947812 +0.19709 0.487808 0.0978913 +0.174576 0.497081 0.0879734 +0.179584 0.496616 0.0784813 +0.175502 0.48892 0.0725035 +0.169475 0.481635 0.069206 +0.164994 0.474033 0.0669237 +0.155945 0.469227 0.0714265 +0.159639 0.459314 0.0671634 +0.160451 -0.0544036 0.113535 +0.179652 -0.262284 0.0054219 +0.186087 -0.244472 0.00347757 +0.246807 -0.00615903 -0.103541 +0.242297 -0.0135206 -0.100916 +0.240802 -0.0172339 -0.108388 +0.232593 -0.0188607 -0.112191 +0.240348 -0.0194541 -0.117278 +0.238974 -0.018297 -0.127651 +-0.164632 -0.397326 -0.024693 +0.0813645 -0.458079 -0.0716845 +0.302397 0.127887 0.0470846 +0.298473 0.138148 0.0455108 +0.292313 0.136477 0.0386335 +0.288054 0.130079 0.0326142 +0.28271 0.137427 0.0379629 +0.271939 0.136706 0.038053 +0.261008 0.14116 0.0404912 +0.28194 0.12422 0.0312108 +0.300876 0.126279 0.0551937 +0.295306 0.129324 0.0632115 +0.286846 0.130603 0.0706512 +0.282604 0.11846 0.0804122 +0.273418 0.134767 0.0747422 +0.296205 0.121995 0.0600976 +0.289869 0.116278 0.0576534 +0.283444 0.108666 0.0679441 +0.208186 0.435058 0.0678801 +0.218992 0.437774 0.0675136 +0.20517 0.444041 0.0615 +0.195457 0.447135 0.0675955 +0.224157 0.438328 0.0597838 +0.221367 0.446069 0.0584788 +0.168291 -0.443724 -0.076199 +-0.239169 -0.248023 -0.0426243 +-0.246509 -0.244281 -0.0523825 +-0.245933 -0.250709 -0.0701381 +-0.252213 -0.23035 -0.0598084 +-0.256922 -0.212794 -0.063622 +-0.26443 -0.20039 -0.048456 +-0.236601 -0.248665 -0.0331221 +-0.248238 -0.244973 -0.04299 +-0.257005 -0.243536 -0.0363368 +-0.264619 -0.253098 -0.0324677 +-0.260909 -0.234911 -0.0387305 +-0.270856 -0.228969 -0.0335016 +-0.268106 -0.214873 -0.0367573 +-0.255525 -0.250409 -0.0291707 +-0.246354 -0.252152 -0.0213798 +-0.25421 -0.258055 -0.0140562 +-0.253371 -0.258976 0.00135493 +-0.263391 -0.256528 0.0180325 +-0.264412 -0.265611 -0.0106557 +-0.268835 -0.263918 0.00476582 +-0.24972 -0.252323 0.0327963 +-0.239732 -0.259608 0.0493553 +-0.242639 -0.251027 0.0706418 +-0.27192 -0.270836 -0.02103 +-0.264888 -0.241199 0.0366373 +-0.279792 -0.22631 0.033251 +-0.274206 -0.207933 0.0474852 +-0.283361 -0.276288 -0.0174295 +-0.267659 -0.226048 0.0482271 +0.202151 0.274483 0.19338 +0.194908 0.283204 0.198963 +-0.157532 -0.273615 -0.179435 +-0.176899 -0.279729 -0.184503 +-0.188947 -0.290942 -0.187096 +-0.192598 -0.3074 -0.18306 +-0.203551 -0.297799 -0.190929 +-0.222085 -0.288246 -0.191352 +-0.217908 -0.303036 -0.194268 +-0.355074 -0.426501 -0.195973 +-0.354866 -0.423993 -0.205337 +-0.355569 -0.419108 -0.214528 +-0.353763 -0.412061 -0.224887 +-0.346029 -0.286085 -0.1062 +-0.341227 -0.288967 -0.0947058 +-0.336277 -0.278132 -0.0971269 +-0.328988 -0.269127 -0.105169 +-0.340297 -0.292656 -0.0831052 +-0.335578 -0.266756 -0.115188 +-0.339311 -0.299368 -0.0917431 +0.212569 0.261061 0.18216 +0.216886 0.255854 0.175009 +0.219484 0.251322 0.162982 +0.212289 0.247584 0.170006 +0.218513 0.26322 0.154269 +0.225667 0.261532 0.178216 +0.218436 0.276817 0.178562 +0.234042 0.273996 0.185236 +0.223426 0.242038 0.154678 +0.21181 0.288948 0.181391 +0.220498 0.257755 0.18435 +0.211254 0.266563 0.187703 +0.211739 0.26954 0.199826 +0.278409 -0.209413 -0.174692 +0.233056 0.457965 0.0658843 +0.227063 0.46182 0.0682472 +0.220168 0.458063 0.0666597 +-0.0481392 -0.0447802 0.0166181 +0.131516 0.0530135 0.000672445 +0.12038 0.0567042 0.000376152 +0.134766 0.046581 0.0097546 +0.0904091 -0.099649 0.239147 +-0.00884361 -0.0890856 -0.0728998 +-0.00654069 -0.102279 -0.0895079 +-0.0290648 -0.104665 -0.111248 +-0.0100257 -0.116287 -0.107029 +0.191386 -0.264049 -0.175252 +0.190045 -0.262732 -0.156889 +0.204589 -0.269071 -0.178679 +0.222111 -0.273266 -0.172895 +0.189235 0.0753918 -0.0129238 +0.0782752 -0.467624 -0.0498343 +0.0759673 -0.46177 -0.0555898 +0.0772195 -0.460605 -0.0642783 +0.151932 0.323656 0.079912 +0.153175 0.313215 0.0881136 +0.161272 0.302381 0.0857396 +0.163146 0.324848 0.0718597 +0.151557 0.334415 0.0880604 +0.142886 0.334889 0.0972586 +0.140662 0.34411 0.107021 +0.133598 0.347717 0.117582 +0.131314 0.355467 0.129074 +0.127988 0.361743 0.142546 +0.123763 0.348981 0.138438 +0.119822 0.353337 0.149718 +0.116288 0.351928 0.168204 +0.226419 0.174912 -0.00671405 +0.232006 0.15884 0.00199041 +0.243933 0.169091 0.00253819 +0.237571 0.172786 -0.00612936 +0.183717 0.142245 0.147062 +0.183533 0.157982 0.153224 +0.200684 0.169917 0.154336 +0.175927 0.14817 0.154877 +0.164064 0.143191 0.159694 +0.181391 0.132744 0.149775 +0.177453 0.123521 0.157312 +0.108424 0.0602759 0.0311611 +0.101691 0.0511896 0.042029 +0.297187 0.12858 0.124591 +0.286869 0.125817 0.115842 +0.279264 0.13651 0.11071 +0.277464 0.150893 0.114839 +0.267972 0.163015 0.116989 +0.29066 -0.215317 -0.195858 +-0.0439761 -0.143405 -0.149346 +0.0959309 0.0199379 0.158053 +0.0941358 0.00844127 0.16726 +0.273991 -0.158318 0.138404 +0.280108 -0.155995 0.136908 +0.28311 -0.154668 0.131232 +0.287165 -0.152142 0.126309 +0.291082 -0.145525 0.127381 +0.258354 -0.329753 -0.2515 +0.256649 -0.327468 -0.240856 +0.265642 -0.321399 -0.233195 +0.269005 -0.32965 -0.227653 +0.204877 0.287044 0.0357487 +0.289139 -0.339472 -0.226774 +0.282728 -0.335989 -0.224475 +0.283065 -0.327384 -0.221193 +0.28398 -0.316486 -0.219293 +0.289461 -0.305296 -0.210924 +0.2738 -0.310998 -0.221733 +0.2646 -0.301502 -0.221281 +0.282981 -0.339471 -0.231684 +0.275544 -0.336339 -0.239462 +0.259131 -0.2954 -0.232139 +0.281853 -0.296955 -0.202405 +0.287258 -0.287693 -0.192682 +0.301236 -0.282638 -0.194913 +0.23745 0.0270265 -0.0333549 +0.234865 0.0358956 -0.0292661 +0.240774 0.0243245 -0.0402136 +0.044992 -0.0647291 0.254151 +0.0435251 -0.0559756 0.262078 +0.20354 0.276522 0.016541 +-0.0980428 -0.240155 0.197738 +-0.0924965 -0.26196 0.186819 +-0.109853 -0.270124 0.168775 +-0.253582 -0.386742 -0.238773 +-0.0267016 0.0982672 -0.0374627 +0.214024 0.433945 0.0622105 +0.204736 0.432758 0.058829 +0.201109 0.433103 0.0655996 +0.201809 0.436011 0.073894 +0.193477 0.433855 0.0682907 +0.185218 0.436354 0.0703184 +0.180836 0.436291 0.0819631 +0.191166 0.440882 0.0659291 +0.187348 0.447071 0.070626 +0.179215 0.453739 0.0726364 +0.193028 0.454826 0.0736221 +0.173421 0.440644 0.0776765 +-0.147031 -0.496444 -0.028386 +-0.151597 -0.495421 -0.0374969 +-0.157627 -0.484775 -0.0397619 +-0.140246 -0.499465 -0.0256815 +-0.132401 -0.5 -0.0296698 +-0.132703 -0.497498 -0.0384881 +-0.126331 -0.494492 -0.0452588 +-0.11646 -0.490117 -0.0524448 +-0.101295 -0.487303 -0.0547567 +-0.136101 -0.494007 -0.0471871 +-0.13938 -0.490039 -0.0561432 +-0.133381 -0.483866 -0.0661423 +-0.15577 -0.492035 -0.0446482 +-0.153261 -0.490282 -0.0555144 +0.197755 0.272342 0.0690149 +0.190382 0.263313 0.0560052 +0.0686632 -0.292912 -0.0237205 +0.056243 -0.29127 -0.0303266 +0.0398126 -0.298058 -0.030698 +0.0315681 -0.295788 -0.0489563 +0.043708 -0.285681 -0.061727 +0.0621136 -0.289132 -0.040881 +0.0722108 -0.295077 -0.0484755 +0.0577034 -0.286988 -0.0524253 +0.0569935 -0.281989 -0.0659264 +0.064236 -0.290328 -0.0328163 +-0.0127838 0.0757233 -0.00921143 +0.0935192 0.0772038 0.0642915 +0.169714 0.302879 0.0497006 +0.163659 0.300165 0.0640716 +0.172929 0.295611 0.0434924 +0.049865 0.0913802 0.0221499 +0.0418831 0.0808731 0.013212 +0.0368549 0.0913191 0.0145569 +0.0319565 0.0968433 0.00544037 +0.310435 0.13526 0.142507 +0.026474 0.0305763 -0.129196 +0.017822 0.0292426 -0.122273 +0.0163904 0.0280919 -0.108702 +0.0350495 0.0278097 -0.132911 +0.178361 0.286185 0.0866978 +0.184473 0.288229 0.0959947 +0.0746028 -0.0119842 0.202652 +0.0770488 -0.00198153 0.201878 +0.0861829 0.00359659 0.206228 +0.0964676 0.00912576 0.20305 +0.110414 0.00821695 0.200752 +0.119478 0.0159283 0.18886 +-0.0749585 -0.470198 -0.0703816 +-0.0722579 -0.469101 -0.0627931 +-0.0775597 -0.45771 -0.0519849 +-0.0725204 -0.466379 -0.0530837 +-0.0822617 -0.458336 -0.0360309 +0.11796 -0.00196684 -0.151498 +0.110489 0.008862 -0.155734 +0.119387 0.0273131 -0.141295 +0.100036 0.00317869 -0.149099 +0.0946498 0.00360487 -0.130289 +0.0996271 0.00897841 -0.108462 +0.0876406 0.00969553 -0.149119 +0.0889673 0.0239205 -0.144401 +0.103773 0.0275171 -0.140968 +0.112143 0.0407687 -0.122665 +0.128275 -0.00210722 -0.155193 +0.136944 0.00690927 -0.158099 +0.1315 0.01712 -0.150046 +0.148823 0.0111196 -0.154092 +0.137878 -0.00286061 -0.157253 +0.0812501 0.0180999 -0.148671 +0.0723702 0.0199576 -0.146504 +0.0894465 0.0177562 -0.14994 +-0.244247 -0.411744 -0.197734 +0.0532101 -0.0425986 0.239458 +0.0614299 -0.034607 0.250277 +0.0718515 -0.0264935 0.244569 +0.0612036 -0.0408317 0.227838 +0.211416 0.21985 0.0506815 +0.209629 0.209187 0.0516229 +0.197715 0.200596 0.0531448 +0.210711 0.212673 0.041983 +0.209533 0.205981 0.0261421 +0.207685 0.214484 0.0320655 +0.204793 0.215907 0.019768 +0.207322 0.190012 0.0316877 +0.210424 0.206724 0.0353988 +0.209086 0.197885 0.0355421 +0.19948 0.191764 0.0420701 +0.206287 0.1798 0.0239909 +0.199532 0.162119 0.0159658 +0.0889829 0.0153312 0.187549 +0.0895058 0.0194699 0.175832 +0.0997882 0.0258376 0.180178 +0.0912633 -0.43583 -0.104962 +0.0893849 -0.44209 -0.0966632 +0.0818551 -0.438899 -0.0891003 +0.0775492 -0.435915 -0.0759439 +0.0805228 -0.426773 -0.087989 +0.0848008 -0.421093 -0.0971385 +0.0844397 -0.410175 -0.0930928 +0.0796444 -0.399052 -0.082153 +0.096306 -0.399151 -0.0928503 +0.0992866 -0.434977 -0.10667 +-0.038871 -0.095203 0.134909 +-0.0453136 -0.074362 0.132403 +-0.0642973 -0.0816285 0.135216 +0.128958 0.371237 0.164377 +0.114324 0.368213 0.169385 +0.110394 0.358489 0.182698 +0.119359 0.382173 0.172221 +0.244566 0.0274799 0.091132 +0.236517 0.0321023 0.108593 +0.228129 0.0154777 0.110489 +0.243652 -0.0044318 0.106704 +0.215089 0.0116198 0.126655 +0.193164 -0.00203925 0.149761 +0.295901 -0.145148 0.11649 +0.181002 0.326878 0.162405 +0.192626 0.308402 0.164847 +0.180295 0.335983 0.171005 +0.215019 0.222685 -0.0085752 +0.216226 0.238327 -0.00679645 +0.204842 0.243639 -0.00108745 +0.197086 0.237151 0.00943393 +0.207737 0.21475 -0.00125832 +0.200663 0.225332 0.00994825 +0.227239 0.239308 -0.00361834 +0.210369 0.205349 -0.000451507 +0.212421 0.195338 0.00658041 +0.0965367 0.0723068 0.0490018 +-0.263237 -0.382248 -0.20077 +-0.334935 -0.395374 -0.246716 +0.0666968 0.0983382 0.0352739 +0.0735768 0.104043 0.0256427 +0.0854137 0.105714 0.0280147 +0.0966684 0.103408 0.0197312 +-0.293219 -0.246559 0.00868918 +-0.284829 -0.260543 0.00656712 +0.231694 -0.239358 -0.229883 +0.249173 -0.248287 -0.23972 +-0.313753 -0.278534 -0.156686 +-0.167921 -0.0222432 0.100354 +-0.166557 -0.0217484 0.0804222 +-0.137191 -0.0189498 0.0544508 +-0.183157 -0.0297007 0.0652393 +-0.193717 -0.0386652 0.0428719 +-0.162262 -0.0205653 0.0563587 +-0.148465 -0.0201145 0.071316 +-0.122512 -0.0229086 0.0762312 +-0.112808 -0.0225311 0.0535636 +-0.15755 -0.0225071 0.112728 +-0.13968 -0.0242143 0.109228 +-0.128528 -0.0323847 0.121144 +-0.137944 -0.0426964 0.133983 +0.338353 -0.331842 -0.233 +0.197716 0.0369013 -0.0158252 +0.225598 0.0269623 0.107608 +0.227611 0.0352699 0.116368 +0.216481 0.0416846 0.126455 +0.20366 0.0291575 0.127785 +0.197706 0.0139181 0.138946 +0.177004 0.0154396 0.15063 +0.196436 0.0406475 0.130552 +0.183582 0.0465791 0.137895 +0.171962 0.0340634 0.144092 +0.209838 0.0350513 0.1214 +0.122018 -0.0147207 0.202688 +0.134625 -0.010294 0.190699 +0.150345 -0.0204184 0.190322 +0.171467 -0.0443352 0.191435 +0.124137 -0.0275222 0.21069 +0.115004 -0.0324307 0.220668 +0.103488 -0.0235525 0.230568 +-0.234966 -0.250492 -0.00657503 +0.230136 -0.0629922 0.010065 +0.22781 -0.0439028 0.0052695 +0.226758 -0.0758146 -0.00318988 +0.218119 -0.0755566 -0.0185995 +0.210925 -0.0881128 -0.0299059 +0.195391 -0.0835698 -0.0397083 +0.187049 -0.0970928 -0.0513544 +0.215909 -0.10623 -0.0275177 +0.221663 -0.111792 -0.00835326 +0.21689 -0.135734 -0.006698 +0.187289 -0.0668273 -0.0361071 +0.170089 -0.0549841 -0.0384156 +0.158135 -0.0292105 -0.0224101 +0.144698 -0.0631652 -0.0561794 +0.210349 -0.156804 0.00619425 +0.122465 -0.0210506 -0.020971 +0.25102 0.0827579 -0.00901225 +0.246076 0.0717907 -0.00732438 +0.248146 0.0653429 0.00439784 +0.245544 0.0538898 0.0151974 +0.255748 0.0868229 -0.000826293 +-0.125725 -0.258433 -0.170214 +0.151089 -0.0268375 0.140451 +0.244155 0.0131187 -0.0533056 +0.246127 0.0105937 -0.0612737 +0.239403 0.00492409 -0.0645919 +0.228547 -0.00190445 -0.0800819 +0.236042 0.000460551 -0.073323 +0.244455 -0.00400961 -0.0816292 +0.225173 0.00380285 -0.0703884 +0.247885 -0.00234363 -0.0902777 +0.247838 0.00379159 -0.0839495 +0.243353 0.0148187 -0.0838177 +0.236031 0.0244971 -0.0791546 +0.225616 0.0291453 -0.0875646 +-0.29518 -0.390079 -0.254006 +-0.303646 -0.394416 -0.248506 +-0.302477 -0.403327 -0.233435 +-0.298023 -0.412267 -0.217588 +-0.29425 -0.38151 -0.250683 +-0.302074 -0.390767 -0.254186 +0.191342 0.435898 0.0636941 +-0.0964353 -0.460913 -0.0144457 +0.137532 -0.0116873 0.139128 +0.343547 -0.294973 -0.292923 +0.137424 0.0947211 0.0118894 +0.147115 0.0902563 -0.00271409 +0.147874 0.0802052 -0.0226835 +0.255027 -0.310713 -0.257667 +0.257498 -0.300887 -0.266482 +0.220835 -0.0105204 -0.15317 +0.210403 -0.014095 -0.156518 +0.204562 -0.0228168 -0.148776 +-0.117774 -0.20207 0.202016 +3 572 1212 1222 +3 899 137 1163 +3 2071 17 2074 +3 1326 1325 327 +3 1028 1034 1029 +3 1232 1231 733 +3 983 1228 182 +3 529 531 185 +3 531 446 185 +3 1557 1539 1556 +3 671 672 636 +3 1127 1222 241 +3 278 6 279 +3 6 282 279 +3 618 951 952 +3 234 272 274 +3 2490 1715 2491 +3 2174 2173 2172 +3 11 205 277 +3 919 93 2029 +3 527 2648 2649 +3 2093 2095 2088 +3 1367 1369 763 +3 1354 1367 763 +3 1743 522 1842 +3 2551 1617 2550 +3 2280 2214 2281 +3 989 96 987 +3 103 21 104 +3 1649 1650 31 +3 1654 1650 1649 +3 2013 2014 294 +3 744 745 461 +3 594 1081 1083 +3 1000 2140 2139 +3 2133 1000 2139 +3 213 38 214 +3 2151 2154 470 +3 2650 256 2653 +3 215 551 941 +3 551 550 941 +3 1426 1425 443 +3 983 2103 96 +3 456 1019 1018 +3 958 1898 2459 +3 622 1483 1484 +3 1754 1759 515 +3 1555 2698 1955 +3 52 1454 1455 +3 2050 52 1455 +3 2310 2316 1373 +3 2003 1468 74 +3 328 325 1730 +3 930 931 176 +3 524 566 702 +3 1953 246 1952 +3 413 1915 1916 +3 850 541 184 +3 1133 353 351 +3 1845 1844 134 +3 5 975 1105 +3 1337 1335 723 +3 80 27 1568 +3 1458 1651 175 +3 1901 1902 2544 +3 21 105 104 +3 21 103 29 +3 2129 956 1161 +3 287 2129 1161 +3 293 1889 1890 +3 1723 1724 336 +3 693 1184 1182 +3 1183 693 1182 +3 1458 66 1651 +3 68 904 122 +3 259 1716 340 +3 1333 1334 449 +3 803 396 475 +3 1330 747 725 +3 1485 418 1484 +3 278 11 277 +3 276 278 277 +3 225 2069 2068 +3 257 258 76 +3 683 680 716 +3 1229 947 1227 +3 1566 1567 1927 +3 91 2022 974 +3 721 731 1230 +3 721 729 731 +3 47 280 279 +3 85 1931 2195 +3 206 154 64 +3 1949 1947 1948 +3 550 850 184 +3 76 260 1587 +3 258 260 76 +3 679 703 1473 +3 657 703 679 +3 295 17 296 +3 17 2071 296 +3 551 215 913 +3 380 382 381 +3 270 268 295 +3 268 17 295 +3 1079 653 1791 +3 115 198 195 +3 1053 1046 877 +3 1489 2499 2197 +3 211 547 237 +3 1929 1567 27 +3 363 72 364 +3 671 654 670 +3 82 168 158 +3 1130 638 1168 +3 801 800 397 +3 178 2587 458 +3 159 2049 157 +3 1625 1627 1626 +3 1627 1273 1626 +3 1468 141 1467 +3 2093 2086 2095 +3 357 2086 2093 +3 564 531 528 +3 64 263 273 +3 137 364 379 +3 378 137 379 +3 117 900 899 +3 376 375 136 +3 88 2491 2492 +3 83 1292 1299 +3 1787 689 1790 +3 1610 581 707 +3 642 599 1776 +3 500 497 499 +3 1823 1259 54 +3 1674 1549 514 +3 1166 1066 1065 +3 42 1793 1796 +3 21 67 106 +3 81 80 84 +3 20 105 118 +3 20 156 105 +3 67 21 255 +3 1012 257 1013 +3 258 257 65 +3 646 887 1633 +3 1970 116 1969 +3 1143 401 1144 +3 126 1584 1587 +3 164 1843 163 +3 120 164 163 +3 2699 377 376 +3 1764 1842 522 +3 507 508 412 +3 1140 751 304 +3 1253 1021 1256 +3 863 1784 1783 +3 2610 1784 863 +3 571 1219 1218 +3 1641 1035 1640 +3 158 168 51 +3 790 1529 1530 +3 747 727 462 +3 726 727 747 +3 993 995 61 +3 279 280 11 +3 916 93 915 +3 587 2249 1315 +3 1298 1447 1451 +3 68 122 118 +3 237 534 552 +3 138 364 900 +3 1505 1531 1504 +3 263 1688 267 +3 2028 2029 93 +3 6 272 282 +3 2479 63 245 +3 235 316 318 +3 40 84 80 +3 84 40 104 +3 775 1350 1349 +3 1352 775 1349 +3 170 262 264 +3 1935 170 264 +3 21 106 105 +3 941 183 1708 +3 941 942 183 +3 1843 164 165 +3 67 248 106 +3 282 234 47 +3 63 1954 245 +3 313 234 274 +3 434 435 188 +3 1714 1715 344 +3 1158 2373 2374 +3 2393 591 1099 +3 1453 1298 1451 +3 2 1133 1134 +3 1059 2444 2445 +3 1779 218 1777 +3 1704 994 1700 +3 263 267 273 +3 438 1398 1244 +3 523 2647 527 +3 2647 2646 527 +3 118 105 106 +3 164 120 121 +3 71 131 165 +3 63 246 1954 +3 1843 165 1844 +3 2003 2001 2002 +3 2234 2374 2235 +3 253 106 248 +3 253 68 106 +3 682 658 667 +3 1467 75 2084 +3 986 180 988 +3 262 24 264 +3 1970 1969 929 +3 1692 170 1456 +3 124 1013 76 +3 276 277 64 +3 430 151 429 +3 2174 2682 2138 +3 815 406 475 +3 1468 236 74 +3 1943 1545 2536 +3 2622 901 894 +3 901 896 894 +3 376 377 135 +3 132 72 363 +3 281 109 292 +3 109 281 318 +3 223 83 1299 +3 74 380 375 +3 2003 2002 141 +3 2175 2603 2173 +3 1131 1408 1407 +3 411 811 810 +3 2549 1609 706 +3 126 1587 260 +3 996 34 988 +3 896 1940 1938 +3 98 1308 274 +3 925 1735 928 +3 144 2080 2085 +3 23 233 78 +3 600 797 704 +3 336 1459 331 +3 1459 1460 331 +3 1341 1334 724 +3 1560 16 1559 +3 544 92 546 +3 2143 2175 2138 +3 2185 2507 2506 +3 377 72 135 +3 1764 1752 1842 +3 277 205 206 +3 170 82 1456 +3 264 24 265 +3 307 153 940 +3 309 307 940 +3 566 562 177 +3 266 1936 1471 +3 235 315 316 +3 1844 165 134 +3 1847 2330 1448 +3 163 159 120 +3 1433 1437 1432 +3 753 900 117 +3 138 900 753 +3 948 1228 983 +3 984 948 983 +3 2595 697 2597 +3 443 187 444 +3 1690 154 907 +3 255 21 29 +3 84 168 81 +3 1276 2328 2609 +3 2661 79 849 +3 146 362 2092 +3 1316 1317 2220 +3 68 118 106 +3 1040 1035 1641 +3 2698 1554 1673 +3 1228 1229 1227 +3 1330 726 747 +3 919 914 93 +3 822 394 821 +3 507 388 508 +3 760 1185 2077 +3 830 828 484 +3 557 1348 179 +3 557 1347 1348 +3 896 901 1940 +3 636 1130 1135 +3 671 636 1135 +3 1246 1240 1250 +3 2640 2639 1403 +3 499 496 500 +3 1658 1210 1209 +3 1335 449 1334 +3 1389 1022 441 +3 926 925 927 +3 1823 1822 1258 +3 1822 1825 1258 +3 2658 2661 240 +3 998 984 990 +3 2587 2633 190 +3 1439 2689 1428 +3 263 1685 1688 +3 263 1686 1685 +3 345 329 1136 +3 1134 1133 352 +3 1483 554 1484 +3 1994 115 1975 +3 143 1463 1464 +3 1456 1681 1692 +3 210 971 972 +3 318 317 109 +3 318 316 317 +3 2030 2026 208 +3 1012 123 257 +3 206 59 907 +3 1738 240 845 +3 854 221 1778 +3 543 854 1778 +3 87 342 1718 +3 618 912 619 +3 392 800 803 +3 974 973 972 +3 1965 989 931 +3 989 176 931 +3 1762 2669 2670 +3 277 206 64 +3 521 1660 1659 +3 2697 1670 2696 +3 1670 2697 1555 +3 1104 1102 1103 +3 189 2518 2519 +3 799 392 583 +3 1745 1751 1761 +3 473 813 389 +3 2108 1046 1045 +3 513 512 1545 +3 320 2006 2012 +3 473 474 506 +3 1177 770 1178 +3 550 184 942 +3 1224 1225 946 +3 1841 254 101 +3 1868 597 2207 +3 124 1011 1012 +3 272 98 274 +3 224 1581 1582 +3 48 312 313 +3 536 2653 2654 +3 2653 536 535 +3 1846 1845 465 +3 1778 1777 977 +3 791 2187 2186 +3 306 39 310 +3 39 306 319 +3 1500 1502 1507 +3 1552 1670 1551 +3 409 951 618 +3 538 851 852 +3 457 438 1245 +3 526 1480 2665 +3 1255 448 1254 +3 1645 2119 2124 +3 506 388 507 +3 1672 1671 1675 +3 1671 1552 1675 +3 1612 1613 581 +3 460 559 2585 +3 175 926 927 +3 261 1724 1723 +3 1724 261 1725 +3 379 72 377 +3 364 72 379 +3 128 2196 1934 +3 2457 135 2458 +3 128 1934 1936 +3 1118 2136 287 +3 888 1631 1370 +3 135 132 2458 +3 76 1013 257 +3 117 899 898 +3 132 135 72 +3 905 139 906 +3 125 76 1587 +3 76 125 124 +3 734 733 742 +3 30 538 540 +3 30 537 538 +3 394 823 821 +3 259 1719 1717 +3 340 1714 1721 +3 173 550 551 +3 1138 330 1136 +3 1724 1459 336 +3 2593 2592 697 +3 1719 1720 258 +3 229 1373 2319 +3 280 281 12 +3 2086 2087 2095 +3 1657 1820 1818 +3 585 1665 1080 +3 1066 1166 638 +3 1146 423 1085 +3 11 278 279 +3 916 1324 212 +3 1595 712 3 +3 2316 2310 2309 +3 178 2586 2632 +3 2043 2042 2041 +3 319 317 39 +3 317 316 39 +3 751 14 752 +3 6 271 272 +3 2121 1044 1048 +3 1055 2112 2111 +3 236 1468 142 +3 1767 520 1487 +3 588 692 778 +3 693 692 2077 +3 233 23 429 +3 797 717 680 +3 235 281 47 +3 234 235 47 +3 23 1159 2261 +3 2141 2603 2176 +3 2606 2605 829 +3 235 318 281 +3 814 389 805 +3 506 507 473 +3 1629 1443 489 +3 1271 1627 1625 +3 190 2640 2641 +3 1135 1130 1168 +3 832 837 411 +3 837 1181 411 +3 1847 1846 465 +3 138 753 751 +3 22 2018 299 +3 308 752 1015 +3 1619 583 586 +3 1144 1619 586 +3 1739 2658 240 +3 2658 1739 519 +3 378 379 377 +3 1717 1719 65 +3 1697 1696 196 +3 2041 2042 967 +3 299 2018 2017 +3 900 137 899 +3 25 331 999 +3 235 234 314 +3 1159 78 1024 +3 1160 317 319 +3 147 428 798 +3 359 358 301 +3 2234 1169 3 +3 634 666 674 +3 751 1140 14 +3 2631 2634 417 +3 1210 572 571 +3 1212 572 1210 +3 2135 2172 2141 +3 2306 715 2307 +3 532 184 541 +3 607 1194 393 +3 836 149 834 +3 953 149 836 +3 181 329 346 +3 671 1135 654 +3 339 325 328 +3 1400 1393 1604 +3 2589 1790 689 +3 173 551 921 +3 941 550 942 +3 532 541 530 +3 1708 215 941 +3 333 90 335 +3 2409 780 2414 +3 924 1735 926 +3 1260 309 940 +3 2413 949 780 +3 1141 589 1143 +3 926 175 924 +3 322 1699 1698 +3 2229 2241 2372 +3 1779 1781 1780 +3 1701 1703 2495 +3 221 854 855 +3 345 1136 1728 +3 806 805 389 +3 291 1070 1069 +3 1110 1908 1911 +3 1733 1732 1113 +3 2234 2235 1169 +3 1910 1009 286 +3 1722 77 1720 +3 506 817 841 +3 416 836 2635 +3 1256 1021 1248 +3 1432 1437 480 +3 2659 2657 534 +3 565 739 731 +3 2009 2008 297 +3 187 1134 352 +3 1408 1392 439 +3 466 133 750 +3 898 899 359 +3 899 1163 359 +3 589 1141 808 +3 151 233 429 +3 2270 712 2271 +3 1616 1611 1610 +3 495 783 2531 +3 1470 2621 146 +3 2624 145 895 +3 372 1919 1266 +3 1226 982 182 +3 383 236 142 +3 1022 1259 441 +3 1266 1268 1275 +3 897 1938 1190 +3 380 236 382 +3 836 834 414 +3 752 750 751 +3 138 751 750 +3 2644 436 1669 +3 786 1531 1505 +3 2529 2532 1542 +3 817 506 474 +3 777 2418 2419 +3 1181 837 415 +3 2642 1403 2638 +3 436 2642 2638 +3 1213 1216 1214 +3 393 1192 609 +3 237 547 548 +3 1203 526 1204 +3 1411 1441 2562 +3 1441 189 2562 +3 1746 1762 2670 +3 1079 1075 653 +3 1677 2215 2214 +3 495 494 1 +3 1232 732 1231 +3 523 524 702 +3 621 617 555 +3 392 586 583 +3 2077 1185 693 +3 498 494 495 +3 613 1201 1202 +3 822 511 795 +3 292 2012 293 +3 214 342 87 +3 850 851 541 +3 851 850 539 +3 2694 1057 1126 +3 211 544 545 +3 121 476 119 +3 781 617 410 +3 1313 607 1314 +3 418 615 621 +3 1487 2665 525 +3 409 950 951 +3 954 2634 2630 +3 1630 1439 1629 +3 616 2418 1171 +3 2597 705 2595 +3 890 768 884 +3 1394 2547 1668 +3 2255 2256 427 +3 1341 1335 1334 +3 524 525 1348 +3 453 435 452 +3 1672 1673 1554 +3 1671 1672 1554 +3 1849 845 1850 +3 1255 1253 453 +3 400 1316 1614 +3 421 2199 1522 +3 2199 421 1493 +3 665 663 668 +3 1438 479 478 +3 1418 1630 1629 +3 619 909 409 +3 841 2606 829 +3 452 1599 451 +3 460 745 744 +3 464 1403 2642 +3 732 1018 730 +3 906 2000 140 +3 1213 521 1216 +3 837 953 415 +3 407 808 1141 +3 736 737 735 +3 447 444 445 +3 2656 533 2651 +3 573 1220 1218 +3 458 2641 191 +3 595 2590 2589 +3 1141 1143 586 +3 624 1385 1386 +3 566 177 702 +3 1383 1384 648 +3 1767 1487 239 +3 1086 603 623 +3 1744 1217 520 +3 459 458 191 +3 1474 558 557 +3 191 457 454 +3 698 578 701 +3 670 673 633 +3 1019 1342 477 +3 2647 177 2646 +3 459 178 458 +3 608 1351 1350 +3 622 621 555 +3 2271 1590 2270 +3 1599 1429 385 +3 2652 534 2651 +3 745 178 459 +3 477 730 1018 +3 980 1512 1514 +3 528 531 529 +3 775 608 1350 +3 2532 2529 2530 +3 1432 482 148 +3 564 562 563 +3 745 459 461 +3 411 813 831 +3 740 743 461 +3 563 531 564 +3 603 660 1776 +3 1738 1739 240 +3 831 832 411 +3 419 795 511 +3 1423 1630 1418 +3 2255 427 2258 +3 760 2077 588 +3 622 555 1482 +3 474 473 389 +3 814 474 389 +3 1495 1492 1497 +3 1531 1490 788 +3 548 46 549 +3 697 2595 2594 +3 494 498 515 +3 787 1531 1521 +3 1209 571 1211 +3 1557 1556 1540 +3 2661 846 240 +3 1988 1973 1987 +3 123 128 257 +3 128 123 962 +3 1694 1695 579 +3 547 46 548 +3 273 2667 64 +3 1747 1749 2680 +3 1749 1750 2680 +3 500 503 497 +3 706 1609 578 +3 1532 1558 1556 +3 502 495 512 +3 2187 2188 391 +3 804 2192 2190 +3 815 474 814 +3 1558 1534 504 +3 1704 324 1705 +3 1499 1500 1494 +3 869 1049 1048 +3 1768 2678 2677 +3 531 186 446 +3 600 1066 718 +3 2590 650 684 +3 1482 556 1481 +3 1750 517 568 +3 2407 1695 398 +3 2673 2675 2672 +3 239 1741 1767 +3 1741 1742 1767 +3 750 749 138 +3 1 494 848 +3 1067 624 1386 +3 1068 624 1067 +3 741 740 461 +3 800 396 803 +3 1083 1081 1082 +3 401 1083 1082 +3 1017 456 1018 +3 851 537 541 +3 537 530 541 +3 808 807 174 +3 726 559 560 +3 1344 559 726 +3 728 746 565 +3 746 743 565 +3 1331 561 1343 +3 1330 1331 1343 +3 453 1253 54 +3 1195 2420 425 +3 814 2193 815 +3 238 527 533 +3 241 1222 1213 +3 1551 496 935 +3 50 734 742 +3 732 721 1231 +3 537 536 530 +3 536 537 30 +3 898 1939 897 +3 222 538 852 +3 538 537 851 +3 712 1589 3 +3 211 545 547 +3 542 540 538 +3 222 542 538 +3 2390 2389 1648 +3 542 543 544 +3 222 543 542 +3 1160 110 2015 +3 211 542 544 +3 942 943 183 +3 546 545 544 +3 2673 2672 2674 +3 216 914 917 +3 173 921 922 +3 852 539 853 +3 852 851 539 +3 46 202 549 +3 1078 95 659 +3 173 539 550 +3 149 953 837 +3 1474 557 1476 +3 739 50 742 +3 2674 1678 2676 +3 558 559 450 +3 179 1478 1477 +3 1476 557 179 +3 2499 150 2197 +3 662 635 690 +3 568 1746 2679 +3 724 748 477 +3 702 177 2647 +3 882 879 762 +3 177 562 564 +3 401 1319 584 +3 553 1485 1478 +3 1658 1659 1210 +3 739 742 731 +3 722 1232 733 +3 1367 766 1368 +3 1354 766 1367 +3 1336 563 562 +3 449 1336 562 +3 704 1063 600 +3 704 629 1063 +3 1073 653 1075 +3 581 1611 1612 +3 702 2647 523 +3 1319 401 1082 +3 1145 1083 401 +3 595 649 2590 +3 2561 2560 574 +3 770 608 911 +3 608 770 769 +3 911 619 912 +3 1874 1873 754 +3 677 694 602 +3 660 643 642 +3 729 721 730 +3 830 487 828 +3 674 666 633 +3 615 614 1179 +3 614 615 418 +3 841 487 506 +3 694 677 632 +3 563 710 186 +3 1067 592 1068 +3 1793 107 57 +3 811 408 810 +3 633 669 670 +3 2291 2290 1200 +3 897 117 898 +3 1203 570 1202 +3 655 676 672 +3 2578 1789 593 +3 409 618 619 +3 2663 2662 1204 +3 646 1633 888 +3 617 0 618 +3 677 675 632 +3 671 655 672 +3 595 2589 2591 +3 1775 599 1774 +3 695 707 581 +3 707 695 1093 +3 394 795 825 +3 1358 1365 1357 +3 1364 1365 1358 +3 408 2413 824 +3 1314 607 606 +3 1148 613 1220 +3 2126 2125 1041 +3 0 912 618 +3 2589 2590 684 +3 2597 2596 577 +3 730 721 732 +3 2662 1208 2666 +3 1339 451 1338 +3 2293 1206 1201 +3 842 2601 830 +3 2272 712 1594 +3 1148 1147 613 +3 2294 2286 1198 +3 2222 2223 585 +3 612 1485 553 +3 554 1485 1484 +3 741 50 740 +3 1142 1141 586 +3 1178 1179 616 +3 1179 1178 615 +3 2471 2470 1595 +3 617 618 410 +3 1367 1368 767 +3 404 1349 1313 +3 1352 1349 404 +3 145 2093 2088 +3 1346 450 1345 +3 1438 2090 354 +3 137 378 1162 +3 781 555 617 +3 667 690 635 +3 665 668 669 +3 2678 1747 2679 +3 1066 719 718 +3 651 1184 1185 +3 634 675 677 +3 1655 1656 657 +3 810 389 813 +3 668 664 655 +3 664 676 655 +3 2292 1192 610 +3 604 643 660 +3 662 592 663 +3 635 663 665 +3 708 1093 1092 +3 766 1354 1351 +3 755 1873 1874 +3 594 1083 1084 +3 1938 897 1939 +3 1180 1181 415 +3 705 578 698 +3 634 677 682 +3 669 668 655 +3 666 667 635 +3 633 666 665 +3 666 635 665 +3 634 667 666 +3 1868 1870 597 +3 813 411 810 +3 690 625 662 +3 1079 1074 1075 +3 633 665 669 +3 663 592 664 +3 1609 1610 707 +3 881 645 878 +3 1656 704 657 +3 634 682 667 +3 145 358 2093 +3 1857 1856 892 +3 703 657 704 +3 728 565 731 +3 718 719 639 +3 603 1086 1078 +3 1345 450 1344 +3 2101 679 1473 +3 854 543 222 +3 714 1596 2470 +3 1748 1765 2675 +3 744 743 560 +3 878 691 879 +3 1130 636 1129 +3 486 826 2605 +3 1517 1506 1533 +3 962 961 251 +3 487 841 829 +3 1172 1173 1177 +3 1526 1528 790 +3 2472 2467 1597 +3 1694 1607 1958 +3 989 987 176 +3 856 221 855 +3 1635 221 856 +3 729 462 728 +3 462 727 728 +3 563 186 531 +3 356 2079 2078 +3 462 729 730 +3 1359 765 1361 +3 743 746 560 +3 728 731 729 +3 740 565 743 +3 565 740 739 +3 1548 513 1943 +3 875 2113 2114 +3 770 1173 769 +3 953 836 416 +3 50 739 740 +3 1230 733 1231 +3 748 730 477 +3 900 364 137 +3 462 730 748 +3 748 725 747 +3 462 748 747 +3 749 364 138 +3 1871 1872 755 +3 1382 2591 1385 +3 572 802 94 +3 878 759 691 +3 1411 2426 1131 +3 884 883 762 +3 405 773 1364 +3 951 416 952 +3 587 1315 1316 +3 2586 178 2584 +3 137 1162 1163 +3 770 1177 1173 +3 619 911 908 +3 438 464 1397 +3 779 588 778 +3 762 890 884 +3 412 832 831 +3 806 810 408 +3 802 820 396 +3 1349 774 1313 +3 1017 1233 1234 +3 790 1527 1526 +3 2611 2610 863 +3 962 123 961 +3 700 1093 1094 +3 2266 1016 2265 +3 1526 420 1528 +3 285 2128 231 +3 1644 2125 2126 +3 353 2082 351 +3 392 799 800 +3 406 803 475 +3 951 953 416 +3 774 2422 1313 +3 1209 1208 243 +3 2187 2505 2186 +3 810 806 389 +3 1181 1180 811 +3 832 149 837 +3 475 818 816 +3 391 2504 2505 +3 1124 2415 950 +3 816 818 817 +3 815 816 474 +3 815 475 816 +3 802 395 820 +3 816 817 474 +3 1208 570 2666 +3 396 820 475 +3 394 822 795 +3 2185 826 794 +3 828 391 484 +3 2606 486 2605 +3 795 826 825 +3 953 950 415 +3 950 953 951 +3 2077 692 588 +3 1181 811 411 +3 1892 2501 1119 +3 484 843 842 +3 1853 1852 846 +3 539 850 550 +3 16 2533 1562 +3 1045 2109 2108 +3 1555 2697 2698 +3 853 222 852 +3 975 864 1105 +3 2143 2138 2683 +3 238 533 2656 +3 2244 2245 862 +3 2119 2115 1043 +3 1135 1168 654 +3 870 1052 1032 +3 1995 1994 933 +3 2083 2094 142 +3 1164 44 359 +3 872 2245 2695 +3 2114 2113 2116 +3 1048 1049 1031 +3 911 912 770 +3 305 14 1140 +3 620 910 909 +3 2620 2619 300 +3 2295 2296 611 +3 691 759 1869 +3 1855 1856 1360 +3 1139 303 1140 +3 903 117 897 +3 753 117 903 +3 928 1735 1734 +3 751 753 903 +3 213 907 59 +3 908 909 619 +3 1126 867 1125 +3 77 336 1123 +3 914 216 913 +3 914 913 915 +3 998 995 948 +3 1385 1786 1386 +3 1707 1708 183 +3 1072 1121 1122 +3 961 960 251 +3 1463 1465 1464 +3 2633 2587 2632 +3 395 2691 819 +3 820 395 819 +3 2636 414 2633 +3 416 2635 954 +3 1005 470 1002 +3 288 1070 957 +3 71 130 131 +3 2172 1001 2171 +3 1999 338 2000 +3 1594 712 1595 +3 2349 2146 2350 +3 2146 2349 2147 +3 1223 2276 945 +3 2603 2141 2173 +3 2375 2254 2251 +3 124 1012 1013 +3 247 254 60 +3 470 1000 1002 +3 2140 1000 470 +3 2290 610 1199 +3 1985 990 1984 +3 123 904 961 +3 904 123 1012 +3 1204 2664 2663 +3 1239 1806 1807 +3 923 1649 1648 +3 1106 862 1107 +3 865 1106 1107 +3 2269 1590 2268 +3 1034 1035 1040 +3 2693 2692 1127 +3 1935 264 86 +3 1933 1935 86 +3 2056 1291 2057 +3 2319 2317 1264 +3 1373 2317 2319 +3 2144 2178 2163 +3 1287 1150 1282 +3 992 61 991 +3 1249 1824 1657 +3 2062 1292 228 +3 2365 886 2363 +3 1267 1266 1262 +3 372 1266 1267 +3 1579 1580 1151 +3 1579 468 1580 +3 2069 225 2070 +3 2460 1493 1495 +3 1368 891 767 +3 2021 203 2022 +3 2526 2529 2527 +3 2526 1544 2529 +3 978 977 976 +3 978 976 220 +3 919 424 917 +3 424 919 967 +3 2091 2094 2083 +3 2575 2094 2091 +3 967 919 219 +3 113 2011 2009 +3 2385 918 1945 +3 1945 216 2385 +3 216 917 2385 +3 57 1794 1793 +3 2117 2120 2118 +3 207 2030 213 +3 767 2207 597 +3 2207 767 880 +3 2034 972 971 +3 546 971 210 +3 334 1837 1836 +3 1327 2033 212 +3 973 545 210 +3 2028 2027 209 +3 1723 336 1722 +3 1325 212 1324 +3 866 1640 1637 +3 280 58 11 +3 58 280 1887 +3 1783 1784 218 +3 1784 976 218 +3 1780 1783 218 +3 995 1229 948 +3 1946 1945 1944 +3 2043 2045 2042 +3 2045 2043 220 +3 2047 975 968 +3 975 970 968 +3 2042 2045 968 +3 2045 2047 968 +3 2047 2045 2046 +3 1588 544 543 +3 1945 918 1944 +3 2045 220 2046 +3 1789 598 1788 +3 1737 1546 1736 +3 1550 1737 1736 +3 922 921 1946 +3 981 315 232 +3 302 2617 2017 +3 2617 299 2017 +3 2078 2079 2096 +3 1498 1494 789 +3 1499 1498 1492 +3 726 560 727 +3 2653 256 2654 +3 2598 696 2593 +3 696 2592 2593 +3 1510 1509 55 +3 1505 1509 1510 +3 1502 1500 1499 +3 347 1920 1947 +3 1492 1501 1499 +3 2199 2200 1522 +3 2200 2199 793 +3 673 654 1601 +3 1602 673 1601 +3 1496 421 980 +3 2197 150 2202 +3 2198 2197 2202 +3 2618 2614 2619 +3 2618 2616 2614 +3 22 297 298 +3 2581 694 632 +3 784 2581 632 +3 2524 1921 2522 +3 1921 1922 2522 +3 315 39 316 +3 315 981 39 +3 981 310 39 +3 1386 1786 598 +3 37 194 1697 +3 2001 2003 140 +3 1117 2167 1898 +3 986 987 96 +3 987 986 988 +3 1652 9 1650 +3 995 998 61 +3 66 1654 1651 +3 987 927 176 +3 927 987 34 +3 927 930 176 +3 297 2008 294 +3 442 1429 1430 +3 442 2668 1429 +3 194 993 992 +3 2107 1046 2108 +3 1645 1644 1042 +3 982 180 986 +3 180 982 422 +3 332 89 1137 +3 332 1461 89 +3 692 1183 2411 +3 1183 174 2411 +3 2011 2010 2009 +3 988 34 987 +3 1667 1060 1637 +3 927 925 930 +3 33 346 345 +3 33 997 346 +3 1027 1029 857 +3 1027 2449 1029 +3 1835 2565 2574 +3 2565 1834 2574 +3 1158 2374 2234 +3 990 984 985 +3 984 96 985 +3 143 1460 1461 +3 1462 143 1461 +3 1462 333 335 +3 731 742 1230 +3 38 1327 343 +3 924 923 1653 +3 1647 4 201 +3 1999 127 1583 +3 127 1585 1583 +3 919 917 914 +3 194 37 993 +3 1699 1704 1700 +3 1725 328 1728 +3 350 34 996 +3 326 350 996 +3 771 1176 1362 +3 1230 742 733 +3 1460 999 331 +3 2490 88 2494 +3 322 196 99 +3 993 994 995 +3 996 988 180 +3 997 996 180 +3 997 326 996 +3 2089 355 2090 +3 1711 1710 323 +3 997 180 422 +3 346 997 422 +3 33 326 997 +3 984 998 948 +3 350 99 196 +3 1026 861 1027 +3 2698 1674 1955 +3 2530 2531 1543 +3 957 291 1114 +3 1070 291 957 +3 1908 1907 1111 +3 2221 1319 2223 +3 1951 248 247 +3 248 67 247 +3 2150 1003 2152 +3 2149 2159 2160 +3 1888 1884 1885 +3 1888 112 1884 +3 1502 979 1503 +3 1507 1502 1503 +3 2155 2152 2153 +3 70 124 125 +3 1011 124 70 +3 1977 991 1991 +3 1990 1977 1991 +3 2141 1002 2135 +3 1911 1909 1912 +3 1914 349 1909 +3 2136 958 2137 +3 77 1388 260 +3 41 1949 1948 +3 1011 904 1012 +3 122 904 1011 +3 70 122 1011 +3 349 1111 2162 +3 2158 2149 2153 +3 2158 2153 1003 +3 2593 697 2594 +3 141 2002 2005 +3 2270 2269 1589 +3 2270 1590 2269 +3 1007 2162 2157 +3 2248 1314 1315 +3 404 1314 2248 +3 703 704 680 +3 2250 1154 1571 +3 828 487 2604 +3 487 829 2604 +3 286 1009 1008 +3 1007 2155 2153 +3 1010 2140 470 +3 2154 1010 470 +3 2486 166 2485 +3 2150 2151 1005 +3 2152 2151 2150 +3 2311 2310 2312 +3 1845 1846 1844 +3 102 40 107 +3 2336 1276 53 +3 1276 2336 2332 +3 982 2103 983 +3 2025 2021 2022 +3 2025 207 2021 +3 307 309 1015 +3 752 307 1015 +3 307 752 14 +3 1816 1817 1247 +3 2287 1197 2288 +3 734 737 1235 +3 737 734 735 +3 1017 1018 732 +3 735 734 50 +3 50 741 735 +3 452 1255 453 +3 1330 1343 726 +3 477 1018 1019 +3 735 741 738 +3 455 735 738 +3 1809 1808 192 +3 1808 1809 1239 +3 1661 1659 1488 +3 1022 440 188 +3 1253 1252 1021 +3 451 448 1255 +3 925 928 1971 +3 928 929 1971 +3 2004 2005 2002 +3 2005 2004 1464 +3 335 1466 1465 +3 2626 1646 1641 +3 1640 2626 1641 +3 435 453 1022 +3 188 435 1022 +3 457 464 438 +3 699 1120 1090 +3 1023 839 840 +3 1090 1120 838 +3 1894 2503 1892 +3 2609 2326 370 +3 2326 2609 2328 +3 1495 1493 1496 +3 2462 2463 1170 +3 2201 793 2184 +3 1073 1122 653 +3 688 2265 2264 +3 701 839 1023 +3 341 1715 1716 +3 1715 340 1716 +3 1160 319 110 +3 189 2564 2562 +3 2014 2013 2015 +3 2028 93 916 +3 2027 2026 2031 +3 2026 91 2031 +3 1228 1227 182 +3 1646 2127 1642 +3 1045 2117 2116 +3 1644 2126 2127 +3 2126 1041 2127 +3 2434 2442 1038 +3 189 2519 2520 +3 376 136 2699 +3 871 1030 1029 +3 1678 2214 2279 +3 2278 1678 2279 +3 2107 1054 2106 +3 1054 2112 2106 +3 1233 732 1232 +3 1783 1780 1782 +3 496 1547 500 +3 2264 2265 711 +3 1589 2264 711 +3 381 1162 378 +3 1030 870 1032 +3 1030 1031 870 +3 1235 722 734 +3 858 1027 857 +3 1033 858 857 +3 1032 1033 857 +3 1887 2424 58 +3 858 1026 1027 +3 1278 2645 1457 +3 1769 1279 1267 +3 366 1769 1267 +3 934 1962 1970 +3 1641 1642 1040 +3 1393 1400 2547 +3 1400 1395 2547 +3 2110 1054 2109 +3 1034 868 1035 +3 28 1568 1566 +3 1798 28 1566 +3 1974 1993 1992 +3 2110 2111 2112 +3 2122 2121 1047 +3 2121 2122 876 +3 1092 700 2436 +3 1166 601 1167 +3 1166 1062 601 +3 968 424 967 +3 655 671 670 +3 785 601 1062 +3 628 785 1062 +3 656 2102 1016 +3 2102 2267 1016 +3 424 968 970 +3 1056 2104 2695 +3 865 1102 1104 +3 1106 865 1104 +3 35 1977 1976 +3 1977 197 1976 +3 2081 355 2080 +3 330 1724 1725 +3 1963 1981 1980 +3 1981 1964 1980 +3 1044 2120 2117 +3 1043 2115 2114 +3 1045 1046 869 +3 1802 1727 261 +3 870 1050 1052 +3 1683 155 1682 +3 2443 2442 1037 +3 2656 2651 534 +3 1673 1672 1553 +3 613 2291 1200 +3 237 540 211 +3 1044 869 1048 +3 2120 2121 876 +3 1047 1048 1031 +3 1676 1675 569 +3 2039 2038 964 +3 1649 31 1648 +3 2447 1028 2448 +3 1028 2449 2448 +3 2442 2434 1058 +3 2434 2435 1058 +3 1030 871 1031 +3 1031 1049 870 +3 1049 1050 870 +3 1049 1053 1050 +3 1052 860 1032 +3 1029 1030 857 +3 1030 1032 857 +3 1051 860 1052 +3 1046 2244 877 +3 2244 1046 873 +3 1916 1413 2425 +3 1053 1049 869 +3 1674 505 2217 +3 1549 1674 2217 +3 1782 860 1051 +3 1756 1758 1757 +3 1053 877 1050 +3 1965 1966 1982 +3 1051 1050 877 +3 2143 1008 2142 +3 2044 966 964 +3 2040 2041 967 +3 2040 966 2041 +3 2543 2541 2533 +3 2543 2532 2541 +3 2116 1043 2114 +3 2111 2110 875 +3 2569 2568 9 +3 1974 1987 1986 +3 1957 2206 2207 +3 880 1957 2207 +3 1001 2134 2136 +3 670 669 655 +3 937 1928 1925 +3 198 1835 195 +3 2694 872 2695 +3 1103 861 1026 +3 920 1103 1026 +3 2440 2442 1058 +3 637 1168 1167 +3 1168 638 1167 +3 2173 2141 2172 +3 2695 2104 1057 +3 2104 867 1057 +3 239 525 524 +3 1487 525 239 +3 219 2037 2039 +3 2037 2038 2039 +3 1984 990 985 +3 2048 2034 971 +3 2489 1710 1713 +3 2114 2115 875 +3 1962 1995 933 +3 934 1995 1962 +3 1652 1654 66 +3 628 1062 1063 +3 1064 628 1063 +3 664 1064 629 +3 1064 1063 629 +3 592 1064 664 +3 1088 2402 2400 +3 1167 638 1166 +3 1063 1065 600 +3 1063 1062 1065 +3 1167 632 637 +3 601 632 1167 +3 1883 1881 1861 +3 1877 1876 755 +3 1064 592 1067 +3 1065 1062 1166 +3 468 1581 1580 +3 1581 224 1580 +3 1064 1067 628 +3 2341 270 2342 +3 662 661 1068 +3 661 662 625 +3 2074 2075 223 +3 102 103 40 +3 709 1072 2514 +3 2513 709 2514 +3 609 398 580 +3 398 609 1147 +3 1073 1075 1071 +3 670 654 673 +3 1081 594 1075 +3 1112 1733 1113 +3 290 1112 1113 +3 650 1080 1079 +3 684 650 1079 +3 653 1792 1791 +3 1074 1079 1080 +3 1072 1122 1073 +3 1091 1090 709 +3 708 707 1093 +3 2223 2222 2221 +3 1091 699 1090 +3 581 1960 695 +3 1960 581 1613 +3 1084 1077 594 +3 1077 1084 95 +3 590 1084 1083 +3 590 1085 1084 +3 1075 1074 1081 +3 1176 1171 405 +3 1860 1387 642 +3 1860 1875 1387 +3 687 2397 1099 +3 1073 1071 2514 +3 1790 1791 685 +3 173 1101 539 +3 1088 1087 2402 +3 1096 596 1088 +3 687 1096 1088 +3 1498 1497 1492 +3 591 1095 1096 +3 1074 1082 1081 +3 2495 324 1701 +3 594 1077 1076 +3 1912 1909 1109 +3 423 652 1085 +3 1076 1077 596 +3 1077 1078 596 +3 2365 2364 754 +3 2364 2365 2363 +3 403 2364 2363 +3 757 650 756 +3 757 1080 650 +3 48 313 274 +3 1146 1085 590 +3 2514 1072 1073 +3 2513 2514 1071 +3 1082 1074 1665 +3 1143 1145 401 +3 1143 589 1145 +3 1609 708 578 +3 708 2488 578 +3 588 779 1323 +3 1143 1144 586 +3 1144 401 584 +3 1084 1085 95 +3 1085 652 95 +3 652 659 95 +3 1788 598 1787 +3 2240 2230 2307 +3 2235 2240 2307 +3 1496 979 1563 +3 959 1121 1098 +3 1200 1201 613 +3 1090 838 1072 +3 1088 596 1087 +3 596 1086 1087 +3 2403 1087 2404 +3 1100 2395 1119 +3 2392 2395 1100 +3 398 2406 2407 +3 2406 398 1148 +3 2009 2010 26 +3 791 2186 2181 +3 596 1078 1086 +3 600 718 797 +3 718 717 797 +3 2066 2063 2064 +3 2400 2402 2401 +3 686 2400 2401 +3 2402 1087 2403 +3 2401 2402 2403 +3 623 2404 1086 +3 685 1089 686 +3 1788 686 1789 +3 1096 1076 596 +3 1123 331 337 +3 331 25 337 +3 703 683 1473 +3 680 683 703 +3 699 1091 1092 +3 959 1097 1089 +3 1075 1076 1095 +3 1076 1075 594 +3 2491 1715 341 +3 1071 1095 591 +3 1071 1075 1095 +3 591 1096 1099 +3 2487 2488 708 +3 838 1121 1072 +3 1095 1076 1096 +3 1429 1599 1430 +3 1728 328 1729 +3 248 1951 2688 +3 253 248 2688 +3 1597 1598 639 +3 1597 717 1598 +3 922 1101 173 +3 1791 1792 685 +3 1122 1121 959 +3 674 1602 1603 +3 1180 812 811 +3 1472 2231 2236 +3 2237 1472 2236 +3 2642 2643 1402 +3 853 539 1101 +3 855 853 1101 +3 855 854 853 +3 855 1101 922 +3 855 922 856 +3 591 2393 2394 +3 1099 1096 687 +3 2503 1023 2501 +3 1639 1036 867 +3 1104 1103 5 +3 1105 1104 5 +3 2226 2439 2435 +3 2226 2438 2439 +3 2439 1058 2435 +3 1640 1035 1667 +3 2309 369 1444 +3 1963 933 1981 +3 518 1759 1753 +3 1782 1051 863 +3 1783 1782 863 +3 1577 1576 467 +3 1576 1577 2612 +3 1151 2612 1577 +3 1105 864 1106 +3 1104 1105 1106 +3 1027 2448 2449 +3 1274 2211 1664 +3 2211 1274 2212 +3 1793 8 107 +3 1905 1904 1114 +3 2134 2133 287 +3 1000 2133 2134 +3 2173 2174 2138 +3 2175 2173 2138 +3 88 2490 2491 +3 185 446 1836 +3 1171 777 405 +3 285 231 284 +3 1802 1721 1714 +3 116 1970 1972 +3 1970 1962 1972 +3 1903 1912 1109 +3 1801 1800 1798 +3 617 621 615 +3 2685 1001 2137 +3 796 1493 2460 +3 2159 2149 2158 +3 1113 1116 290 +3 2358 1187 1186 +3 1490 2179 1494 +3 8 102 107 +3 1115 1902 1904 +3 1903 1902 1115 +3 1004 2145 2144 +3 1113 472 1582 +3 1110 1905 1906 +3 1901 1900 1117 +3 1899 289 1108 +3 879 1956 762 +3 1904 1913 1115 +3 1414 1413 1915 +3 1005 2151 470 +3 893 2624 2625 +3 680 704 797 +3 2191 2190 2192 +3 672 1655 678 +3 636 672 678 +3 1494 1498 1499 +3 2471 1595 3 +3 2395 838 1119 +3 909 910 1124 +3 909 1124 409 +3 950 409 1124 +3 807 824 174 +3 824 2410 174 +3 2415 2414 780 +3 2415 1124 2414 +3 842 843 2416 +3 2294 2295 2299 +3 1226 182 1225 +3 182 1227 1225 +3 1066 638 719 +3 638 1130 719 +3 2269 2268 688 +3 719 1129 1128 +3 1129 719 1130 +3 360 382 1164 +3 1851 390 1850 +3 430 147 431 +3 1226 181 422 +3 2265 2267 711 +3 2267 2265 1016 +3 1128 656 1016 +3 1128 1129 656 +3 2641 457 191 +3 1133 2 353 +3 458 2587 190 +3 533 2650 2651 +3 481 482 1431 +3 481 388 482 +3 970 2386 2384 +3 2386 918 2384 +3 2090 1840 354 +3 1409 1669 436 +3 1885 1884 13 +3 354 491 1422 +3 345 1728 1729 +3 328 1726 339 +3 1815 192 1813 +3 1814 1815 1813 +3 1824 1821 1657 +3 1388 1123 337 +3 153 365 940 +3 365 1260 940 +3 1766 522 1742 +3 2621 2615 2620 +3 362 2621 2620 +3 895 2620 300 +3 94 802 801 +3 1191 111 1139 +3 630 1773 1772 +3 1705 994 1704 +3 1486 1205 1487 +3 520 1486 1487 +3 712 2270 1589 +3 579 2408 2405 +3 579 2407 2408 +3 111 303 1139 +3 302 303 2617 +3 111 1191 902 +3 1467 2084 142 +3 2085 356 2086 +3 303 305 1140 +3 152 305 303 +3 407 807 808 +3 2410 2412 2409 +3 910 2410 2409 +3 590 1145 1146 +3 589 1146 1145 +3 805 407 2190 +3 1145 590 1083 +3 591 2394 1071 +3 2393 1100 2394 +3 1527 2180 1490 +3 807 407 806 +3 806 407 805 +3 2224 2219 2221 +3 883 882 762 +3 1146 589 809 +3 589 808 809 +3 2094 384 383 +3 142 2094 383 +3 1194 607 1195 +3 2451 1744 520 +3 2649 2648 256 +3 56 2216 1677 +3 468 2132 1581 +3 226 2061 2060 +3 1577 1578 1579 +3 467 1578 1577 +3 313 312 232 +3 312 311 232 +3 1303 1302 230 +3 275 1303 1290 +3 1285 2355 2357 +3 48 371 312 +3 468 1579 1578 +3 2329 2330 161 +3 2333 2329 161 +3 224 1572 1152 +3 320 2015 2013 +3 1160 2015 320 +3 2210 469 2209 +3 1575 1151 1152 +3 1572 1571 1152 +3 1080 1665 1074 +3 2212 1274 1280 +3 1274 227 1280 +3 1580 224 1152 +3 1303 230 1290 +3 1299 1292 2061 +3 1270 1281 1282 +3 1281 1287 1282 +3 1662 1663 1272 +3 1663 1662 1274 +3 640 658 1772 +3 1375 658 640 +3 1272 1268 1624 +3 1271 1622 1623 +3 1153 1628 1285 +3 1284 1620 1621 +3 1284 1270 1282 +3 227 1281 1280 +3 227 1286 1281 +3 1919 1268 1266 +3 2289 2290 2288 +3 2240 2374 2373 +3 2374 2240 2235 +3 1962 2308 1972 +3 365 153 311 +3 2314 365 311 +3 369 2310 2311 +3 469 2210 1116 +3 1900 2246 2167 +3 2166 2246 1899 +3 2246 2166 2167 +3 1358 1359 772 +3 1163 1164 359 +3 360 1164 1163 +3 2155 2156 1006 +3 276 6 278 +3 276 1165 6 +3 442 1428 2668 +3 267 97 273 +3 818 820 819 +3 1427 1429 2668 +3 1429 1427 1426 +3 1002 2176 2142 +3 2108 1054 2107 +3 1868 2207 2206 +3 2118 1043 2690 +3 717 718 1598 +3 654 1168 1601 +3 1596 2472 1597 +3 2400 2399 1088 +3 2400 1089 2399 +3 1492 1563 1501 +3 425 2419 1179 +3 614 425 1179 +3 1193 2298 1196 +3 2298 1193 1194 +3 1178 0 615 +3 0 617 615 +3 1177 616 1172 +3 738 191 455 +3 1246 1250 1241 +3 1173 771 1174 +3 770 912 1178 +3 616 1177 1178 +3 459 191 738 +3 643 1860 642 +3 1860 643 1861 +3 768 1360 885 +3 626 1380 1859 +3 1875 626 1859 +3 1364 772 405 +3 1176 405 772 +3 1362 1176 772 +3 1409 2517 1669 +3 2515 1407 1406 +3 709 1090 1072 +3 1173 1172 771 +3 2418 616 1179 +3 2419 2418 1179 +3 2420 2421 777 +3 776 777 2421 +3 777 776 405 +3 98 271 283 +3 271 2341 283 +3 423 1184 652 +3 38 2033 1327 +3 491 490 1419 +3 1189 651 1188 +3 796 2460 1491 +3 809 1182 423 +3 1146 809 423 +3 1776 660 642 +3 809 1183 1182 +3 809 174 1183 +3 808 174 809 +3 1634 1636 858 +3 1186 651 1185 +3 2359 1186 2361 +3 881 2365 645 +3 644 1862 2339 +3 652 1184 1189 +3 2368 887 2358 +3 651 1186 1187 +3 269 2344 2343 +3 1190 903 897 +3 270 2340 97 +3 2359 2358 1186 +3 2368 2358 2359 +3 1188 2339 604 +3 651 1187 1188 +3 304 903 1190 +3 903 304 751 +3 651 1189 1184 +3 1885 108 1888 +3 1189 659 652 +3 604 659 1189 +3 659 604 660 +3 2381 1024 2383 +3 1539 2512 1556 +3 2512 1532 1556 +3 644 1863 1862 +3 1139 1140 304 +3 1190 1139 304 +3 2520 2564 189 +3 1442 2564 2520 +3 321 902 1191 +3 1191 1139 1190 +3 1193 393 1194 +3 912 0 1178 +3 2601 483 2500 +3 612 553 399 +3 1203 1202 553 +3 526 1203 553 +3 1202 399 553 +3 2160 349 2162 +3 2160 1910 349 +3 574 2405 2406 +3 573 574 2406 +3 802 396 801 +3 1192 393 1193 +3 2420 2419 425 +3 910 620 2411 +3 2561 574 94 +3 1600 716 717 +3 716 1600 2464 +3 1192 1193 610 +3 1193 1196 610 +3 613 2292 2291 +3 613 1147 2292 +3 525 2665 1480 +3 1206 1221 1207 +3 1221 2300 1207 +3 2191 406 2193 +3 83 1679 1295 +3 1293 83 1295 +3 1695 1694 576 +3 1613 576 1960 +3 1485 554 1478 +3 1218 1219 573 +3 1219 94 573 +3 610 1196 1199 +3 170 1684 262 +3 1348 525 1480 +3 1207 399 1206 +3 2692 2693 821 +3 2170 2145 2681 +3 2145 2170 2169 +3 567 1214 1216 +3 1214 567 517 +3 2664 1204 526 +3 1216 1661 1217 +3 1216 521 1661 +3 206 907 154 +3 1209 1210 571 +3 2300 1221 2299 +3 1201 399 1202 +3 1201 1206 399 +3 610 2291 2292 +3 2293 1200 2289 +3 1200 2290 2289 +3 398 1695 580 +3 498 1756 1755 +3 1920 1922 1921 +3 395 572 1127 +3 572 1222 1127 +3 2294 2299 1221 +3 1607 1694 579 +3 517 1215 1214 +3 494 515 1760 +3 2290 1199 2288 +3 241 1214 1215 +3 1205 2664 2665 +3 2664 526 2665 +3 276 2667 1165 +3 516 1753 1754 +3 1740 519 1739 +3 1215 822 241 +3 822 1215 497 +3 1972 2308 932 +3 241 1213 1214 +3 779 1320 1323 +3 56 1756 1757 +3 2556 2558 2553 +3 2556 2559 2558 +3 232 311 981 +3 1754 1753 1759 +3 1761 1752 1762 +3 567 1217 1744 +3 1220 613 570 +3 613 1202 570 +3 1744 2451 1751 +3 571 1218 1211 +3 1196 2298 2296 +3 1211 1220 570 +3 1220 1211 1218 +3 1208 1211 570 +3 418 621 622 +3 1484 418 622 +3 1147 1192 2292 +3 2389 1653 1648 +3 2235 2304 1169 +3 1663 1664 374 +3 1216 1217 567 +3 2301 612 1207 +3 2300 2301 1207 +3 1478 554 1481 +3 1233 722 1234 +3 946 943 1223 +3 183 943 946 +3 36 1229 995 +3 994 36 995 +3 871 1034 1040 +3 1223 1224 946 +3 1223 181 1224 +3 1120 699 1892 +3 737 736 1237 +3 1804 737 1237 +3 353 2 1840 +3 1226 1224 181 +3 1226 1225 1224 +3 1858 766 1351 +3 769 1858 1351 +3 920 1026 1025 +3 2127 1041 1642 +3 1229 36 947 +3 856 922 217 +3 922 1946 217 +3 921 216 1945 +3 1785 946 1227 +3 942 184 944 +3 1993 1997 1998 +3 1997 1993 1975 +3 2659 534 237 +3 1804 2430 2431 +3 1233 1017 732 +3 18 2567 2569 +3 1812 1807 1811 +3 1807 1812 1808 +3 1232 722 1233 +3 1240 1814 736 +3 1247 192 1815 +3 1359 1358 885 +3 1814 1246 1815 +3 1019 1810 1020 +3 456 1806 1239 +3 1810 1239 1809 +3 736 455 1240 +3 734 722 733 +3 2325 2328 2327 +3 2324 2325 2327 +3 1813 192 1808 +3 1251 192 1247 +3 184 532 944 +3 944 532 49 +3 532 1837 49 +3 1234 1236 1017 +3 1807 1806 1805 +3 1240 1246 1814 +3 191 454 455 +3 456 1239 1810 +3 1247 1248 1021 +3 338 2001 2000 +3 110 2014 2015 +3 1585 1586 130 +3 69 1585 130 +3 446 90 334 +3 1810 1809 1020 +3 2547 1394 2546 +3 1261 1263 366 +3 906 1999 2000 +3 1999 906 127 +3 1251 1809 192 +3 454 1250 455 +3 2477 60 2476 +3 1249 1250 454 +3 454 457 1245 +3 1245 438 1244 +3 1803 2430 1236 +3 2430 1803 2431 +3 1240 455 1250 +3 1465 1463 335 +3 2360 2361 760 +3 1270 1284 1621 +3 1858 1857 892 +3 1466 187 352 +3 2499 2179 2180 +3 1250 1819 1241 +3 2257 2256 429 +3 1659 1660 1210 +3 1660 1212 1210 +3 1659 1658 1488 +3 448 1019 1254 +3 1858 1175 1857 +3 1259 1823 1258 +3 1021 1251 1247 +3 452 451 1255 +3 90 446 445 +3 446 186 445 +3 1252 1251 1021 +3 1251 1252 1020 +3 186 447 445 +3 1253 1256 54 +3 1020 1254 1019 +3 1020 1252 1254 +3 1252 1253 1254 +3 1254 1253 1255 +3 1242 1256 1248 +3 1457 2325 1278 +3 2325 1457 368 +3 1249 454 1828 +3 1827 1243 1828 +3 1360 765 1359 +3 1856 765 1360 +3 2689 1427 2668 +3 1428 2689 2668 +3 25 2001 338 +3 1259 1258 1829 +3 1488 1658 243 +3 1658 1209 243 +3 1426 385 1429 +3 1291 2059 2060 +3 2163 2168 2459 +3 2178 2168 2163 +3 2317 2322 2318 +3 140 74 905 +3 74 140 2003 +3 337 25 338 +3 517 567 568 +3 2523 249 2525 +3 1667 1035 1569 +3 1450 1448 368 +3 56 1757 2216 +3 1260 1263 1261 +3 1263 1260 365 +3 373 1260 1261 +3 432 1854 430 +3 1001 2135 2134 +3 350 1458 34 +3 1265 1769 1770 +3 2321 229 2320 +3 229 2319 2320 +3 1275 2336 53 +3 370 2608 2609 +3 1289 2056 2057 +3 1626 1286 227 +3 1307 98 284 +3 374 1275 1268 +3 1272 374 1268 +3 466 465 133 +3 1014 466 308 +3 1015 1014 308 +3 2335 1014 1015 +3 2609 2608 53 +3 2658 2657 2659 +3 548 2659 237 +3 552 534 2652 +3 2056 1289 1288 +3 1155 2056 1288 +3 1156 1284 1283 +3 1284 1282 1283 +3 1266 1275 53 +3 1262 1266 53 +3 1285 1156 2355 +3 311 153 310 +3 2074 17 1683 +3 2068 2069 1297 +3 2343 270 295 +3 1281 1270 1280 +3 2071 2074 2073 +3 374 1272 1663 +3 1624 1625 1272 +3 1624 1271 1625 +3 372 1918 1919 +3 423 1182 1184 +3 713 1592 639 +3 1128 713 639 +3 287 2133 2130 +3 2133 2131 2130 +3 1353 775 1352 +3 368 2326 2325 +3 1977 35 991 +3 369 1293 1312 +3 158 2049 2050 +3 226 2067 1299 +3 825 486 2607 +3 52 160 1447 +3 1298 52 1447 +3 1033 2371 1634 +3 1263 2320 366 +3 2320 1263 2321 +3 2655 2660 530 +3 1264 2317 2318 +3 1770 1264 1771 +3 1264 2318 1771 +3 1149 1300 1302 +3 1300 230 1302 +3 314 313 232 +3 230 1300 1288 +3 2060 2063 226 +3 1770 1771 1265 +3 2485 166 2474 +3 1155 2053 2055 +3 1155 2052 2053 +3 1150 1283 1282 +3 981 311 310 +3 1678 1677 2214 +3 1302 1304 467 +3 1150 1287 1288 +3 288 1329 2070 +3 2326 2328 2325 +3 1329 296 2070 +3 1293 228 1292 +3 83 1293 1292 +3 1576 1302 467 +3 48 1290 1306 +3 2221 1318 2224 +3 1318 2221 2222 +3 1111 1112 290 +3 1572 2250 1571 +3 1574 1301 1149 +3 1009 2160 2159 +3 370 2326 2333 +3 1113 1732 472 +3 1299 2061 226 +3 1273 1286 1626 +3 1572 224 1310 +3 1153 1572 1310 +3 472 1732 1731 +3 162 1445 1444 +3 2610 969 1784 +3 975 969 2610 +3 2063 2060 1294 +3 1308 1307 275 +3 1308 1290 274 +3 274 1290 48 +3 1308 275 1290 +3 2025 91 2026 +3 91 2025 2022 +3 2170 2685 2137 +3 1312 1295 1452 +3 368 1448 2329 +3 2326 368 2329 +3 160 52 159 +3 466 750 308 +3 1938 1940 321 +3 540 552 30 +3 552 2652 30 +3 2338 1188 1187 +3 1006 2152 2155 +3 2055 2056 1155 +3 2056 2055 1291 +3 1283 2352 2355 +3 366 1770 1769 +3 1150 1288 1301 +3 1301 1288 1300 +3 1301 1300 1149 +3 47 279 282 +3 371 48 1306 +3 229 2312 1373 +3 1579 1151 1577 +3 1304 1302 1303 +3 234 313 314 +3 282 272 234 +3 2059 1294 2060 +3 98 1307 1308 +3 1304 275 1305 +3 275 1304 1303 +3 1628 1273 1627 +3 1305 1307 284 +3 1307 1305 275 +3 1294 2065 2064 +3 2064 2072 1296 +3 2072 1731 1296 +3 1007 2157 2155 +3 2352 2357 2355 +3 2576 2575 2091 +3 2354 2353 1150 +3 963 1152 1571 +3 1297 2069 2071 +3 1571 1154 1570 +3 2250 1285 2357 +3 1309 2351 2353 +3 2681 2145 2682 +3 644 2339 2338 +3 1350 774 1349 +3 1350 764 774 +3 908 775 620 +3 909 908 620 +3 608 908 911 +3 584 1618 1619 +3 802 572 395 +3 2412 780 2409 +3 949 2413 812 +3 404 1313 1314 +3 779 778 404 +3 2210 1010 1116 +3 1353 620 775 +3 1113 469 1116 +3 1315 1314 606 +3 1039 1126 2432 +3 1039 2694 1126 +3 2314 2321 365 +3 2321 1263 365 +3 2033 916 212 +3 1961 2598 1693 +3 1316 1315 606 +3 779 2248 2249 +3 1061 1569 868 +3 2223 1665 585 +3 2439 2440 1058 +3 1317 584 2219 +3 2342 283 2341 +3 2344 283 2342 +3 2023 974 2022 +3 974 2023 202 +3 2219 2218 1317 +3 403 2359 2360 +3 2359 2361 2360 +3 2488 2487 839 +3 2338 2339 1188 +3 1787 1790 685 +3 1323 1320 1321 +3 758 1323 1321 +3 1769 2213 1279 +3 2315 1444 1445 +3 915 1324 916 +3 1324 915 215 +3 1700 1698 1699 +3 2164 1899 1108 +3 77 1123 1388 +3 1725 1728 330 +3 1728 1136 330 +3 323 322 1712 +3 295 1329 269 +3 296 1329 295 +3 1035 868 1569 +3 1507 1503 1508 +3 725 1331 1330 +3 1333 1331 725 +3 1331 1333 1332 +3 1332 561 1331 +3 1332 566 561 +3 566 1332 562 +3 1339 1337 723 +3 561 1344 1343 +3 1344 561 1345 +3 449 1332 1333 +3 1332 449 562 +3 2117 2118 2690 +3 1342 1341 724 +3 448 1339 723 +3 952 954 410 +3 505 2216 2217 +3 451 1339 448 +3 1334 1340 724 +3 447 186 710 +3 1338 447 710 +3 1340 748 724 +3 449 1335 1336 +3 1342 724 477 +3 1336 710 563 +3 1337 710 1336 +3 710 1337 1338 +3 743 744 461 +3 460 2585 745 +3 2642 1402 464 +3 1337 1336 1335 +3 1340 725 748 +3 2585 178 745 +3 2584 178 2585 +3 1333 725 1340 +3 1333 1340 1334 +3 385 1338 451 +3 1338 1337 1339 +3 723 1335 1341 +3 723 1341 1342 +3 723 1342 448 +3 738 461 459 +3 738 741 461 +3 448 1342 1019 +3 1343 1344 726 +3 450 1346 1347 +3 1346 524 1347 +3 778 1353 1352 +3 410 2630 781 +3 566 1345 561 +3 1003 2150 2147 +3 494 1760 847 +3 884 885 402 +3 418 1485 612 +3 519 1740 523 +3 566 1346 1345 +3 450 1347 557 +3 558 450 557 +3 460 744 560 +3 773 405 776 +3 1372 882 883 +3 1355 1356 764 +3 1387 1859 641 +3 1859 1380 641 +3 1354 763 1355 +3 1545 1943 513 +3 587 1316 2220 +3 1350 1351 764 +3 1351 1354 764 +3 908 608 775 +3 608 769 1351 +3 1876 1871 755 +3 764 1354 1355 +3 885 1358 1357 +3 889 1356 1355 +3 1356 889 402 +3 1357 1356 402 +3 885 1357 402 +3 1174 769 1173 +3 763 889 1355 +3 771 1362 1363 +3 1174 771 1363 +3 1363 1361 765 +3 1175 1363 765 +3 1175 1174 1363 +3 1359 1361 772 +3 769 1174 1175 +3 2123 876 2122 +3 2123 2124 876 +3 2231 1158 2232 +3 2228 2231 1472 +3 1362 772 1361 +3 1363 1362 1361 +3 778 1352 404 +3 764 1356 1366 +3 706 705 2554 +3 1618 584 1317 +3 1614 605 1611 +3 1701 322 323 +3 1356 1357 1365 +3 2248 1315 2249 +3 764 1366 774 +3 1366 773 774 +3 1319 1665 2223 +3 1366 1356 1365 +3 1364 773 1365 +3 773 1366 1365 +3 1353 2411 620 +3 767 597 1369 +3 1367 767 1369 +3 1371 761 1372 +3 761 882 1372 +3 597 1370 1369 +3 1369 1370 763 +3 1231 721 1230 +3 1370 1371 763 +3 693 1183 692 +3 597 888 1370 +3 1025 1636 217 +3 551 216 921 +3 1371 1372 889 +3 763 1371 889 +3 1942 883 884 +3 1374 625 690 +3 667 1374 690 +3 1374 667 658 +3 1863 627 1864 +3 627 1865 1864 +3 1890 292 293 +3 1375 625 1374 +3 658 1375 1374 +3 2442 2443 1038 +3 2443 2446 1038 +3 977 218 976 +3 1777 218 977 +3 661 1381 1068 +3 648 1380 1383 +3 642 1377 599 +3 1069 1733 1112 +3 626 1383 1380 +3 626 1882 1383 +3 640 1772 1773 +3 641 1379 1378 +3 641 1380 1379 +3 625 1378 661 +3 641 1378 1376 +3 1376 1378 1375 +3 1378 625 1375 +3 1376 1375 640 +3 648 1381 1379 +3 1380 648 1379 +3 1883 1880 1881 +3 1880 647 1881 +3 2579 2578 593 +3 2579 2581 2578 +3 1584 1585 69 +3 1729 33 345 +3 641 1376 1377 +3 1878 1877 1874 +3 1384 1878 649 +3 595 1384 649 +3 595 1382 1384 +3 1381 1382 624 +3 1068 1381 624 +3 598 1786 1787 +3 1386 785 628 +3 1386 598 785 +3 289 1899 2247 +3 1381 661 1379 +3 1859 1387 1875 +3 1381 648 1382 +3 626 1875 1861 +3 1875 1860 1861 +3 635 662 663 +3 1382 648 1384 +3 1634 859 1635 +3 859 1634 2371 +3 2597 697 2596 +3 92 1588 978 +3 1385 624 1382 +3 1387 641 1377 +3 1872 759 878 +3 1637 1640 1667 +3 199 2566 198 +3 126 260 1388 +3 259 1722 1720 +3 2072 472 1731 +3 472 2072 2065 +3 1465 352 75 +3 1466 352 1465 +3 1865 1871 1876 +3 1402 1401 1397 +3 1445 2645 1278 +3 2645 1445 1446 +3 2090 355 1840 +3 1410 1411 1131 +3 906 139 127 +3 835 834 1442 +3 305 152 306 +3 25 999 2002 +3 1406 439 2548 +3 2079 2080 355 +3 382 383 44 +3 1037 2447 1102 +3 1586 1585 127 +3 1779 859 1781 +3 1867 2208 1869 +3 627 1867 1869 +3 917 424 2384 +3 10 1391 2453 +3 1391 1390 2453 +3 380 74 236 +3 1392 1391 439 +3 1394 1406 2548 +3 2626 1640 866 +3 2341 2340 270 +3 2263 2257 2260 +3 147 429 2256 +3 147 430 429 +3 352 1133 351 +3 1162 360 1163 +3 236 383 382 +3 188 440 1392 +3 348 74 375 +3 750 133 749 +3 133 1832 749 +3 2004 999 143 +3 2002 999 2004 +3 1831 2379 440 +3 576 580 1695 +3 2080 2079 2085 +3 1407 1410 1131 +3 438 1397 1398 +3 1397 1396 1398 +3 2209 2140 1010 +3 1775 1776 599 +3 1401 437 1397 +3 1401 1400 437 +3 2642 436 2643 +3 2639 2638 1403 +3 363 364 1832 +3 2453 2454 10 +3 835 2520 1405 +3 1404 2638 2639 +3 355 2089 2079 +3 440 1022 1389 +3 464 1402 1397 +3 442 1430 435 +3 1397 437 1396 +3 2455 1896 1895 +3 1896 2455 700 +3 1775 630 623 +3 2082 2081 144 +3 2346 285 2345 +3 108 1885 1886 +3 1395 1669 1668 +3 597 1870 888 +3 1668 1669 1132 +3 2545 2548 1391 +3 1862 1863 1864 +3 711 2239 2233 +3 2239 711 2267 +3 1671 2696 1670 +3 1868 1867 646 +3 2208 1867 1868 +3 2641 464 457 +3 66 350 196 +3 350 66 1458 +3 132 73 2458 +3 1408 434 188 +3 1428 434 1440 +3 439 1407 1408 +3 2577 44 384 +3 264 265 1471 +3 265 266 1471 +3 1469 2251 2254 +3 1407 439 1406 +3 1416 488 1420 +3 188 1392 1408 +3 1131 434 1408 +3 2518 1409 2519 +3 2150 1005 2147 +3 2576 2085 357 +3 2577 2576 357 +3 2426 2425 433 +3 1926 1565 1566 +3 2562 2563 1411 +3 433 1443 1439 +3 1419 490 1417 +3 2 490 491 +3 1414 488 1416 +3 489 1414 1416 +3 2520 835 1442 +3 2564 2563 2562 +3 2564 1412 2563 +3 412 488 1415 +3 412 508 488 +3 1415 833 412 +3 412 833 832 +3 413 833 1415 +3 488 1414 1415 +3 1416 1417 489 +3 1417 1418 489 +3 443 1424 1134 +3 482 388 483 +3 923 1648 1653 +3 387 1416 1420 +3 2523 2525 252 +3 1441 2517 2518 +3 189 1441 2518 +3 490 1418 1417 +3 482 483 1851 +3 1417 387 1419 +3 1423 1424 1425 +3 1131 2426 1440 +3 1420 508 481 +3 508 1420 488 +3 508 388 481 +3 1416 387 1417 +3 479 1436 478 +3 1915 1413 1916 +3 1420 481 1421 +3 1423 1418 490 +3 387 1422 1419 +3 387 1421 1422 +3 2419 2420 777 +3 1425 386 1423 +3 1424 2 1134 +3 548 79 2659 +3 549 79 548 +3 1855 1360 768 +3 1425 1424 443 +3 1851 483 2417 +3 777 1171 2418 +3 1427 386 1425 +3 1426 1427 1425 +3 1428 442 434 +3 1421 1431 480 +3 1421 481 1431 +3 1426 443 444 +3 518 1753 1741 +3 1317 2218 2220 +3 2218 587 2220 +3 1440 1439 1428 +3 1131 1440 434 +3 1439 1440 433 +3 2691 823 819 +3 2669 1752 1763 +3 936 2671 2673 +3 1762 1752 2669 +3 1421 480 1422 +3 1431 1432 480 +3 1438 354 1437 +3 479 1438 1437 +3 482 1432 1431 +3 616 2508 1172 +3 1171 2508 616 +3 827 826 2185 +3 2605 826 827 +3 391 2505 2187 +3 1435 1436 479 +3 939 1933 2194 +3 2204 1414 489 +3 1530 2187 791 +3 1434 430 431 +3 432 430 1434 +3 1435 431 1436 +3 60 2477 1954 +3 2477 245 1954 +3 1434 1433 148 +3 1424 490 2 +3 254 1841 60 +3 414 834 835 +3 354 1422 480 +3 1437 354 480 +3 479 1437 1433 +3 2082 2091 2083 +3 473 831 813 +3 473 412 831 +3 473 507 412 +3 1277 2316 2309 +3 2117 2690 2116 +3 2690 1043 2116 +3 2090 478 2089 +3 1438 478 2090 +3 1632 886 761 +3 2614 300 2619 +3 490 1424 1423 +3 2563 2426 1411 +3 2426 2563 2425 +3 2425 2563 1412 +3 833 149 832 +3 413 834 833 +3 413 1442 834 +3 834 149 833 +3 1680 171 1681 +3 2340 1165 97 +3 1165 2340 271 +3 1298 1454 52 +3 2214 2215 2281 +3 1445 162 1446 +3 66 196 1652 +3 2310 1373 2312 +3 369 2309 2310 +3 1295 1453 1452 +3 1312 162 1444 +3 1444 369 1312 +3 1851 2417 390 +3 2337 1014 2335 +3 19 1847 1448 +3 2331 161 2330 +3 1447 1448 1450 +3 1447 160 1448 +3 2648 528 256 +3 2675 1765 56 +3 927 34 175 +3 34 1458 175 +3 2311 2312 371 +3 1451 1452 1453 +3 1451 162 1452 +3 1684 1682 155 +3 1685 1684 155 +3 1298 1453 1454 +3 1453 172 1454 +3 2655 2654 529 +3 2252 1470 146 +3 2252 2251 1470 +3 147 2256 2255 +3 1535 1513 509 +3 1470 1469 113 +3 219 2029 2037 +3 2651 2650 535 +3 2334 2337 2335 +3 1446 1449 1457 +3 172 1455 1454 +3 1455 172 1456 +3 1014 2331 466 +3 161 2331 1014 +3 1680 1456 172 +3 1456 1680 1681 +3 1449 1450 1457 +3 2652 535 30 +3 535 536 30 +3 2652 2651 535 +3 533 2649 2650 +3 2649 256 2650 +3 1462 1461 333 +3 1022 54 1259 +3 1462 335 1463 +3 143 1462 1463 +3 2255 2258 2254 +3 2258 1469 2254 +3 26 2007 2008 +3 140 905 906 +3 429 23 2257 +3 1467 1464 75 +3 90 1466 335 +3 233 151 849 +3 445 187 1466 +3 90 445 1466 +3 1022 453 54 +3 1464 1467 2005 +3 1467 141 2005 +3 2085 2079 356 +3 2257 2263 427 +3 2087 114 361 +3 768 885 884 +3 2243 2244 862 +3 2243 877 2244 +3 2271 2272 1591 +3 2611 862 1106 +3 460 560 559 +3 1475 1482 555 +3 1482 1475 556 +3 463 558 1474 +3 556 1474 1476 +3 1348 1480 179 +3 520 1217 1486 +3 2078 2097 114 +3 2629 2628 2583 +3 2630 2629 781 +3 2582 1475 2583 +3 1475 781 2583 +3 1409 2638 1404 +3 2519 1409 1404 +3 2585 463 2584 +3 553 1479 526 +3 1478 1479 553 +3 1478 179 1479 +3 1477 1481 556 +3 1478 1481 1477 +3 2628 463 2583 +3 2628 2584 463 +3 1694 1958 576 +3 576 1958 1959 +3 1219 571 572 +3 2632 417 2633 +3 2630 782 2629 +3 554 1483 1481 +3 2377 2376 844 +3 1754 498 1755 +3 1479 1480 526 +3 179 1480 1479 +3 527 2646 2648 +3 2646 528 2648 +3 533 527 2649 +3 727 746 728 +3 727 560 746 +3 622 1482 1483 +3 1483 1482 1481 +3 2078 2096 2097 +3 450 559 1344 +3 1204 2666 1203 +3 2200 419 1522 +3 294 2007 2006 +3 803 2192 804 +3 392 803 804 +3 268 267 2098 +3 483 388 2500 +3 388 506 2500 +3 1530 485 2187 +3 407 1142 2189 +3 407 1141 1142 +3 144 2081 2080 +3 784 1789 2578 +3 1414 2204 1413 +3 1523 1528 420 +3 789 1489 1491 +3 2633 1405 190 +3 1514 1511 55 +3 1511 1510 55 +3 2171 2681 2686 +3 1515 1510 1511 +3 1505 1510 1515 +3 2180 2179 1490 +3 2616 902 2614 +3 2449 1028 1029 +3 2274 1596 720 +3 1497 789 1491 +3 580 1613 1612 +3 1496 1493 421 +3 302 152 303 +3 2615 2619 2620 +3 2622 300 2613 +3 1161 1118 287 +3 2602 1118 1161 +3 1501 979 1502 +3 1499 1501 1502 +3 433 2425 1443 +3 2006 2007 293 +3 298 297 294 +3 788 1494 1500 +3 2466 1600 2467 +3 1524 1539 1557 +3 1541 1524 1557 +3 1948 252 2525 +3 420 1520 1519 +3 2510 2509 1537 +3 2509 2510 1536 +3 786 1505 1538 +3 701 1023 1894 +3 979 980 1503 +3 2008 2007 294 +3 2466 2465 1600 +3 2013 2006 320 +3 1500 1508 1504 +3 1508 1500 1507 +3 2006 2013 294 +3 1886 1891 108 +3 281 280 47 +3 1691 214 87 +3 1515 1517 1538 +3 1520 786 1518 +3 2595 1897 2594 +3 1531 788 1504 +3 1556 1558 1540 +3 1512 1513 510 +3 1521 1526 787 +3 1094 575 1896 +3 575 1094 1693 +3 1516 1517 1533 +3 1517 1516 1518 +3 1529 790 1528 +3 1591 2273 1592 +3 2273 720 1592 +3 495 1 1525 +3 1515 1506 1517 +3 674 675 634 +3 674 1603 675 +3 510 1506 1512 +3 1891 12 292 +3 292 12 281 +3 1509 1508 55 +3 1512 1511 1514 +3 1512 1506 1511 +3 1514 55 1503 +3 1508 1503 55 +3 795 419 794 +3 421 1513 980 +3 509 1522 419 +3 1526 1527 787 +3 1886 1887 12 +3 420 1521 1520 +3 131 132 134 +3 1513 1512 980 +3 1051 877 2243 +3 1503 980 1514 +3 1509 1504 1508 +3 1505 1504 1509 +3 840 839 2513 +3 1534 1533 510 +3 1506 1515 1511 +3 509 419 511 +3 1536 1534 1532 +3 1534 1536 1533 +3 1560 2535 16 +3 1525 1 1529 +3 495 1525 783 +3 1895 1897 698 +3 2272 2273 1591 +3 320 2012 109 +3 1521 420 1526 +3 1548 1549 513 +3 1538 1505 1515 +3 1159 23 78 +3 2512 2509 1532 +3 2512 1537 2509 +3 1520 1521 786 +3 1168 637 1601 +3 421 1522 1513 +3 1527 1490 787 +3 2203 792 2183 +3 1117 1900 2167 +3 509 1513 1522 +3 1518 786 1538 +3 2534 16 2535 +3 2230 2306 2307 +3 233 549 78 +3 1118 958 2136 +3 1523 1519 1524 +3 2394 2502 840 +3 496 2539 1547 +3 2539 496 1736 +3 491 1419 1422 +3 479 1433 1435 +3 791 2181 1527 +3 793 2201 2200 +3 790 791 1527 +3 501 2526 2527 +3 2538 501 2527 +3 485 2188 2187 +3 1854 151 430 +3 1 1530 1529 +3 1 848 1530 +3 1530 848 485 +3 2012 2006 293 +3 1521 1531 786 +3 787 1490 1531 +3 503 1560 1561 +3 1519 1520 2511 +3 2511 2510 1537 +3 1539 1537 2512 +3 1519 1537 1524 +3 1524 1543 783 +3 1538 1517 1518 +3 2528 2538 2527 +3 1543 2531 783 +3 784 785 1789 +3 1523 420 1519 +3 1534 1535 504 +3 1535 1534 510 +3 1513 1535 510 +3 840 2513 1071 +3 2511 1537 1519 +3 979 1501 1563 +3 280 12 1887 +3 1536 1532 2509 +3 1539 1524 1537 +3 2425 1413 1443 +3 1524 1541 1543 +3 973 210 972 +3 2529 1544 2530 +3 504 1560 1559 +3 46 973 202 +3 513 502 512 +3 1542 2543 2533 +3 1551 1550 496 +3 681 2238 2237 +3 948 1229 1228 +3 1544 512 2530 +3 1758 502 1757 +3 2268 2266 688 +3 2236 2231 2232 +3 1747 2678 1768 +3 569 1747 1768 +3 205 204 59 +3 1546 2537 2539 +3 1736 1546 2539 +3 2536 2526 501 +3 69 129 125 +3 1552 1551 935 +3 2667 276 64 +3 1549 502 513 +3 217 1944 920 +3 1550 1736 496 +3 1676 2283 1675 +3 2584 782 2586 +3 1740 239 523 +3 239 524 523 +3 2119 1042 2115 +3 1061 868 2439 +3 237 552 540 +3 1227 946 1225 +3 873 2107 2106 +3 1777 1778 221 +3 859 1777 221 +3 976 969 2046 +3 969 2047 2046 +3 969 975 2047 +3 1785 1707 183 +3 2236 2232 2233 +3 1047 2121 1048 +3 2113 2109 2116 +3 2109 1045 2116 +3 845 1849 1848 +3 2299 2295 611 +3 2284 2051 51 +3 2284 156 2051 +3 183 946 1785 +3 575 1897 1896 +3 1589 711 3 +3 444 2275 1426 +3 2596 2599 577 +3 1677 2672 56 +3 1118 2602 1117 +3 514 1549 1548 +3 1554 2697 2696 +3 1293 1295 1312 +3 1675 1552 569 +3 1757 502 2217 +3 1749 1552 935 +3 540 542 211 +3 1197 1221 1206 +3 1532 1534 1558 +3 504 1535 1561 +3 1559 1558 504 +3 1540 1558 1559 +3 783 1523 1524 +3 504 1561 1560 +3 1523 783 1525 +3 601 785 784 +3 1523 1525 1528 +3 1525 1529 1528 +3 1557 1540 1562 +3 1559 1562 1540 +3 1559 16 1562 +3 2166 2165 1898 +3 1496 1563 1495 +3 1563 1492 1495 +3 2342 2343 2344 +3 2273 2272 2274 +3 1129 636 2099 +3 1927 1567 937 +3 1567 1928 937 +3 1929 1928 1567 +3 923 1651 1649 +3 1806 456 1017 +3 1153 1285 2250 +3 937 1925 1924 +3 1567 1568 27 +3 866 1637 1638 +3 2522 1564 2524 +3 2568 31 1650 +3 1796 1793 1794 +3 1797 28 1798 +3 1110 1906 1907 +3 1912 1903 1115 +3 2484 42 1799 +3 1568 1567 1566 +3 101 2475 2474 +3 2213 1280 1279 +3 1769 1265 2213 +3 1270 1279 1280 +3 1287 1155 1288 +3 1580 1152 1151 +3 2143 2176 2175 +3 205 58 204 +3 58 2424 204 +3 963 1574 1575 +3 963 1575 1152 +3 2036 2035 965 +3 2035 971 965 +3 2033 2032 916 +3 310 153 306 +3 955 468 1578 +3 231 955 1578 +3 1010 2156 1116 +3 1573 963 1570 +3 963 1571 1570 +3 2176 1002 2141 +3 1576 1149 1302 +3 1149 1576 1574 +3 1575 1574 1576 +3 143 999 1460 +3 1578 1305 231 +3 467 1305 1578 +3 1304 1305 467 +3 1010 2210 2209 +3 1586 127 139 +3 1957 880 1956 +3 500 2535 503 +3 1583 1585 1584 +3 125 1584 69 +3 1584 125 1587 +3 1732 1069 1731 +3 2699 136 378 +3 691 1957 879 +3 2206 1957 691 +3 1964 1982 1980 +3 73 1586 139 +3 73 132 131 +3 2163 2459 2165 +3 2459 1898 2165 +3 130 73 131 +3 130 1586 73 +3 129 69 130 +3 71 129 130 +3 1951 247 1952 +3 2594 1897 575 +3 2593 2594 575 +3 126 1583 1584 +3 216 551 913 +3 317 320 109 +3 141 1468 2003 +3 2459 2168 2177 +3 958 2459 2177 +3 2233 2232 3 +3 686 1089 2400 +3 2399 687 1088 +3 1603 1602 637 +3 674 673 1602 +3 673 674 633 +3 1601 637 1602 +3 469 1581 2209 +3 2469 2470 2471 +3 2305 2469 2471 +3 720 1597 639 +3 718 639 1598 +3 1599 385 451 +3 1593 1592 713 +3 1099 2397 2396 +3 2392 1099 2396 +3 1170 2468 2305 +3 959 1098 1097 +3 1098 2396 1097 +3 960 68 253 +3 719 1128 639 +3 1592 720 639 +3 1100 2393 2392 +3 2393 1099 2392 +3 1430 1599 452 +3 2504 827 2185 +3 2016 298 2014 +3 2019 2017 110 +3 2017 2019 302 +3 2016 2014 110 +3 2616 299 2617 +3 2381 45 2380 +3 152 2019 319 +3 319 2019 110 +3 111 2616 2617 +3 2304 2305 1169 +3 675 1603 637 +3 1590 1591 1592 +3 2132 2209 1581 +3 2206 2208 1868 +3 2206 691 2208 +3 2592 2596 697 +3 1869 2208 691 +3 1391 1392 1390 +3 1604 437 1400 +3 1405 1404 2639 +3 1317 1316 400 +3 1618 1317 400 +3 1142 392 804 +3 708 1609 707 +3 1284 1156 1620 +3 499 935 496 +3 400 1614 1616 +3 1617 400 1616 +3 1615 605 1614 +3 2484 62 167 +3 2559 799 2551 +3 1615 1614 1316 +3 1616 1614 1611 +3 605 609 580 +3 1612 605 580 +3 1610 1611 581 +3 582 2559 2551 +3 2552 2554 2557 +3 582 2552 2557 +3 583 1617 2551 +3 799 583 2551 +3 1615 393 609 +3 609 605 1615 +3 393 1615 606 +3 2423 1033 1032 +3 610 2290 2291 +3 606 1615 1316 +3 400 1617 1618 +3 1622 1624 1269 +3 1617 583 1619 +3 1617 1619 1618 +3 2489 1703 1710 +3 2350 1008 2349 +3 1270 1621 1279 +3 1268 1269 1624 +3 1156 1622 1620 +3 1620 1622 1269 +3 157 476 120 +3 159 157 120 +3 476 121 120 +3 2050 82 158 +3 1286 1287 1281 +3 1628 1627 1271 +3 1848 493 1738 +3 1622 1271 1624 +3 1623 1628 1271 +3 1919 1918 1268 +3 1322 585 757 +3 2049 159 2050 +3 159 52 2050 +3 1455 82 2050 +3 2066 226 2063 +3 1287 2052 1155 +3 1630 1423 386 +3 1443 1629 1439 +3 2073 1297 2071 +3 1628 1623 1285 +3 1439 1630 386 +3 1631 1371 1370 +3 1371 1631 761 +3 2367 2364 756 +3 2367 754 2364 +3 1632 888 1633 +3 888 1632 1631 +3 1632 761 1631 +3 2363 2359 403 +3 886 881 761 +3 2359 2363 2368 +3 1635 1636 1634 +3 1636 1635 856 +3 1782 1780 860 +3 1634 858 1033 +3 2611 1106 864 +3 1026 858 1025 +3 1636 856 217 +3 1364 1358 772 +3 858 1636 1025 +3 1645 2124 2123 +3 2125 1645 2123 +3 1638 1637 1036 +3 1041 1643 1642 +3 1643 1040 1642 +3 955 231 2128 +3 46 547 973 +3 1643 1047 1031 +3 1813 1238 1814 +3 2111 1639 867 +3 869 1046 1053 +3 1639 1638 1036 +3 2244 1056 2245 +3 1056 2244 873 +3 1092 2436 699 +3 1690 1689 154 +3 871 1643 1031 +3 2123 2122 1041 +3 2125 2123 1041 +3 1119 1120 1892 +3 1034 871 1029 +3 1042 1638 1639 +3 871 1040 1643 +3 1802 261 1721 +3 1638 1644 866 +3 1638 1042 1644 +3 2277 943 944 +3 943 942 944 +3 200 4 1647 +3 1641 1646 1642 +3 1967 116 1972 +3 516 1742 2627 +3 659 660 603 +3 2589 689 2591 +3 1839 90 333 +3 1655 657 678 +3 1697 196 322 +3 2493 2492 342 +3 386 1427 2689 +3 2568 1650 9 +3 199 198 200 +3 2285 199 200 +3 119 118 122 +3 249 938 85 +3 249 1925 938 +3 1948 1947 252 +3 678 657 679 +3 2572 194 2573 +3 1957 1956 879 +3 175 1651 923 +3 924 175 923 +3 1654 1652 1650 +3 32 1984 1983 +3 32 1985 1984 +3 1583 1666 1999 +3 1564 2523 2524 +3 1651 1654 1649 +3 1829 1258 1830 +3 1258 1826 1830 +3 1966 1972 932 +3 1816 1246 1241 +3 1872 878 645 +3 676 629 1656 +3 676 664 629 +3 676 1656 1655 +3 672 676 1655 +3 600 1065 1066 +3 1656 629 704 +3 1820 1248 1818 +3 1661 1488 1486 +3 1488 1205 1486 +3 1217 1661 1486 +3 521 1659 1661 +3 1740 1739 518 +3 935 1750 1749 +3 1664 1311 374 +3 1625 1662 1272 +3 1625 227 1662 +3 1626 227 1625 +3 1274 1662 227 +3 1664 1663 1274 +3 1056 873 2105 +3 1319 1082 1665 +3 1093 700 1092 +3 1666 337 338 +3 1666 1388 337 +3 126 1388 1666 +3 126 1666 1583 +3 1674 1673 505 +3 1293 369 2311 +3 1406 1668 1132 +3 1668 1406 1394 +3 1551 1670 1555 +3 1550 1551 1555 +3 1956 890 762 +3 880 890 1956 +3 1394 2548 2545 +3 949 812 1180 +3 1785 947 1707 +3 2218 2224 1318 +3 2224 2218 2219 +3 1647 201 2389 +3 1758 1756 498 +3 1552 1671 1670 +3 378 377 2699 +3 2663 243 2662 +3 1679 172 1453 +3 1295 1679 1453 +3 823 2076 819 +3 2424 7 204 +3 2658 2659 79 +3 2408 2407 2406 +3 2405 2408 2406 +3 830 2500 487 +3 830 2601 2500 +3 1211 1208 1209 +3 846 2661 849 +3 2654 528 529 +3 2283 1553 1672 +3 1675 2283 1672 +3 2215 1553 2281 +3 2283 2282 1553 +3 2229 2372 2242 +3 156 2049 2051 +3 2049 158 2051 +3 171 83 223 +3 171 1679 83 +3 242 819 2076 +3 818 819 242 +3 172 1679 1680 +3 82 1455 1456 +3 1700 994 993 +3 1689 1687 154 +3 1681 171 1682 +3 1687 64 154 +3 171 1680 1679 +3 1445 1278 2323 +3 698 2595 705 +3 82 170 169 +3 271 98 272 +3 17 268 1683 +3 820 818 475 +3 155 1688 1685 +3 2383 1024 2024 +3 2382 2381 2383 +3 1685 262 1684 +3 262 1685 1686 +3 1687 1686 263 +3 1687 24 1686 +3 64 1687 263 +3 24 262 1686 +3 2024 7 2383 +3 2382 2383 7 +3 208 2032 2033 +3 38 208 2033 +3 265 1689 1691 +3 1689 265 24 +3 265 1691 87 +3 2570 2569 9 +3 1690 213 214 +3 1689 1690 1691 +3 1726 1727 339 +3 1682 1692 1681 +3 1692 1682 1684 +3 1684 170 1692 +3 1094 695 1693 +3 2600 1605 1606 +3 1605 1607 579 +3 573 1148 1220 +3 573 2406 1148 +3 991 1985 1991 +3 1959 1607 696 +3 1959 1958 1607 +3 1607 1608 696 +3 1547 2528 500 +3 2119 1645 1042 +3 2121 2120 1044 +3 1987 1973 1986 +3 260 258 1720 +3 817 242 841 +3 1697 1698 37 +3 322 1698 1697 +3 324 1326 327 +3 1326 324 1702 +3 1704 1699 324 +3 1701 1699 322 +3 1712 322 99 +3 2179 2499 1489 +3 789 2179 1489 +3 2489 2490 2498 +3 2490 2489 344 +3 324 1706 1705 +3 1711 325 339 +3 93 914 915 +3 259 340 1722 +3 1711 323 1712 +3 36 1706 1707 +3 1698 1700 37 +3 37 1700 993 +3 38 343 214 +3 324 327 1706 +3 1701 323 1703 +3 1123 336 331 +3 2498 2490 2494 +3 1709 1324 215 +3 1038 2446 872 +3 212 1326 1327 +3 36 994 1705 +3 339 1713 1710 +3 344 1713 1714 +3 1709 1325 1324 +3 2671 2675 2673 +3 2675 2671 1748 +3 1705 1706 36 +3 1067 1386 628 +3 1385 689 1786 +3 1840 2 491 +3 1838 334 1839 +3 354 1840 491 +3 36 1707 947 +3 1709 327 1325 +3 1069 225 1731 +3 1707 1706 327 +3 1708 1707 327 +3 1709 1708 327 +3 913 215 915 +3 215 1708 1709 +3 2091 144 2576 +3 1710 1711 339 +3 325 1711 1712 +3 99 325 1712 +3 326 325 99 +3 1722 336 77 +3 1702 324 2495 +3 2494 88 2496 +3 2495 2494 2496 +3 1718 342 2492 +3 341 1718 2492 +3 1719 258 65 +3 259 1717 1716 +3 341 1716 1717 +3 1717 65 1718 +3 1718 341 1717 +3 2373 2372 2240 +3 326 99 350 +3 77 260 1720 +3 259 1720 1719 +3 340 1721 1722 +3 1721 1723 1722 +3 346 329 345 +3 1726 328 1725 +3 330 1138 1459 +3 1724 330 1459 +3 1138 89 1459 +3 1460 1459 89 +3 1461 1460 89 +3 1138 1137 89 +3 1721 261 1723 +3 945 329 181 +3 945 1137 329 +3 1818 1817 1241 +3 1818 1248 1817 +3 1969 1979 1978 +3 1979 1968 1978 +3 1967 1972 1966 +3 261 1727 1726 +3 261 1726 1725 +3 945 332 1137 +3 33 1730 326 +3 1730 325 326 +3 1730 33 1729 +3 328 1730 1729 +3 1582 472 2065 +3 1069 1070 225 +3 469 1113 1582 +3 40 103 104 +3 1112 291 1069 +3 4 928 1734 +3 1733 1069 1732 +3 1581 469 1582 +3 4 1734 201 +3 924 1653 201 +3 1734 924 201 +3 129 70 125 +3 928 4 929 +3 926 1735 925 +3 121 70 129 +3 1745 568 567 +3 546 92 964 +3 514 1737 1550 +3 1555 514 1550 +3 1737 514 1548 +3 1744 1745 567 +3 2583 781 2629 +3 2587 178 2632 +3 241 2693 1127 +3 493 518 1738 +3 1320 587 2218 +3 1346 566 524 +3 1741 1740 518 +3 1740 1741 239 +3 163 1843 19 +3 1742 522 1743 +3 1678 2672 1677 +3 527 238 523 +3 1754 515 498 +3 1205 1488 2663 +3 568 1745 1746 +3 2676 1678 2278 +3 1755 1756 1766 +3 2677 2674 2676 +3 1768 2677 2676 +3 568 2679 2680 +3 607 393 606 +3 499 497 1215 +3 935 499 1750 +3 1320 2218 1318 +3 2582 2583 463 +3 1744 1751 1745 +3 1474 2582 463 +3 1487 1205 2665 +3 1743 2451 520 +3 520 1767 1743 +3 381 382 360 +3 1208 2662 243 +3 1742 1743 1767 +3 1754 1755 516 +3 1757 2217 2216 +3 2278 2279 1676 +3 502 1758 495 +3 1549 2217 502 +3 498 495 1758 +3 499 517 1750 +3 518 493 1759 +3 1673 1674 2698 +3 1759 1760 515 +3 1759 493 1760 +3 2451 1743 2450 +3 2451 2450 1751 +3 2663 1488 243 +3 312 2313 2314 +3 2215 1677 2216 +3 1748 1763 1764 +3 1761 1762 1746 +3 1745 1761 1746 +3 1766 1742 516 +3 1755 1766 516 +3 1763 1752 1764 +3 56 1765 1756 +3 523 238 519 +3 522 1765 1764 +3 1764 1765 1748 +3 2677 2678 936 +3 1756 1765 1766 +3 522 1766 1765 +3 312 371 2313 +3 2211 2212 1265 +3 1265 1771 2211 +3 1267 1262 366 +3 371 2312 2313 +3 658 602 1772 +3 658 682 602 +3 2361 1185 760 +3 2536 1545 2526 +3 1772 602 630 +3 602 631 630 +3 630 1774 1773 +3 640 1773 1774 +3 640 1774 599 +3 1377 640 599 +3 685 959 1089 +3 1792 959 685 +3 1376 640 1377 +3 603 1776 1775 +3 1122 1792 653 +3 1777 859 1779 +3 705 2597 2555 +3 649 756 2590 +3 649 1874 754 +3 696 1608 2592 +3 977 1588 1778 +3 1778 1588 543 +3 104 2284 51 +3 217 920 1025 +3 218 1779 1780 +3 1784 969 976 +3 1051 1052 1050 +3 471 2131 2139 +3 1227 947 1785 +3 2238 1472 2237 +3 1477 556 1476 +3 1079 1791 684 +3 42 8 1793 +3 1077 95 1078 +3 686 1788 685 +3 1787 685 1788 +3 94 574 573 +3 631 602 694 +3 2581 631 694 +3 631 2581 2579 +3 661 1378 1379 +3 598 1789 785 +3 959 1792 1122 +3 1904 1901 1114 +3 1795 80 1568 +3 1928 938 1925 +3 80 57 40 +3 1795 57 80 +3 1799 1797 1800 +3 1799 62 2484 +3 1713 1802 1714 +3 1794 1795 28 +3 1795 1568 28 +3 291 1112 1906 +3 1795 1794 57 +3 1800 62 1799 +3 42 1796 1797 +3 1796 28 1797 +3 1796 1794 28 +3 1393 2546 1399 +3 2547 2546 1393 +3 1727 1713 339 +3 1713 1727 1802 +3 1837 1838 49 +3 1564 1924 1925 +3 57 107 40 +3 42 1797 1799 +3 100 2486 2485 +3 8 2486 100 +3 2475 100 2485 +3 102 29 103 +3 1800 1801 43 +3 78 202 1024 +3 2277 49 945 +3 2276 2277 945 +3 943 2277 2276 +3 1806 1017 1236 +3 1805 1806 1236 +3 532 1836 1837 +3 735 455 736 +3 1807 1808 1239 +3 456 1810 1019 +3 1812 1238 1813 +3 1812 1811 1238 +3 1809 1251 1020 +3 1226 422 982 +3 2428 1237 2427 +3 1237 1811 2427 +3 1804 1237 2428 +3 2428 2427 1805 +3 1817 1816 1241 +3 1815 1816 1247 +3 1242 1823 1256 +3 1812 1813 1808 +3 1811 1237 736 +3 1238 1811 736 +3 736 1814 1238 +3 1242 1248 1820 +3 78 549 202 +3 1969 1971 929 +3 346 422 181 +3 2088 2095 361 +3 2095 2087 361 +3 1817 1248 1247 +3 1819 1818 1241 +3 1819 1657 1818 +3 1250 1249 1819 +3 1249 1657 1819 +3 1815 1246 1816 +3 1256 1823 54 +3 1242 1821 1822 +3 1821 1242 1820 +3 1823 1242 1822 +3 332 333 1461 +3 1136 1137 1138 +3 329 1137 1136 +3 1249 1828 1257 +3 1828 1243 1257 +3 1825 1822 1821 +3 1824 1825 1821 +3 1820 1657 1821 +3 1257 1825 1824 +3 1243 1826 1257 +3 1826 1825 1257 +3 1249 1257 1824 +3 766 1858 892 +3 25 2002 2001 +3 1245 1828 454 +3 1245 1827 1828 +3 892 1856 1855 +3 435 1430 452 +3 348 139 905 +3 2000 2001 140 +3 1826 1258 1825 +3 317 1160 320 +3 1464 2004 143 +3 440 1389 1831 +3 45 2382 1884 +3 1832 364 749 +3 133 1833 1832 +3 1833 363 1832 +3 134 363 1833 +3 197 1992 1998 +3 1666 338 1999 +3 2432 2433 1039 +3 1125 874 2432 +3 874 2433 2432 +3 957 2602 1161 +3 2566 2565 1835 +3 1834 193 35 +3 1976 197 1997 +3 1989 1973 1988 +3 213 1690 907 +3 536 2655 530 +3 854 222 853 +3 1836 446 334 +3 945 49 1838 +3 332 945 1838 +3 334 1838 1837 +3 1839 332 1838 +3 333 332 1839 +3 334 90 1839 +3 1844 1846 19 +3 101 2474 2473 +3 529 2660 2655 +3 1003 2153 2152 +3 164 71 165 +3 121 71 164 +3 119 70 121 +3 121 129 71 +3 476 20 119 +3 134 1833 1845 +3 1833 465 1845 +3 465 1833 133 +3 19 1843 1844 +3 177 528 2646 +3 528 177 564 +3 160 19 1448 +3 134 132 363 +3 1457 1450 368 +3 1738 845 1848 +3 847 492 848 +3 1852 240 846 +3 240 1852 845 +3 1850 845 1852 +3 1849 1850 390 +3 1851 1853 432 +3 1851 1850 1853 +3 86 1934 2194 +3 86 1936 1934 +3 148 482 1851 +3 494 847 848 +3 492 485 848 +3 2573 2571 2572 +3 1852 1853 1850 +3 1853 1854 432 +3 790 1530 791 +3 846 1854 1853 +3 846 151 1854 +3 846 849 151 +3 1134 187 443 +3 880 891 890 +3 890 891 768 +3 891 1855 768 +3 766 892 1368 +3 891 892 1855 +3 1368 892 891 +3 1175 765 1857 +3 1857 765 1856 +3 1245 1244 1827 +3 1858 769 1175 +3 1457 2645 1446 +3 190 2641 458 +3 1878 647 1877 +3 1882 647 1878 +3 1387 1377 642 +3 2366 760 588 +3 2283 1676 2282 +3 646 627 1863 +3 627 646 1867 +3 755 1874 1877 +3 668 663 664 +3 2209 471 2140 +3 646 888 1870 +3 1873 1872 645 +3 627 1869 1866 +3 1870 1868 646 +3 471 2139 2140 +3 2211 1311 1664 +3 761 881 882 +3 881 878 879 +3 882 881 879 +3 759 1866 1869 +3 931 1967 1966 +3 1023 2502 2501 +3 1865 1866 1871 +3 1866 759 1871 +3 627 1866 1865 +3 811 812 408 +3 1185 1184 693 +3 1872 1871 759 +3 1968 116 1967 +3 1668 2547 1395 +3 1872 1873 755 +3 1862 1883 1861 +3 1865 1876 1879 +3 1876 1877 1879 +3 1880 1879 647 +3 1879 1877 647 +3 1383 1882 1384 +3 1865 1879 1880 +3 1864 1865 1880 +3 1882 1878 1384 +3 592 662 1068 +3 1880 1883 1864 +3 1881 1882 626 +3 1881 626 1861 +3 1862 1861 643 +3 112 45 1884 +3 1881 647 1882 +3 2546 1394 2545 +3 1862 1864 1883 +3 1885 13 1886 +3 1886 13 1887 +3 1916 2425 1412 +3 1442 1916 1412 +3 108 1890 1889 +3 1891 292 1890 +3 108 1891 1890 +3 1889 1888 108 +3 2196 2195 1934 +3 2227 1061 2437 +3 1496 980 979 +3 1893 1892 699 +3 1893 1894 1892 +3 2595 698 1897 +3 2437 2225 2227 +3 1328 288 956 +3 956 288 957 +3 2458 139 2457 +3 2171 2686 2174 +3 1594 2274 2272 +3 700 1094 1896 +3 1895 1896 1897 +3 2501 2502 1119 +3 1059 2445 1125 +3 1893 1895 1894 +3 1895 701 1894 +3 1169 2305 2471 +3 632 675 637 +3 698 701 1895 +3 447 2275 444 +3 1904 1902 1901 +3 1161 956 957 +3 1117 1898 1118 +3 1898 958 1118 +3 1114 1901 1117 +3 1112 1111 1907 +3 291 1905 1114 +3 2135 1001 2172 +3 2146 1002 2142 +3 1009 2148 1008 +3 1110 1913 1905 +3 2170 2137 2169 +3 1108 289 1903 +3 1902 1903 289 +3 2093 358 357 +3 358 2577 357 +3 1111 349 1908 +3 1108 1903 1109 +3 1911 1914 1909 +3 1914 1911 1908 +3 1905 291 1906 +3 2175 2176 2603 +3 1913 1110 1911 +3 1913 1911 1912 +3 1905 1913 1904 +3 1914 1908 349 +3 42 15 8 +3 1908 1110 1907 +3 1109 1909 1910 +3 2486 15 2483 +3 1909 349 1910 +3 166 2483 2482 +3 2486 2483 166 +3 8 15 2486 +3 1912 1115 1913 +3 387 1420 1421 +3 413 1415 1915 +3 1414 1915 1415 +3 1620 1269 1917 +3 1621 1620 1917 +3 1198 1196 2295 +3 1198 1199 1196 +3 1918 1269 1268 +3 372 1621 1918 +3 1621 372 1279 +3 1621 1917 1918 +3 1917 1269 1918 +3 2482 2479 2478 +3 1279 372 1267 +3 347 63 2481 +3 1920 347 2481 +3 31 199 2285 +3 2391 31 2285 +3 2521 1564 2522 +3 62 1800 43 +3 678 2099 636 +3 1926 937 1924 +3 1926 1923 1565 +3 1926 1924 1923 +3 1565 43 1801 +3 2565 2566 18 +3 1565 1923 1922 +3 1924 1564 1923 +3 1565 1922 43 +3 1929 938 1928 +3 1931 1930 939 +3 1930 1931 1929 +3 1927 937 1926 +3 1566 1927 1926 +3 1801 1566 1565 +3 1798 1566 1801 +3 2196 85 2195 +3 939 2195 1931 +3 2194 2195 939 +3 2573 194 992 +3 18 1834 2565 +3 1834 18 2570 +3 169 1935 1933 +3 1932 169 1933 +3 419 2200 2201 +3 682 677 602 +3 1940 901 321 +3 1191 1190 321 +3 1190 1938 321 +3 80 81 1930 +3 80 1930 27 +3 1930 1929 27 +3 1931 938 1929 +3 2196 128 962 +3 85 938 1931 +3 1937 65 257 +3 2622 2623 300 +3 894 2623 2622 +3 1937 257 128 +3 1930 1932 939 +3 1930 81 1932 +3 962 85 2196 +3 1933 939 1932 +3 2182 792 2203 +3 169 81 168 +3 81 169 1932 +3 264 1471 86 +3 1471 1936 86 +3 169 170 1935 +3 1937 128 1936 +3 196 1696 1652 +3 1718 65 1937 +3 266 1718 1937 +3 87 1718 266 +3 266 1937 1936 +3 793 2199 2198 +3 796 2198 2199 +3 1941 1372 883 +3 585 1322 2222 +3 2219 584 1319 +3 1542 2533 2534 +3 1321 1320 1318 +3 1941 889 1372 +3 2536 2540 1943 +3 884 402 1942 +3 889 1941 402 +3 1941 1942 402 +3 2247 2544 289 +3 2544 2247 1900 +3 217 1946 1944 +3 1103 2387 5 +3 1945 1946 921 +3 1734 1735 924 +3 2388 1212 1660 +3 2388 1213 1222 +3 1212 2388 1222 +3 521 2388 1660 +3 2388 521 1213 +3 960 250 251 +3 961 904 960 +3 347 1947 1949 +3 246 347 1950 +3 63 347 246 +3 347 1949 1950 +3 1950 1949 41 +3 1950 1952 246 +3 1588 92 544 +3 1955 514 1555 +3 1954 1953 60 +3 246 1953 1954 +3 1953 247 60 +3 122 70 119 +3 247 1953 1952 +3 514 1955 1674 +3 2697 1554 2698 +3 1982 1966 932 +3 1360 1359 885 +3 1968 1967 931 +3 242 817 818 +3 1775 1774 630 +3 2287 2288 1199 +3 2556 2553 1606 +3 1965 1982 1983 +3 874 2434 2433 +3 920 2387 1103 +3 1037 2442 2440 +3 195 1976 1997 +3 1834 1976 195 +3 1997 197 1998 +3 1975 115 195 +3 35 1976 1834 +3 1993 1994 1975 +3 1994 1993 1974 +3 198 1996 200 +3 1965 931 1966 +3 1983 1982 1964 +3 1992 1987 1974 +3 1992 1988 1987 +3 96 984 983 +3 96 989 985 +3 1078 659 603 +3 930 1968 931 +3 1970 929 934 +3 1969 116 1979 +3 116 1968 1979 +3 1990 197 1977 +3 1647 2285 200 +3 1647 2391 2285 +3 1989 1988 1990 +3 61 990 991 +3 1991 1985 32 +3 201 1653 2389 +3 1667 2227 1060 +3 1947 1920 1921 +3 1993 1998 1992 +3 1990 1988 197 +3 1039 2434 1038 +3 1997 1975 195 +3 1978 1971 1969 +3 1971 1978 930 +3 1978 1968 930 +3 1472 1473 683 +3 2228 1472 683 +3 930 925 1971 +3 1963 1980 932 +3 1980 1982 932 +3 1984 1965 1983 +3 1984 985 1965 +3 2447 2441 1028 +3 2110 2109 2113 +3 1962 933 1963 +3 985 989 1965 +3 2445 874 1125 +3 1107 2245 872 +3 2446 1107 872 +3 1989 1991 32 +3 1964 1981 1973 +3 1981 1986 1973 +3 1981 933 1986 +3 2436 1893 699 +3 1895 1893 2455 +3 2385 917 2384 +3 991 990 1985 +3 1964 1989 32 +3 32 1983 1964 +3 1989 1964 1973 +3 990 61 998 +3 1986 933 1974 +3 1995 115 1994 +3 197 1988 1992 +3 865 1107 2446 +3 1991 1989 1990 +3 933 1994 1974 +3 1036 1060 1059 +3 1036 1059 867 +3 1637 1060 1036 +3 1570 1154 2351 +3 1042 1639 2115 +3 4 200 1996 +3 934 1996 1995 +3 1995 1996 115 +3 286 2683 2684 +3 875 2110 2113 +3 198 115 1996 +3 929 1996 934 +3 4 1996 929 +3 2258 2262 1469 +3 427 2262 2258 +3 2259 1469 2262 +3 26 1889 2007 +3 1889 293 2007 +3 2257 23 2260 +3 788 1500 1504 +3 113 2009 297 +3 2009 26 2008 +3 26 2010 1889 +3 1889 2010 1888 +3 2010 112 1888 +3 2011 112 2010 +3 426 112 2011 +3 112 426 45 +3 113 1469 2259 +3 2259 2011 113 +3 306 152 319 +3 2018 22 298 +3 298 294 2014 +3 2017 2018 2016 +3 2018 298 2016 +3 2017 2016 110 +3 342 214 343 +3 972 91 974 +3 2034 91 972 +3 204 203 2020 +3 476 157 20 +3 59 207 213 +3 207 59 2020 +3 22 1470 297 +3 1470 113 297 +3 152 302 2019 +3 2031 209 2027 +3 209 2031 2035 +3 2032 2028 916 +3 202 2023 1024 +3 203 2023 2022 +3 2024 2023 203 +3 1024 2023 2024 +3 2381 2380 1159 +3 2020 59 204 +3 2024 203 204 +3 7 2024 204 +3 24 1687 1689 +3 2029 2028 209 +3 213 2030 38 +3 546 210 545 +3 2030 208 38 +3 219 919 2029 +3 2027 2028 2032 +3 207 2026 2030 +3 2025 2026 207 +3 219 2040 967 +3 2027 2032 208 +3 2026 2027 208 +3 202 973 974 +3 157 156 20 +3 156 157 2049 +3 203 2021 2020 +3 2034 2031 91 +3 1310 1273 1153 +3 209 2035 2036 +3 2036 2037 2029 +3 2037 2036 965 +3 2036 2029 209 +3 546 964 2038 +3 965 546 2038 +3 965 2038 2037 +3 966 2039 964 +3 966 2040 2039 +3 2040 219 2039 +3 967 2042 968 +3 2021 207 2020 +3 205 59 206 +3 2044 92 978 +3 2046 220 976 +3 964 92 2044 +3 966 2043 2041 +3 11 58 205 +3 2044 978 220 +3 977 978 1588 +3 220 2043 2044 +3 966 2044 2043 +3 2611 2243 862 +3 2034 2048 2031 +3 2035 2048 971 +3 2031 2048 2035 +3 1310 224 2054 +3 1286 2052 1287 +3 2051 158 51 +3 2052 1286 1273 +3 2053 2052 1273 +3 1273 1310 2053 +3 1310 2054 2053 +3 1289 230 1288 +3 1290 2058 1306 +3 2057 228 2058 +3 1289 2057 2058 +3 2062 2061 1292 +3 2073 2074 223 +3 2059 1291 2055 +3 2054 2059 2055 +3 2057 2062 228 +3 1291 2061 2062 +3 2060 2061 1291 +3 1290 1289 2058 +3 230 1289 1290 +3 2055 2053 2054 +3 2054 1294 2059 +3 2072 2064 2065 +3 231 1305 284 +3 1291 2062 2057 +3 2073 2067 1297 +3 2067 2073 1299 +3 84 51 168 +3 226 2066 2067 +3 1294 2064 2063 +3 225 1070 2070 +3 1296 2068 2066 +3 2068 2067 2066 +3 2068 1297 2067 +3 1153 1273 1628 +3 1296 225 2068 +3 1296 1731 225 +3 2054 224 2065 +3 2054 2065 1294 +3 224 1582 2065 +3 1070 288 2070 +3 1329 288 1328 +3 2066 2064 1296 +3 296 2069 2070 +3 296 2071 2069 +3 2075 1683 171 +3 223 1299 2073 +3 82 169 168 +3 2074 1683 2075 +3 1682 171 1683 +3 171 223 2075 +3 2607 486 2606 +3 825 2607 823 +3 394 825 823 +3 823 2607 2076 +3 484 842 830 +3 1436 2097 478 +3 2097 2096 478 +3 2092 2088 361 +3 2084 2083 142 +3 784 2578 2581 +3 2436 2455 1893 +3 2436 700 2455 +3 301 358 893 +3 2625 301 893 +3 2462 1170 2304 +3 1840 2081 353 +3 1840 355 2081 +3 351 2083 2084 +3 353 2081 2082 +3 1477 1476 179 +3 2575 2576 384 +3 2082 2083 351 +3 2269 688 2264 +3 356 2078 2087 +3 1468 1467 142 +3 147 2255 428 +3 352 351 2084 +3 356 2087 2086 +3 2078 114 2087 +3 895 145 362 +3 2096 2079 2089 +3 155 2098 1688 +3 2098 267 1688 +3 299 2616 2618 +3 2098 155 1683 +3 2091 2082 144 +3 384 44 383 +3 2613 901 2622 +3 410 618 952 +3 2092 362 2088 +3 362 145 2088 +3 114 798 361 +3 241 822 2693 +3 2092 2253 146 +3 623 603 1775 +3 2614 902 2613 +3 300 2614 2613 +3 1497 1498 789 +3 2089 478 2096 +3 1683 268 2098 +3 267 268 97 +3 1129 2099 2100 +3 2099 678 2100 +3 656 1129 2100 +3 2101 1473 681 +3 2102 2101 681 +3 688 2266 2265 +3 2100 678 679 +3 2101 2100 679 +3 2232 2234 3 +3 1158 2234 2232 +3 711 2233 3 +3 656 2101 2102 +3 656 2100 2101 +3 1590 1592 1593 +3 1016 713 1128 +3 982 986 2103 +3 96 2103 986 +3 182 982 983 +3 2106 2105 873 +3 1057 867 1126 +3 292 109 2012 +3 1055 867 2104 +3 864 2610 2611 +3 2164 2165 2166 +3 286 1008 2143 +3 1056 2105 2104 +3 875 1639 2111 +3 2107 873 1046 +3 2115 1639 875 +3 869 1044 1045 +3 2109 1054 2108 +3 1107 862 2245 +3 2111 867 1055 +3 2118 2120 876 +3 2117 1045 1044 +3 2124 2118 876 +3 2124 2119 2118 +3 2125 1644 1645 +3 2119 1043 2118 +3 2228 2242 2231 +3 2242 1158 2231 +3 1041 2122 1643 +3 2122 1047 1643 +3 1198 2287 1199 +3 1201 1200 2293 +3 1198 2286 2287 +3 1311 2211 1771 +3 1646 1644 2127 +3 1644 1646 866 +3 2128 285 956 +3 285 1328 956 +3 2130 955 2129 +3 2129 955 2128 +3 956 2129 2128 +3 2171 1001 2685 +3 1847 19 1846 +3 2169 2137 2177 +3 2684 1910 286 +3 2215 2216 505 +3 2130 2131 955 +3 955 2132 468 +3 955 2131 2132 +3 2131 471 2132 +3 2623 895 300 +3 891 880 767 +3 2135 1002 1000 +3 2134 2135 1000 +3 2151 1006 2154 +3 963 1573 1574 +3 1005 1002 2146 +3 2137 1001 2136 +3 2133 2139 2131 +3 708 1091 2487 +3 708 1092 1091 +3 2130 2129 287 +3 2136 2134 287 +3 2144 2169 2178 +3 2147 1005 2146 +3 2179 789 1494 +3 2349 2348 2147 +3 1109 2684 1004 +3 2504 828 2604 +3 827 2504 2604 +3 1006 1010 2154 +3 2157 2156 2155 +3 2160 2162 2161 +3 2162 1111 2157 +3 2475 2485 2474 +3 2149 2161 2153 +3 2149 2160 2161 +3 2473 2474 244 +3 1309 2356 1573 +3 2354 1150 1301 +3 2474 166 244 +3 290 1116 2156 +3 2358 2369 1187 +3 1010 1006 2156 +3 290 2157 1111 +3 2157 290 2156 +3 1623 1156 1285 +3 1951 1952 1950 +3 1622 1156 1623 +3 2159 2158 2148 +3 1009 2159 2148 +3 1007 2153 2161 +3 2162 1007 2161 +3 8 100 102 +3 1009 1910 2160 +3 2247 2246 1900 +3 2247 1899 2246 +3 2164 2166 1899 +3 840 2502 1023 +3 295 269 2343 +3 1108 2144 2163 +3 2143 2142 2176 +3 1108 2163 2164 +3 2132 471 2209 +3 352 2084 75 +3 2682 2683 2138 +3 1108 1109 1004 +3 2144 1108 1004 +3 2163 2165 2164 +3 1329 1328 269 +3 2167 2166 1898 +3 1798 1800 1797 +3 2566 1835 198 +3 2181 2180 1527 +3 2171 2174 2172 +3 97 268 270 +3 18 2566 2567 +3 1328 285 2346 +3 958 2177 2137 +3 1489 796 1491 +3 2508 1176 771 +3 2181 2182 150 +3 792 2507 2183 +3 2506 2507 792 +3 2202 2203 2183 +3 1434 431 1435 +3 1434 1435 1433 +3 2192 803 406 +3 2508 1171 1176 +3 2604 2605 827 +3 148 1851 432 +3 2186 792 2182 +3 2182 2203 150 +3 2183 2184 793 +3 2198 2183 793 +3 1172 2508 771 +3 392 1142 586 +3 2401 2403 593 +3 2504 2506 2505 +3 2504 2185 2506 +3 1442 413 1916 +3 148 432 1434 +3 2506 792 2505 +3 391 2188 484 +3 825 826 486 +3 2188 485 492 +3 484 2188 492 +3 843 484 492 +3 2190 2191 805 +3 814 805 2191 +3 2192 406 2191 +3 2189 804 2190 +3 2190 407 2189 +3 2191 2193 814 +3 804 2189 1142 +3 794 2201 2184 +3 265 87 266 +3 2194 1933 86 +3 1493 796 2199 +3 2573 992 35 +3 193 2573 35 +3 2194 1934 2195 +3 1489 2197 796 +3 118 119 20 +3 2203 2202 150 +3 150 2180 2181 +3 1789 2401 593 +3 2504 391 828 +3 2501 1892 2503 +3 2186 2182 2181 +3 794 419 2201 +3 2198 2202 2183 +3 2204 1443 1413 +3 489 1443 2204 +3 2169 2177 2205 +3 2178 2169 2205 +3 2168 2205 2177 +3 2178 2205 2168 +3 2104 2105 1055 +3 2106 1055 2105 +3 271 6 1165 +3 284 98 2345 +3 2344 2346 2345 +3 2346 2344 269 +3 2147 2348 2347 +3 1003 2147 2347 +3 2460 1495 1491 +3 283 2344 2345 +3 2112 1055 2106 +3 1265 2212 2213 +3 2212 1280 2213 +3 569 1552 1749 +3 2282 2281 1553 +3 2282 2280 2281 +3 1676 2280 2282 +3 1553 2215 1673 +3 2215 505 1673 +3 530 2660 532 +3 2660 1836 532 +3 1942 1941 883 +3 2219 1319 2221 +3 404 2248 779 +3 701 2488 839 +3 2222 1321 1318 +3 1322 1321 2222 +3 758 1321 1322 +3 1060 2225 1059 +3 2441 1037 2440 +3 2441 2447 1037 +3 2434 874 2435 +3 2226 874 2445 +3 2444 2226 2445 +3 2437 1061 2438 +3 2307 715 2235 +3 2227 1569 1061 +3 2227 1667 1569 +3 715 2304 2235 +3 2308 1963 932 +3 2271 712 2272 +3 2233 2237 2236 +3 681 2239 2102 +3 2239 2237 2233 +3 381 360 1162 +3 1473 2238 681 +3 716 1157 683 +3 681 2237 2239 +3 1473 1472 2238 +3 1151 1575 2612 +3 1575 1576 2612 +3 2268 1590 1593 +3 2264 1589 2269 +3 2229 1157 2241 +3 2228 1157 2229 +3 683 1157 2228 +3 2228 2229 2242 +3 1960 576 1959 +3 1961 1960 1959 +3 2596 1608 2599 +3 1693 695 1961 +3 695 1960 1961 +3 695 1094 1093 +3 497 511 822 +3 2240 2241 2230 +3 2241 1157 2230 +3 2372 2373 2242 +3 2373 1158 2242 +3 2249 1320 779 +3 2249 587 1320 +3 2353 2352 1283 +3 2353 2351 2352 +3 1283 2355 1156 +3 1572 1153 2250 +3 1490 1494 788 +3 798 2252 2253 +3 798 428 2252 +3 146 2253 2252 +3 2253 2092 361 +3 798 2253 361 +3 2376 493 2378 +3 2011 2259 426 +3 2263 2259 2262 +3 2263 426 2259 +3 1469 1470 2251 +3 2260 23 2261 +3 426 2260 2261 +3 428 2255 2254 +3 427 2256 2257 +3 427 2263 2262 +3 2260 426 2263 +3 1465 75 1464 +3 45 426 2261 +3 2381 2382 45 +3 1024 2381 1159 +3 867 1059 1125 +3 2266 713 1016 +3 1593 713 2266 +3 2271 1591 1590 +3 2267 2102 2239 +3 2268 1593 2266 +3 1547 2538 2528 +3 510 1533 1506 +3 1170 2305 2304 +3 385 1426 2275 +3 1951 1950 41 +3 2688 1951 41 +3 2308 1962 1963 +3 2466 2467 714 +3 2469 2466 714 +3 2376 1760 493 +3 847 1760 2376 +3 2252 428 2375 +3 623 630 2580 +3 2273 2274 720 +3 1594 1596 2274 +3 385 447 1338 +3 385 2275 447 +3 2380 2261 1159 +3 2261 2380 45 +3 136 381 378 +3 136 380 381 +3 1804 2428 2429 +3 2430 1804 2429 +3 1223 943 2276 +3 2430 2429 1236 +3 136 375 380 +3 569 2278 1676 +3 2277 944 49 +3 503 1561 511 +3 511 497 503 +3 2144 2145 2169 +3 2286 1197 2287 +3 569 1768 2278 +3 286 2143 2683 +3 528 2654 256 +3 2675 56 2672 +3 2279 2280 1676 +3 2279 2214 2280 +3 2650 2653 535 +3 445 444 187 +3 1635 859 221 +3 156 2284 105 +3 51 84 104 +3 2532 2530 1541 +3 2284 104 105 +3 2396 2397 1097 +3 1920 43 1922 +3 2566 199 2567 +3 2677 936 2674 +3 1763 2671 2670 +3 2670 2669 1763 +3 2286 1221 1197 +3 2286 2294 1221 +3 1206 2289 1197 +3 2289 2288 1197 +3 612 399 1207 +3 2289 1206 2293 +3 2670 2671 936 +3 1746 2670 936 +3 2470 1594 1595 +3 2294 1198 2295 +3 614 612 2301 +3 614 418 612 +3 2298 2297 2296 +3 425 2297 2298 +3 2296 2295 1196 +3 774 776 2422 +3 776 774 773 +3 425 614 2297 +3 1194 425 2298 +3 425 1194 1195 +3 2297 614 2301 +3 2301 2300 611 +3 2299 611 2300 +3 2297 2301 611 +3 2296 2297 611 +3 715 2306 2461 +3 2462 715 2461 +3 2302 2464 2463 +3 2302 716 2464 +3 2302 2463 2462 +3 2461 2302 2462 +3 715 2462 2304 +3 714 2470 2469 +3 716 2302 2303 +3 716 2303 1157 +3 2306 2230 1157 +3 2303 2306 1157 +3 1306 2311 371 +3 2058 228 1306 +3 228 2311 1306 +3 1293 2311 228 +3 314 315 235 +3 2312 229 2313 +3 2309 1444 2315 +3 311 312 2314 +3 1277 2309 2315 +3 314 232 315 +3 2323 2315 1445 +3 2324 1278 2325 +3 2316 2317 1373 +3 1277 2317 2316 +3 2320 1770 366 +3 2320 1264 1770 +3 2323 2322 1277 +3 1277 2315 2323 +3 1771 2318 1311 +3 2321 2314 229 +3 2313 229 2314 +3 2317 1277 2322 +3 309 1260 373 +3 2334 309 373 +3 2331 465 466 +3 465 2331 1847 +3 2320 2319 1264 +3 2322 367 2318 +3 1448 2330 2329 +3 2322 2324 367 +3 2323 2324 2322 +3 1276 2327 2328 +3 162 1449 1446 +3 2330 1847 2331 +3 2323 1278 2324 +3 2324 2327 367 +3 2326 2329 2333 +3 19 160 163 +3 163 160 159 +3 1447 1450 1449 +3 2334 2333 2337 +3 309 2334 2335 +3 367 2332 1311 +3 2318 367 1311 +3 2332 367 2327 +3 2327 1276 2332 +3 1449 162 1451 +3 1447 1449 1451 +3 1452 162 1312 +3 1276 2609 53 +3 2339 643 604 +3 643 2339 1862 +3 374 2332 2336 +3 374 1311 2332 +3 370 2333 2334 +3 309 2335 1015 +3 374 2336 1275 +3 2333 161 2337 +3 79 2661 2658 +3 1874 649 1878 +3 1633 887 2368 +3 2341 271 2340 +3 98 283 2345 +3 270 2343 2342 +3 2347 2148 2158 +3 1003 2347 2158 +3 2345 285 284 +3 1008 2348 2349 +3 2348 1008 2148 +3 2348 2148 2347 +3 2142 1008 2350 +3 2350 2146 2142 +3 1150 2353 1283 +3 1301 1574 2356 +3 1301 2356 2354 +3 2354 2356 1309 +3 1574 1573 2356 +3 1006 2151 2152 +3 1309 1570 2351 +3 1573 1570 1309 +3 1154 2352 2351 +3 2353 2354 1309 +3 1154 2357 2352 +3 2357 1154 2250 +3 2369 2338 1187 +3 2368 2363 1633 +3 2363 886 1633 +3 2364 403 756 +3 2366 588 1323 +3 1633 886 1632 +3 758 2362 2366 +3 2362 2360 2366 +3 758 1322 2362 +3 649 2367 756 +3 649 754 2367 +3 1186 1185 2361 +3 2360 2362 403 +3 757 756 2362 +3 756 403 2362 +3 757 585 1080 +3 1322 757 2362 +3 2366 1323 758 +3 1863 2370 646 +3 2365 881 886 +3 2360 760 2366 +3 887 2369 2358 +3 2369 2370 2338 +3 2369 887 2370 +3 2370 644 2338 +3 1863 644 2370 +3 1873 2365 754 +3 887 646 2370 +3 645 2365 1873 +3 859 2371 1781 +3 2240 2372 2241 +3 428 2254 2375 +3 2375 2251 2252 +3 2377 844 492 +3 844 843 492 +3 847 2377 492 +3 2416 2417 842 +3 483 842 2417 +3 2378 1849 844 +3 2376 2378 844 +3 1127 2692 395 +3 2692 2691 395 +3 847 2376 2377 +3 1848 1849 2378 +3 493 1848 2378 +3 390 2417 2416 +3 1392 440 2379 +3 2382 7 13 +3 1884 2382 13 +3 2491 341 2492 +3 424 970 2384 +3 993 61 992 +3 918 2385 2384 +3 2387 920 1944 +3 2387 1944 918 +3 2386 2387 918 +3 2386 5 2387 +3 970 5 2386 +3 975 5 970 +3 1100 1119 2502 +3 1921 252 1947 +3 2390 2391 1647 +3 2390 31 2391 +3 2389 2390 1647 +3 249 85 251 +3 904 68 960 +3 1023 2503 1894 +3 840 1071 2394 +3 2467 717 1597 +3 2395 1098 838 +3 1098 1121 838 +3 1097 2397 2398 +3 687 2398 2397 +3 2392 1098 2395 +3 2392 2396 1098 +3 2398 1089 1097 +3 2404 2579 593 +3 2403 2404 593 +3 623 2580 2404 +3 687 2399 2398 +3 2399 1089 2398 +3 1789 686 2401 +3 1219 572 94 +3 2404 1087 1086 +3 796 2197 2198 +3 2303 2461 2306 +3 2405 1605 579 +3 1124 910 2409 +3 949 1180 415 +3 2410 910 2411 +3 1054 2110 2112 +3 949 415 950 +3 2415 949 950 +3 517 499 1215 +3 1605 1608 1607 +3 574 1605 2405 +3 1606 1605 574 +3 1695 2407 579 +3 2411 174 2410 +3 807 408 824 +3 2465 2687 1170 +3 2463 2465 1170 +3 1170 2687 2468 +3 2687 2466 2468 +3 1749 1747 569 +3 949 2415 780 +3 806 408 807 +3 812 2413 408 +3 1353 692 2411 +3 692 1353 778 +3 2412 2410 824 +3 2413 2412 824 +3 2412 2413 780 +3 2692 821 2691 +3 2414 1124 2409 +3 844 390 2416 +3 1849 390 844 +3 2416 843 844 +3 1313 2422 607 +3 2635 417 2634 +3 954 2635 2634 +3 782 2637 2631 +3 2637 2634 2631 +3 2634 2637 2630 +3 607 2422 1195 +3 1781 2371 2423 +3 1032 860 2423 +3 1195 2421 2420 +3 860 1781 2423 +3 1781 860 1780 +3 2422 2421 1195 +3 2422 776 2421 +3 2371 1033 2423 +3 2534 2533 16 +3 7 2424 13 +3 13 2424 1887 +3 2427 1807 1805 +3 1923 1564 2521 +3 251 85 962 +3 2521 1922 1923 +3 2427 1811 1807 +3 2429 2428 1805 +3 1234 1803 1236 +3 945 181 1223 +3 2429 1805 1236 +3 2431 1235 737 +3 2571 2570 9 +3 2431 737 1804 +3 1125 2432 1126 +3 2695 2245 1056 +3 2694 2695 1057 +3 874 2226 2435 +3 2438 1061 2439 +3 865 2446 2443 +3 2433 2434 1039 +3 1102 861 1103 +3 2440 2439 868 +3 2441 868 1034 +3 2440 868 2441 +3 1028 2441 1034 +3 1102 2443 1037 +3 2443 1102 865 +3 2225 1060 2227 +3 2444 2225 2437 +3 2438 2444 2437 +3 2438 2226 2444 +3 872 1039 1038 +3 2225 2444 1059 +3 861 2447 2448 +3 2447 861 1102 +3 861 2448 1027 +3 1743 1842 2450 +3 2663 2664 1205 +3 1746 2678 2679 +3 2452 1842 1752 +3 2452 2450 1842 +3 1761 2452 1752 +3 1761 1751 2452 +3 1751 2450 2452 +3 1164 382 44 +3 1939 301 896 +3 898 301 1939 +3 359 301 898 +3 1938 1939 896 +3 1646 2626 866 +3 375 376 348 +3 376 2456 348 +3 165 131 134 +3 376 135 2456 +3 135 2457 2456 +3 2457 348 2456 +3 139 348 2457 +3 73 139 2458 +3 74 348 905 +3 269 1328 2346 +3 2477 2476 244 +3 2302 2461 2303 +3 717 2467 1600 +3 250 253 2688 +3 838 1120 1119 +3 250 2688 41 +3 41 1948 250 +3 1600 2465 2464 +3 2465 2463 2464 +3 960 253 250 +3 2466 2469 2468 +3 2468 2469 2305 +3 2472 1596 714 +3 720 1596 1597 +3 1596 1594 2470 +3 1169 2471 3 +3 716 680 717 +3 2467 2472 714 +3 1841 101 2473 +3 29 100 2475 +3 100 29 102 +3 344 2489 1713 +3 255 2475 101 +3 255 29 2475 +3 60 1841 2476 +3 244 2478 2477 +3 2478 245 2477 +3 244 2476 2473 +3 2476 1841 2473 +3 167 2482 2483 +3 167 2479 2482 +3 67 254 247 +3 2481 63 2480 +3 2479 245 2478 +3 167 62 2480 +3 167 2480 2479 +3 2480 63 2479 +3 254 255 101 +3 67 255 254 +3 2482 2478 244 +3 166 2482 244 +3 2481 62 43 +3 1920 2481 43 +3 1648 31 2390 +3 62 2481 2480 +3 2483 2484 167 +3 2484 2483 15 +3 15 42 2484 +3 2487 1091 709 +3 839 2487 709 +3 2499 2180 150 +3 584 1619 1144 +3 2488 701 578 +3 2490 344 1715 +3 1703 323 1710 +3 2495 2496 1702 +3 2493 2496 88 +3 2496 2493 2497 +3 1703 2489 2498 +3 340 1715 1714 +3 88 2492 2493 +3 342 343 2493 +3 2494 1703 2498 +3 2494 2495 1703 +3 1702 2496 2497 +3 1326 212 1325 +3 431 147 798 +3 1699 1701 324 +3 1326 1702 2497 +3 2497 1327 1326 +3 1327 2497 343 +3 343 2497 2493 +3 431 798 114 +3 431 114 1436 +3 1436 114 2097 +3 2500 506 487 +3 1433 1432 148 +3 2184 2507 2185 +3 1100 2502 2394 +3 242 2607 2606 +3 841 242 2606 +3 2507 2184 2183 +3 2185 794 2184 +3 2186 2505 792 +3 2193 406 815 +3 1891 1886 12 +3 1518 1516 2511 +3 2511 1516 2510 +3 2510 1516 1536 +3 1516 1533 1536 +3 2511 1520 1518 +3 2513 839 709 +3 2515 1406 1132 +3 2515 2516 1410 +3 1441 1410 2516 +3 1441 1411 1410 +3 2518 2517 1409 +3 2515 1132 2516 +3 1669 2517 1132 +3 2516 1132 2517 +3 1407 2515 1410 +3 1441 2516 2517 +3 307 305 306 +3 2520 1404 1405 +3 2426 433 1440 +3 2520 2519 1404 +3 2525 250 1948 +3 2522 1922 2521 +3 2523 1564 1925 +3 250 249 251 +3 2525 249 250 +3 2523 1925 249 +3 1921 2524 252 +3 2524 2523 252 +3 547 545 973 +3 2542 1557 1562 +3 1560 503 2535 +3 2527 2529 1542 +3 971 546 965 +3 1541 2530 1543 +3 2527 1542 2528 +3 2537 2538 2539 +3 2538 1547 2539 +3 79 549 233 +3 849 79 233 +3 2530 512 2531 +3 2534 2528 1542 +3 2534 2535 2528 +3 512 495 2531 +3 2528 2535 500 +3 2541 1562 2533 +3 2537 2536 501 +3 2537 2540 2536 +3 1901 2544 1900 +3 2532 1541 2541 +3 1545 512 1544 +3 1545 1544 2526 +3 2538 2537 501 +3 2537 1546 2540 +3 1546 1943 2540 +3 1546 1548 1943 +3 1737 1548 1546 +3 1542 2532 2543 +3 2544 1902 289 +3 2541 2542 1562 +3 1541 2542 2541 +3 2542 1541 1557 +3 2545 1391 10 +3 2546 2545 10 +3 1399 2546 10 +3 10 2454 1399 +3 439 1391 2548 +3 582 2551 2550 +3 1610 1609 2549 +3 1616 1610 2549 +3 582 2550 2552 +3 605 1612 1611 +3 2550 1617 1616 +3 705 706 578 +3 397 2559 2556 +3 2560 2556 1606 +3 2554 2552 706 +3 2555 2553 2554 +3 2552 2549 706 +3 2552 2550 2549 +3 1616 2549 2550 +3 2554 705 2555 +3 2560 1606 574 +3 2553 2555 577 +3 397 800 799 +3 2558 2559 582 +3 2558 582 2557 +3 397 2556 2560 +3 2557 2554 2553 +3 2558 2557 2553 +3 397 799 2559 +3 1148 398 1147 +3 1192 1147 609 +3 2561 94 801 +3 842 483 2601 +3 2564 1442 1412 +3 214 1691 1690 +3 2568 2569 2567 +3 2094 2575 384 +3 199 31 2568 +3 199 2568 2567 +3 2570 18 2569 +3 1835 2574 195 +3 2572 2571 9 +3 1652 1696 2572 +3 1696 194 2572 +3 2570 193 1834 +3 1652 2572 9 +3 992 991 35 +3 2571 2573 193 +3 2570 2571 193 +3 1696 1697 194 +3 2574 1834 195 +3 2085 2086 357 +3 2576 2577 384 +3 144 2085 2576 +3 358 44 2577 +3 359 44 358 +3 601 784 632 +3 2580 2579 2404 +3 2580 631 2579 +3 2580 630 631 +3 1495 1497 1491 +3 782 2628 2629 +3 782 2584 2628 +3 556 2582 1474 +3 1475 2582 556 +3 2632 2631 417 +3 1403 464 2640 +3 2631 2586 782 +3 463 2585 558 +3 558 2585 559 +3 555 781 1475 +3 1803 1234 2588 +3 2588 1234 722 +3 722 1235 2588 +3 1803 1235 2431 +3 1803 2588 1235 +3 2589 684 1790 +3 684 1791 1790 +3 689 1787 1786 +3 689 1385 2591 +3 1382 595 2591 +3 2555 2597 577 +3 1188 604 1189 +3 650 2590 756 +3 509 1561 1535 +3 794 826 795 +3 1561 509 511 +3 396 800 801 +3 1961 1959 696 +3 2593 575 2598 +3 1608 2596 2592 +3 1961 696 2598 +3 575 1693 2598 +3 2685 2681 2171 +3 1606 2553 2600 +3 2600 2553 577 +3 577 2599 2600 +3 397 2561 801 +3 397 2560 2561 +3 1605 2600 2599 +3 2599 1608 1605 +3 1613 580 576 +3 1117 2602 1114 +3 2681 2685 2170 +3 1906 1112 1907 +3 1114 2602 957 +3 2607 242 2076 +3 829 2605 2604 +3 2334 373 2608 +3 370 2334 2608 +3 53 2608 1262 +3 366 1262 1261 +3 1262 373 1261 +3 373 1262 2608 +3 864 975 2610 +3 1051 2611 863 +3 1051 2243 2611 +3 902 901 2613 +3 902 321 901 +3 146 2621 362 +3 2616 111 902 +3 2615 2618 2619 +3 893 145 2624 +3 2615 299 2618 +3 2615 22 299 +3 362 2620 895 +3 2615 2621 22 +3 2617 303 111 +3 2624 895 2623 +3 2623 894 2624 +3 1470 22 2621 +3 358 145 893 +3 2625 2624 894 +3 896 2625 894 +3 301 2625 896 +3 2627 1742 1741 +3 1753 2627 1741 +3 2627 1753 516 +3 434 442 435 +3 2638 1409 436 +3 518 1739 1738 +3 524 1348 1347 +3 2640 464 2641 +3 2635 836 2636 +3 1768 2676 2278 +3 954 2630 410 +3 2632 2586 2631 +3 416 954 952 +3 2630 2637 782 +3 2633 414 1405 +3 414 835 1405 +3 1763 1748 2671 +3 2636 2633 417 +3 2635 2636 417 +3 489 1418 1629 +3 836 414 2636 +3 190 1405 2640 +3 2640 1405 2639 +3 1401 2644 1400 +3 1400 2644 1395 +3 1401 2643 2644 +3 2643 1401 1402 +3 2643 436 2644 +3 1669 1395 2644 +3 750 752 308 +3 14 305 307 +3 1014 2337 161 +3 307 306 153 +3 536 2654 2655 +3 2657 2656 534 +3 238 2656 2657 +3 2660 185 1836 +3 529 185 2660 +3 2658 519 238 +3 2658 238 2657 +3 97 2667 273 +3 2667 97 1165 +3 2666 570 1203 +3 1204 2662 2666 +3 936 2673 2674 +3 2678 1746 936 +3 2674 2672 1678 +3 1750 568 2680 +3 1747 2680 2679 +3 2466 2687 2465 +3 2145 2683 2682 +3 1004 2683 2145 +3 2683 1004 2684 +3 2684 1109 1910 +3 2174 2686 2682 +3 2681 2682 2686 +3 386 2689 1439 +3 2691 821 823 +3 822 821 2693 +3 1671 1554 2696 +3 1039 872 2694 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_flat_hole.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_flat_hole.off new file mode 100644 index 00000000000..3f8c87985b1 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/elephant_flat_hole.off @@ -0,0 +1,8240 @@ +OFF +2749 5489 0 +0.262933 0.102269 0.138247 +0.0843142 0.0418575 -0.0419302 +0.0676609 -0.0308717 0.133371 +0.202895 0.468475 0.0802072 +0.113075 -0.465378 -0.0546734 +0.225577 -0.277149 -0.193776 +-0.146525 -0.22403 -0.169286 +-0.0249865 -0.129931 -0.13238 +-0.160965 -0.480027 -0.0707824 +0.0794063 -0.415277 -0.0839096 +0.0469116 -0.050008 0.252355 +-0.0998372 -0.193745 -0.16268 +-0.111131 -0.104825 -0.14166 +-0.061459 -0.0977343 -0.133353 +-0.247783 -0.131539 0.0722694 +-0.145972 -0.486627 -0.0633275 +0.0916759 0.0333604 -0.133002 +-0.184954 -0.325468 -0.133853 +0.0847778 -0.432659 -0.0978527 +-0.210776 -0.299151 0.0751516 +-0.151539 -0.388715 0.01282 +-0.154564 -0.438244 -0.0249412 +-0.123411 -0.0182656 0.0135824 +0.00773278 -0.053391 -0.0428874 +-0.0774524 -0.292395 -0.106335 +0.0201594 -0.263586 0.119859 +-0.105646 -0.0365155 -0.0770751 +-0.113391 -0.41896 -0.0906771 +-0.128213 -0.46259 -0.0994907 +-0.160526 -0.468057 -0.0393445 +0.197609 -0.127492 -0.0574767 +0.0757306 -0.449539 -0.0614557 +0.147148 -0.412461 -0.0801639 +0.103782 -0.333007 0.0288926 +0.108917 -0.401981 -0.00841926 +0.11392 -0.408931 -0.0973654 +0.129733 -0.31331 -0.0672325 +0.0904388 -0.356531 -0.0803906 +0.0359798 -0.255445 -0.113562 +-0.22312 -0.107007 -0.0611904 +-0.163408 -0.433458 -0.0704785 +-0.0915185 -0.473885 -0.0165533 +-0.141417 -0.474418 -0.0834065 +-0.0944539 -0.479454 -0.0663683 +-0.085985 -0.101282 0.158093 +-0.0225438 -0.0889567 -0.0848587 +0.092707 -0.109496 -0.114561 +-0.159213 -0.159272 -0.138793 +-0.24541 -0.230248 -0.110578 +0.183744 -0.231931 0.0176086 +0.294273 -0.0955008 0.116328 +-0.16477 -0.385872 -0.0413331 +-0.185303 -0.313456 -0.00374653 +-0.297084 -0.262835 -0.00415653 +0.167756 -0.128776 0.197921 +-0.0273811 0.0608812 -0.0989637 +0.208303 0.00452459 -0.0746544 +-0.150831 -0.448909 -0.0901866 +-0.0720206 -0.147118 -0.154796 +-0.0197986 -0.210658 -0.154154 +-0.130593 -0.498558 -0.021161 +0.129662 -0.373473 -0.0794411 +-0.120692 -0.481168 -0.0685411 +-0.108692 -0.494274 -0.0429275 +-0.0970902 -0.252938 -0.14843 +-0.0098054 -0.335319 -0.0147292 +0.0769246 -0.410346 -0.0391239 +-0.132409 -0.464154 -0.0197707 +-0.102806 -0.4217 0.00855496 +-0.0760332 -0.34128 0.100617 +-0.104435 -0.377391 0.0553722 +-0.14788 -0.33188 0.0922673 +-0.151409 -0.218926 0.165812 +0.0439919 -0.147905 0.137964 +-0.0358575 -0.361749 0.0457868 +0.0284346 -0.311464 0.0537885 +0.0409609 -0.0869988 -0.085353 +0.118462 -0.0465078 -0.0483438 +-0.141108 -0.422593 -0.0846889 +-0.129145 -0.379198 -0.0712284 +-0.149426 -0.329507 -0.0473837 +-0.212723 -0.300322 -0.0706413 +-0.156151 -0.403775 -0.0651516 +-0.077704 -0.400019 -0.0437424 +-0.0783601 -0.342543 -0.0687412 +-0.0202922 -0.309739 -0.0758353 +0.0501325 -0.290557 -0.0430839 +0.0954448 -0.256567 0.0733017 +0.144565 -0.158299 0.0913557 +0.0562207 -0.179498 -0.140905 +0.16863 -0.175124 -0.176771 +0.121523 -0.241503 -0.138152 +0.196749 0.136407 0.00365942 +0.14057 0.277481 0.154966 +0.156168 -0.385879 -0.0324162 +-0.146564 -0.288069 -0.168907 +-0.212533 -0.256019 -0.170893 +0.0775241 -0.353084 -0.0221894 +-0.161054 -0.48311 -0.0516067 +-0.151386 -0.488726 -0.0297486 +-0.167299 -0.464731 -0.058517 +-0.167494 -0.44542 -0.0440266 +-0.166175 -0.416312 -0.0405929 +-0.155665 -0.409399 -0.0112037 +-0.130777 -0.428881 -0.00549876 +-0.162855 -0.460869 -0.0783452 +-0.0949104 -0.0628065 -0.118829 +-0.171364 -0.0681205 -0.104606 +-0.189411 -0.0391257 -0.0301772 +-0.201329 -0.0450332 0.0672375 +-0.0621659 -0.0595357 -0.0819357 +-0.0724451 -0.0386843 -0.0212262 +-0.0317016 -0.00827391 0.0812953 +0.125617 -0.445138 -0.086335 +0.16914 -0.45638 -0.0514974 +-0.188699 -0.102786 0.151505 +-0.127982 -0.406882 0.0143939 +-0.130706 -0.384 0.0373578 +-0.17253 -0.34721 0.0442322 +-0.136499 -0.357829 0.0655808 +-0.101729 -0.398953 0.0314689 +-0.06477 -0.393705 0.00175031 +-0.0683606 -0.382507 0.0422398 +-0.0619729 -0.361557 0.0725343 +-0.0129886 -0.329893 0.099078 +-0.0586671 -0.359537 -0.0297503 +-0.105132 -0.354471 0.0834642 +-0.111953 -0.324339 0.110194 +-0.146952 -0.298663 0.122985 +-0.147935 -0.259899 0.146585 +-0.224685 -0.230598 0.12386 +-0.194785 -0.274899 0.125615 +-0.155805 -0.154327 0.174517 +-0.215755 -0.165279 0.142947 +0.000800113 -0.199671 0.138749 +-0.0254547 -0.133829 0.140633 +0.0635315 -0.20852 0.111271 +-0.0256804 -0.0569419 0.140514 +-0.0948894 -0.0414189 0.110395 +-0.0705488 -0.0374163 0.0415111 +-0.00760713 -0.0195458 0.0164934 +0.0499878 0.0289775 0.0673286 +0.140466 0.0718009 0.144428 +-0.00188983 0.0792593 -0.003093 +0.0559872 -0.0140882 -0.011506 +-0.227407 -0.0888195 0.0117762 +-0.273528 -0.167121 -0.0102922 +-0.0402782 -0.263586 -0.140793 +-0.137564 -0.296782 -0.109847 +-0.166109 -0.381665 -0.0120175 +-0.16983 -0.360755 0.0137933 +-0.16456 -0.354211 -0.0308766 +-0.185156 -0.334386 0.0190529 +-0.207978 -0.298552 0.0310885 +-0.252507 -0.243462 0.0511336 +-0.223388 -0.268692 -0.019703 +-0.193938 -0.322649 0.048456 +-0.175095 -0.332532 0.0736524 +-0.176111 -0.310734 0.103586 +-0.147337 -0.494175 -0.0467278 +-0.129359 -0.490613 -0.0537016 +-0.148829 -0.364106 -0.0543963 +-0.120087 -0.343197 -0.0662243 +-0.130345 -0.305692 -0.0722136 +-0.171529 -0.299424 -0.0833938 +-0.181343 -0.292949 -0.0416997 +0.207831 -0.217496 -0.0966998 +0.180453 0.174523 0.151623 +0.0997558 -0.44202 -0.0211251 +0.141829 -0.427452 -0.0246256 +0.231902 -0.0518172 0.0262484 +0.222165 -0.00765217 0.131632 +0.257605 0.0468554 0.0496674 +0.134457 -0.362329 0.00455646 +0.162364 -0.298449 0.0119315 +0.167632 -0.334853 -0.0258239 +0.166781 -0.258058 -0.0451734 +0.196618 -0.203737 -0.0367216 +0.204966 -0.148702 0.029823 +0.188775 -0.0899398 0.0842549 +0.118735 -0.0897053 0.120666 +0.108518 -0.0623755 0.19827 +0.0943505 -0.134977 0.262277 +0.0987744 0.0186293 0.19077 +0.164162 -0.016078 0.17849 +0.217401 -0.0732307 0.174029 +0.244384 -0.159022 0.158735 +0.0938974 -0.414078 -0.0986619 +0.0882094 -0.386204 -0.0874415 +0.110237 -0.433985 -0.106491 +0.0752909 -0.377302 -0.0545033 +0.136893 -0.424401 -0.103861 +0.101623 -0.446793 -0.0879738 +0.0803589 -0.447974 -0.0828166 +0.0955794 -0.458697 -0.0690652 +0.0852254 -0.472952 -0.043714 +0.0423481 -0.131534 -0.117698 +0.0102534 -0.163639 -0.135844 +-0.0294235 -0.16777 -0.154302 +-0.0581903 -0.19678 -0.162941 +-0.0495263 -0.23206 -0.157295 +0.0213258 -0.204668 -0.142847 +0.0591534 -0.221375 -0.128414 +0.094939 -0.204956 -0.158559 +0.102368 -0.149902 -0.152017 +0.161838 -0.127189 -0.119413 +0.0883157 -0.255475 -0.0965547 +0.00337956 -0.243572 -0.138992 +-0.00441584 -0.28038 -0.109802 +0.139454 -0.244447 -0.0884262 +0.17799 -0.253819 -0.13106 +0.239512 -0.249475 -0.139746 +0.239769 -0.199663 -0.201225 +0.139899 -0.220537 -0.184787 +0.188104 -0.214287 -0.208834 +0.241446 -0.186766 -0.139849 +0.209446 -0.161297 -0.101029 +-0.199048 -0.317265 -0.100601 +-0.293252 -0.31357 -0.122798 +-0.243299 -0.355691 -0.130502 +-0.247594 -0.319033 -0.0988683 +-0.291668 -0.287409 -0.0637038 +-0.248832 -0.272185 -0.0865389 +-0.259174 -0.220646 -0.0469428 +-0.282126 -0.263379 -0.124759 +-0.269731 -0.294935 -0.18724 +-0.247297 -0.165961 -0.0866554 +0.0601914 -0.0464014 -0.0549033 +-0.211085 -0.18579 -0.128927 +-0.200721 -0.132547 -0.108259 +-0.0634953 -0.15489 0.179525 +0.153912 -0.0887253 -0.0733484 +0.185145 -0.0471144 -0.0260532 +0.211443 0.0144377 0.0032337 +0.139575 0.0029693 0.000737671 +0.166751 0.0710484 -0.0323169 +0.107842 0.107181 0.0410238 +0.241648 0.0800111 -0.0150955 +-0.140262 -0.4992 -0.033581 +-0.123763 -0.497978 -0.0364981 +-0.108133 -0.495253 -0.0202341 +-0.1219 -0.481038 -0.0158085 +-0.110456 -0.461331 -0.014079 +-0.087635 -0.441699 -0.0445804 +-0.0916102 -0.451765 -0.0239283 +-0.0811529 -0.421697 -0.020421 +-0.0723115 -0.470105 -0.0423155 +-0.102577 -0.44033 -0.0062072 +-0.139118 -0.480546 -0.0199347 +-0.149266 -0.466768 -0.0254061 +0.222317 -0.0925366 -0.0161067 +-0.0417433 -0.361447 0.00632817 +-0.00965295 -0.347119 0.0218202 +0.0216724 -0.318231 0.010836 +-0.00474667 -0.341486 0.0613973 +0.0698488 -0.285166 0.0205835 +-0.108371 -0.29389 -0.0941984 +-0.11094 -0.279255 -0.127432 +-0.0852691 -0.31423 -0.083395 +-0.0516331 -0.309713 -0.0908278 +-0.0463843 -0.329032 -0.0615785 +-0.13427 -0.295211 -0.140976 +-0.16029 -0.312528 -0.151535 +-0.208046 -0.313472 -0.188061 +-0.177638 -0.29982 -0.178676 +-0.173332 -0.259819 -0.179118 +-0.186949 -0.225139 -0.161631 +-0.121077 -0.271737 -0.158365 +-0.222098 -0.229029 -0.143015 +-0.254895 -0.254361 -0.158387 +-0.119307 -0.241249 -0.168619 +-0.0940058 -0.224454 -0.161034 +-0.119452 -0.213541 -0.164903 +-0.133444 -0.181194 -0.153714 +-0.123212 -0.142937 -0.146434 +-0.154852 -0.114002 -0.127562 +-0.16919 -0.193253 -0.151916 +-0.202578 -0.281459 -0.18846 +-0.238459 -0.276537 -0.185897 +-0.240282 -0.308392 -0.197824 +-0.31592 -0.411023 -0.222975 +-0.28556 -0.354091 -0.210885 +-0.235315 -0.349789 -0.176342 +-0.247249 -0.413591 -0.205119 +-0.313616 -0.39085 -0.145549 +-0.265064 -0.38952 -0.162643 +-0.137308 -0.0765217 -0.126585 +-0.138269 -0.043252 -0.101811 +-0.149787 -0.024537 -0.0569204 +-0.190238 -0.325155 -0.164883 +-0.214126 -0.342005 -0.145019 +-0.11169 -0.0249744 -0.0351987 +-0.154494 -0.0206052 -0.0150451 +-0.170024 -0.0235376 0.033341 +-0.149964 -0.0212297 0.0915499 +-0.146292 -0.0570396 0.143171 +-0.204533 -0.050976 0.0222898 +-0.222839 -0.0748301 0.0497298 +-0.218112 -0.0836084 0.106186 +-0.241131 -0.10804 0.0423425 +-0.253857 -0.126023 0.000914005 +-0.268045 -0.155579 0.0359862 +-0.254096 -0.191499 0.0837602 +-0.284127 -0.206805 0.0257642 +-0.255388 -0.139415 -0.0455141 +-0.266486 -0.179542 -0.0496151 +-0.255448 -0.200689 -0.0776309 +-0.238672 -0.192995 -0.107883 +-0.225097 -0.163824 -0.109937 +-0.22995 -0.135947 -0.0896828 +-0.209528 -0.114818 -0.0862766 +-0.197715 -0.0771741 -0.074156 +-0.18152 -0.102481 -0.104911 +-0.212552 -0.0754645 -0.0336012 +-0.179069 -0.0426745 -0.0757348 +-0.191113 -0.0400122 0.118805 +0.0761558 -0.344791 -0.0536197 +0.0734921 -0.316433 -0.0291825 +0.0865869 -0.298841 -0.0691012 +0.0805876 -0.328744 0.0029047 +0.0952029 -0.361348 0.00820626 +0.11906 -0.273469 -0.0673767 +0.0841053 -0.310717 0.0264162 +0.125408 -0.292597 0.041066 +0.0878905 -0.285295 0.052224 +0.0491288 -0.272854 0.0806291 +0.143869 -0.242882 0.0528378 +0.117789 -0.207199 0.0870858 +0.169353 -0.193132 0.0552639 +0.0969256 -0.166289 0.115505 +0.054006 -0.288058 0.0505697 +0.0199581 -0.301066 0.0971587 +0.0766599 -0.302889 0.00259846 +0.0459981 -0.299327 0.00649094 +0.0275534 -0.307808 -0.0222832 +0.0149271 -0.300169 -0.0594622 +0.0407712 -0.276916 -0.0798141 +0.0598138 -0.291021 -0.0166231 +0.105499 -0.310063 0.042044 +0.129965 -0.318676 0.0271739 +-0.0843085 -0.494264 -0.0321529 +-0.295928 -0.43397 -0.176216 +0.0851801 -0.382062 -0.0130588 +0.0187394 -0.0952484 0.145146 +0.0700063 -0.10227 0.135872 +0.0221841 -0.0461712 0.144279 +0.0234739 0.0145751 0.123876 +-0.00955997 -0.0145334 0.135796 +-0.0455413 -0.0274983 0.116817 +-0.0630042 -0.0646849 0.123712 +-0.0996182 -0.0685448 0.139479 +-0.129134 -0.0937854 0.159793 +-0.112763 -0.133107 0.183753 +-0.0586283 -0.0384282 0.0801443 +-0.0976008 -0.0306336 0.0712047 +-0.187313 -0.236737 0.146886 +-0.186919 -0.194456 0.158247 +-0.276732 -0.200888 -0.0224537 +-0.291326 -0.23573 -0.0313163 +-0.262172 -0.26119 -0.0228289 +-0.244304 -0.258186 0.0138536 +-0.238049 -0.253808 -0.053252 +-0.278468 -0.245353 0.0237178 +-0.250374 -0.233381 -0.0762153 +-0.317786 -0.266287 -0.0397057 +-0.29694 -0.227134 0.00135872 +-0.28761 -0.282597 -0.0302299 +-0.13214 -0.167949 0.192848 +-0.157713 -0.187173 0.17141 +-0.0861693 -0.139966 0.183699 +-0.0642112 -0.126048 0.16286 +-0.0525585 -0.0978366 0.139755 +0.173523 -0.0454835 0.124705 +0.124762 -0.0100876 0.132612 +0.0801162 0.0231847 0.117816 +0.0903158 0.0691509 0.0824377 +0.111706 0.138719 0.113497 +0.109897 0.0476799 0.0291314 +0.0568194 0.0789592 0.018431 +0.166721 0.186565 0.0672199 +0.252858 0.160254 0.0700128 +0.103948 0.0891733 -0.0142249 +0.151331 0.103958 0.00831307 +0.156258 0.148984 0.0332697 +0.195526 0.176469 0.0301312 +0.246249 0.159404 0.0147221 +0.272985 0.107792 0.0403664 +0.220496 0.208803 0.0718273 +0.172006 0.242405 0.105809 +0.284857 0.213191 0.163319 +0.220004 0.262975 0.168971 +0.243752 0.187223 0.124992 +0.303317 0.156118 0.132187 +0.124557 0.160014 0.070217 +0.145476 0.178627 0.113721 +0.143822 0.145597 0.146983 +0.199699 0.112576 0.148784 +0.221259 0.0552492 0.134196 +0.124553 0.109697 0.139987 +0.100062 0.0751807 0.125633 +0.107686 0.0453443 0.15701 +0.152453 0.0251604 0.154394 +0.160741 0.1045 0.158385 +0.183054 0.0708926 0.1447 +0.188656 0.0314673 0.13741 +0.286002 0.0789154 0.0896861 +0.044874 0.0868553 -0.0397086 +0.0292084 0.0351428 -0.0773123 +-0.00652383 0.0868322 -0.0563984 +0.153395 -0.330946 0.00521793 +0.165687 0.227811 0.159326 +0.176713 -0.253714 -0.180764 +0.276141 0.126578 0.0974557 +-0.0329659 -0.0648403 -0.0508016 +-0.022748 -0.0460692 -0.0136176 +-0.0397109 -0.0394184 0.0195973 +0.00993129 -0.0278328 -0.0155697 +0.0270531 -0.00832198 0.0106523 +0.0103826 0.00500549 0.0538795 +0.0666135 0.0125544 0.0261568 +0.103369 0.00889595 0.155654 +0.11659 -0.0298082 0.170544 +0.153029 -0.0696813 0.168481 +0.113461 -0.0186162 0.216944 +0.10035 -0.0580327 0.251516 +0.150235 -0.084971 0.233939 +0.0675669 -0.0946043 0.253879 +0.0719166 -0.0391569 0.214813 +0.10687 -0.103697 0.22877 +0.136543 -0.144876 0.235107 +0.147147 -0.0351617 0.149371 +0.1197 -0.0491892 0.122959 +0.148505 -0.0696344 0.112799 +0.152678 -0.114026 0.101195 +0.181641 -0.136376 0.0700095 +0.177794 -0.0667748 0.102185 +0.219377 -0.0856118 0.124697 +0.231869 -0.0572983 0.0801841 +0.250938 -0.00881912 0.0578761 +0.198815 -0.0628459 0.124187 +0.177363 -0.0676828 0.147605 +0.177944 -0.101552 0.169756 +0.213844 -0.114113 0.199683 +0.250347 -0.109904 0.165803 +0.259893 -0.130195 0.122038 +0.180633 -0.0723966 0.203599 +0.114076 -0.0955963 0.272717 +0.201886 -0.0333539 0.161782 +0.240288 -0.0485439 0.141813 +0.261312 -0.0227503 0.104643 +0.273982 -0.0593402 0.119899 +0.280362 -0.074792 0.0701015 +0.238595 0.0177583 0.0951404 +0.14643 -0.0478943 0.212489 +-0.227331 -0.265687 0.0979085 +-0.244646 -0.230401 0.0887962 +-0.293688 -0.268968 -0.164669 +-0.297979 -0.308788 -0.162348 +-0.312868 -0.346598 -0.144794 +-0.344082 -0.367401 -0.192127 +-0.317302 -0.337357 -0.184462 +-0.280828 -0.350074 -0.123607 +0.105148 0.105807 0.112878 +0.112708 0.122082 0.0774818 +0.133565 0.128779 0.0503619 +-0.153371 -0.370618 0.0324641 +0.254239 -0.0926281 0.0998171 +-0.0128437 0.0136567 0.10826 +0.0175667 0.0217155 0.0871281 +0.0477136 0.0340255 0.104217 +0.0750182 0.0489044 0.100742 +0.0776037 0.0433948 0.0700673 +0.0973389 0.0603657 0.0539823 +0.0861821 0.0686274 0.0252903 +0.0735784 0.0589072 -0.0094551 +0.0829016 0.102631 0.0164944 +0.0811061 0.0911963 0.0569078 +0.0940457 0.0476479 0.121838 +0.105428 0.0231317 0.131003 +0.0916425 -0.00738665 0.126455 +0.0604145 5.34629e-05 0.128347 +0.10359 0.0595398 0.00049955 +0.144344 0.0457444 0.00327488 +0.122523 0.0419513 -0.0300499 +0.11811 0.0162342 -0.0830375 +0.170091 0.0155571 -0.145681 +0.138389 0.0626357 -0.0743287 +0.165069 0.0235027 -0.0532363 +0.177768 0.0409007 -0.100742 +0.136707 0.0380317 -0.122381 +0.124141 0.00775387 -0.157586 +0.154959 -0.000810753 -0.105169 +0.105591 0.0562623 -0.100272 +0.0594242 0.0548004 -0.106957 +0.201162 -0.0168583 -0.120783 +0.0976411 0.0972697 0.0801317 +0.0943337 0.0848541 0.102457 +0.0890479 0.0650811 0.109825 +0.0389773 0.0745551 -0.0779593 +0.0138551 0.0593589 -0.108474 +0.0773146 0.0765993 -0.0629692 +0.118409 0.00125651 -0.11931 +0.14578 -0.0101392 -0.137264 +0.178622 -0.0192175 -0.148664 +0.15461 0.0388676 -0.0266866 +0.193622 0.0322602 -0.0272748 +0.1942 0.050466 -0.0642106 +0.173634 0.0303747 -0.00069076 +0.179101 -0.0110744 -0.00523936 +0.230507 0.0422098 -0.0173425 +0.202418 0.070871 -0.0135348 +0.22302 0.0184239 -0.0441485 +0.215157 -0.0248187 0.00288885 +0.233855 -0.00344678 0.0259658 +0.238719 0.033163 0.0205233 +0.25481 0.0672767 0.0179763 +0.222129 -0.0581209 -0.00731524 +0.227145 -0.0819987 0.0145053 +0.219253 -0.118982 0.0109807 +0.211654 -0.158762 -0.0192499 +0.210611 -0.101269 0.0490966 +0.200451 -0.190104 0.0116714 +0.203938 -0.0712158 -0.0282028 +0.173774 -0.0735362 -0.0475631 +0.2027 -0.10102 -0.0400541 +0.212795 -0.129107 -0.0298945 +0.206091 -0.151217 -0.0455168 +0.202467 -0.150775 -0.0745887 +0.209378 -0.187531 -0.0743719 +0.181149 -0.126003 -0.0892617 +0.205972 -0.177843 -0.0383337 +0.188301 -0.142819 -0.114464 +0.208779 -0.164491 -0.140437 +0.171227 -0.151151 -0.147387 +0.136617 -0.138704 -0.143839 +0.131975 -0.166643 -0.169617 +0.128263 -0.113939 -0.11894 +0.116875 -0.0858965 -0.091059 +0.0786764 -0.0829677 -0.090746 +0.187859 -0.214057 -0.0686071 +0.175679 -0.237132 -0.0957975 +0.178163 -0.10588 -0.0665832 +0.269129 0.0763722 0.0451229 +0.27889 0.058723 0.0679827 +0.267652 0.0453551 0.105512 +0.2613 0.0363273 0.0775663 +0.250278 0.0199214 0.0566543 +0.250269 0.00638094 0.0769677 +0.262967 -0.0160504 0.0796628 +0.285344 -0.0433845 0.0872574 +0.24971 -0.0386027 0.0640826 +0.229012 -0.0528564 0.0533874 +0.210073 -0.0746435 0.0657137 +0.221889 -0.0775407 0.0410909 +0.302572 -0.0710887 0.0949218 +0.236871 -0.0290995 0.0413907 +0.21774 0.0486965 -0.0445342 +0.224846 0.0339602 -0.0740774 +0.244042 0.0044793 -0.10874 +0.254336 0.102378 0.0100739 +0.220262 0.108437 -0.00385435 +0.184431 0.103867 -0.0063665 +0.227766 0.138272 0.00117268 +0.21603 0.168687 0.00560537 +0.214962 0.252952 4.36931e-05 +0.24674 0.211475 0.00674743 +0.208103 0.206716 0.00898043 +0.198252 0.239152 0.0425261 +0.241235 0.183275 -0.00372162 +0.24846 0.187657 0.0253371 +0.236173 0.217937 0.0406376 +0.208251 0.202717 0.0430183 +0.190765 0.204953 0.0676283 +0.199822 0.228771 0.0907818 +0.212055 0.262964 0.121847 +0.167888 0.20936 0.0941323 +0.230768 0.216285 0.106419 +0.226441 0.220307 0.1523 +0.160904 0.217518 0.126833 +0.151535 0.251202 0.133586 +0.158786 0.306935 0.0984538 +0.193903 0.396086 0.195106 +0.119767 0.364922 0.154966 +0.158434 0.284691 0.125614 +0.188265 0.327264 0.175224 +0.139712 0.323472 0.144742 +0.247398 0.226772 0.208026 +0.162628 0.357991 0.158091 +0.132463 0.334186 0.215838 +0.184892 0.418747 0.128073 +0.148158 0.405567 0.1589 +0.116952 0.392105 0.208798 +0.128904 0.307582 0.18276 +0.173163 0.280669 0.197839 +0.237808 0.190239 0.0542196 +0.242415 0.187695 0.0885314 +0.257589 0.159811 0.105872 +0.25799 0.149475 0.1552 +0.249199 0.167605 0.0439231 +0.270589 0.141138 0.0478035 +0.291007 0.120776 0.0668204 +0.27986 0.0943457 0.0648346 +0.262028 0.128688 0.0220064 +0.283888 0.104244 0.08796 +0.278117 0.09277 0.114653 +0.296211 0.119268 0.134225 +0.25745 0.0686993 0.129638 +0.231499 0.0874258 0.144645 +0.23624 0.121986 0.150481 +0.21822 0.158716 0.152133 +0.276736 0.0681718 0.110294 +0.286087 0.0545245 0.0921962 +0.114064 0.342002 0.184102 +0.184346 0.361594 0.187357 +0.161147 0.378013 0.229421 +0.186402 0.32651 0.232026 +0.224199 0.278314 0.231623 +0.178684 0.387524 0.165454 +0.207571 0.416517 0.162223 +0.115261 0.360345 0.210089 +0.111327 0.375408 0.183082 +0.123148 0.405595 0.17979 +0.161317 0.441861 0.200022 +0.134075 0.42215 0.208124 +0.166581 0.413272 0.221996 +0.184888 0.467555 0.155941 +0.139501 0.435526 0.173911 +0.158717 0.435906 0.144337 +0.167498 0.45215 0.103084 +0.137763 0.359978 0.22921 +0.165611 0.348074 0.227085 +0.15984 0.318857 0.217125 +0.185554 0.304169 0.211919 +0.205103 0.278784 0.204981 +0.244841 0.279219 0.196675 +0.226891 0.25345 0.209087 +0.216714 0.31142 0.225032 +0.18164 0.33693 0.20427 +0.203702 0.303717 0.18726 +0.193627 0.296232 0.146589 +0.191637 0.257284 0.18429 +0.157803 0.257523 0.177293 +0.175634 0.311565 0.125155 +0.161107 0.457828 0.173386 +0.194169 0.447882 0.185268 +0.194408 0.477711 0.118315 +0.219599 0.449898 0.13857 +0.135294 0.387364 0.228733 +0.145147 0.282789 0.187345 +0.143956 0.303159 0.203618 +0.177446 0.366384 0.212315 +0.179329 0.391491 0.217312 +0.18672 0.412483 0.210145 +0.202606 0.421792 0.189409 +0.174085 0.42914 0.210627 +0.153641 0.426813 0.21312 +0.144424 0.408706 0.223131 +0.190464 0.428693 0.201747 +0.178837 0.441581 0.19921 +0.169704 0.452082 0.187978 +0.180705 0.459908 0.173619 +0.202088 0.458198 0.166952 +0.151672 0.449754 0.186725 +0.142475 0.436806 0.198199 +0.127991 0.425256 0.188222 +0.210178 0.437176 0.172385 +0.119636 0.410278 0.199562 +0.206557 0.46857 0.145869 +0.215386 0.468035 0.123827 +0.207969 0.436894 0.106764 +0.212477 0.477963 0.10116 +0.128023 0.4054 0.215288 +0.223073 0.454408 0.0921651 +0.184017 0.321535 0.149004 +0.164058 0.339436 0.133054 +0.141763 0.356765 0.138374 +0.138767 0.331395 0.111494 +0.18387 0.5 0.0894472 +0.178253 0.341112 0.15974 +0.158692 0.397227 0.229447 +0.261987 0.258572 0.22454 +0.209557 0.191204 0.156985 +0.19703 0.220129 0.168363 +0.114158 0.395299 0.191384 +0.237163 0.239354 0.0176536 +0.22873 0.228755 -0.0079498 +0.204237 0.229854 -0.000985107 +0.191898 0.248869 0.0164149 +0.195144 0.299533 0.0501168 +0.211408 0.277777 0.0261684 +0.181525 0.269092 0.042102 +0.232338 -0.0296485 0.018274 +0.220704 0.448894 0.117889 +0.211836 0.430361 0.128709 +0.200007 0.22745 0.0221073 +0.206622 0.221816 0.0395427 +0.223655 0.239447 0.0484776 +0.206846 0.263872 0.061817 +0.192412 0.289403 0.0880222 +0.200823 -0.0669613 0.089238 +0.1998 0.487191 0.0879627 +0.178418 0.478766 0.0726805 +0.171907 0.478 0.098484 +0.179607 0.4432 0.070784 +0.215421 0.44036 0.0572748 +0.206111 0.438517 0.081171 +0.184196 0.432818 0.0953164 +0.172787 0.433405 0.115219 +0.16681 0.454422 0.128591 +0.158037 0.463512 0.080819 +0.300027 -0.106441 0.0798503 +0.301565 -0.138608 0.110073 +0.223785 -0.0676095 0.104371 +0.244386 -0.0720528 0.0937201 +0.25624 -0.0594904 0.0758547 +0.271472 -0.0437947 0.0690266 +0.283677 -0.0568988 0.0744319 +0.294284 -0.0698767 0.0795338 +0.293906 -0.0887216 0.0736412 +0.275743 -0.101071 0.0877101 +0.309738 -0.0894098 0.0874741 +0.287014 -0.123527 0.0945964 +0.311125 -0.118131 0.0991123 +0.298899 -0.117613 0.118193 +0.276193 -0.109289 0.135451 +0.270493 -0.137621 0.153632 +0.286312 -0.136798 0.132025 +0.257826 -0.0797919 0.144654 +0.303792 -0.0864306 0.104131 +0.28817 -0.0747287 0.113826 +0.276632 -0.0878111 0.128274 +0.30695 -0.103289 0.107245 +0.287682 -0.0559229 0.10414 +0.272738 -0.0407993 0.108633 +0.253435 -0.0365139 0.124117 +0.295415 -0.0573592 0.0898843 +0.270105 -0.0629299 0.0693418 +0.263375 -0.0783235 0.0820667 +-0.216962 -0.20051 0.140681 +-0.236047 -0.180496 0.115013 +-0.230292 -0.136771 0.112494 +-0.247625 -0.159292 0.0914591 +-0.209896 -0.129892 0.141237 +0.222682 0.288177 0.190351 +0.233778 0.296853 0.212089 +0.209365 0.287061 0.167624 +0.208618 0.271128 0.146657 +0.223776 0.247151 0.14266 +0.250594 0.280585 0.221005 +0.215525 0.238928 0.164607 +0.248724 0.243405 0.176599 +0.282927 0.23674 0.194658 +0.253819 0.208937 0.178714 +0.265424 0.184312 0.155732 +0.308614 0.169998 0.183237 +0.273365 0.179729 0.192265 +0.265912 0.204786 0.204674 +0.300509 0.203464 0.194384 +0.281969 0.151677 0.177526 +0.279246 0.127373 0.158699 +0.31079 0.143896 0.162421 +0.30954 0.171009 0.155179 +0.288086 0.1804 0.137744 +0.264265 0.175268 0.132545 +0.241184 0.168571 0.143536 +0.282052 0.162312 0.123541 +0.290218 0.138764 0.11928 +0.232003 0.191432 0.146429 +0.237199 0.211128 0.131059 +0.175486 0.13591 0.157401 +0.244193 0.0453066 0.121153 +0.216838 0.0295154 0.115567 +0.0778181 0.0182774 -0.0959304 +0.132697 0.385267 0.165833 +0.155812 0.38306 0.160495 +-0.00373338 0.0386319 -0.0871428 +0.0052284 0.0508015 -0.0521262 +-0.0272532 0.0521944 -0.0650671 +-0.0417118 0.0760468 -0.0274796 +0.0432101 0.0478592 -0.0430105 +0.0360437 0.064037 -0.0095129 +0.0264403 0.0878588 0.0105855 +0.0200841 0.0963175 -0.0204482 +0.0508265 0.0939603 -0.0091335 +0.0753367 0.087282 -0.0290458 +-0.0114666 0.0989277 -0.0268583 +0.189464 0.426182 0.111762 +-0.04038 -0.0265907 0.0536548 +0.188037 0.19051 0.048384 +0.170897 0.170857 0.0404072 +0.180803 0.154042 0.0195245 +0.168583 0.128396 0.0100026 +0.150344 0.161847 0.0580756 +0.146195 0.173828 0.0846654 +0.123104 0.163389 0.100752 +0.131952 0.158423 0.126057 +0.154039 0.169296 0.137953 +0.163282 0.191526 0.127822 +0.170691 0.206066 0.147249 +0.123979 0.136658 0.135 +0.136161 0.125537 0.148878 +0.153818 0.131557 0.161379 +0.111897 0.12133 0.126074 +0.111889 0.144276 0.0890707 +0.11658 0.140768 0.0690434 +0.119959 0.124948 0.0613596 +0.107779 0.107117 0.0626571 +0.122618 0.115267 0.0466942 +0.127454 0.104238 0.0219653 +0.136258 0.119892 0.0320023 +0.129073 0.0915077 -0.00265103 +0.130797 0.0780035 -0.0369633 +0.10768 0.094992 0.00979378 +0.163926 0.154671 0.152149 +0.0894836 0.0909923 0.00058556 +0.0689505 0.0963924 0.00171312 +0.0612997 0.100634 0.0224348 +0.0675451 0.0846698 0.038694 +0.0795109 0.103357 0.0384133 +0.0848094 0.0754581 0.0444653 +0.110567 0.10366 0.130086 +0.12281 0.0864143 0.139975 +0.117855 0.062854 0.143513 +0.13666 0.0472165 0.155281 +0.128164 0.0235742 0.176647 +0.163067 0.0498951 0.143567 +0.143932 0.0949004 0.145284 +0.179917 0.317727 0.0742859 +0.183725 0.275085 0.0676723 +0.16838 0.29297 0.0787056 +0.0930951 0.102542 0.05002 +0.100339 0.0681106 0.0373411 +0.102886 0.0622715 0.0197467 +0.121511 0.0540863 0.0117598 +0.124719 0.0242285 0.0166428 +0.0967861 -0.00310471 -0.0020113 +0.12138 0.0519179 -0.0102922 +0.0990646 0.0492208 -0.022422 +0.0873807 -0.0275369 -0.03209 +0.200694 -0.191636 -0.0546067 +0.206298 -0.170055 -0.0598788 +0.209964 -0.168421 -0.0791806 +0.221182 -0.183261 -0.0963771 +0.222775 -0.172837 -0.120159 +0.235715 -0.195921 -0.115182 +0.253933 -0.218526 -0.134037 +0.311213 -0.253911 -0.191866 +0.279294 -0.244732 -0.16099 +0.266185 -0.201338 -0.169529 +0.285572 -0.216415 -0.213382 +0.273765 -0.285731 -0.187819 +0.259679 -0.265381 -0.248632 +0.24894 -0.227823 -0.231771 +0.232153 -0.25966 -0.225227 +0.254118 -0.290735 -0.220386 +0.336364 -0.328047 -0.241676 +0.281317 -0.319577 -0.26697 +0.295033 -0.317038 -0.218433 +0.327766 -0.263669 -0.27537 +0.320681 -0.238904 -0.235706 +0.333487 -0.28367 -0.222752 +0.25789 -0.299076 -0.25318 +0.280382 -0.278404 -0.287734 +0.262726 -0.334272 -0.234674 +0.315714 -0.303377 -0.28762 +0.358898 -0.298323 -0.270079 +0.292961 -0.250812 -0.263064 +0.260427 0.269097 0.206442 +0.273912 0.251948 0.207483 +0.274266 0.226866 0.218876 +0.254508 0.262332 0.186312 +0.268737 0.247011 0.182676 +0.278883 0.230014 0.174886 +0.292676 0.216891 0.181537 +0.301666 0.196568 0.170643 +0.235991 0.25839 0.179999 +0.216996 0.262302 0.191107 +0.233602 0.240223 0.192553 +0.26623 0.217767 0.166603 +0.291208 0.219735 0.206357 +0.285626 0.200003 0.208179 +0.295054 0.181857 0.198439 +-0.119559 -0.0454446 0.130205 +-0.148541 -0.0288065 0.124554 +-0.122421 -0.0280036 0.104512 +-0.169628 -0.0428483 0.136658 +-0.192691 -0.0700149 0.138018 +-0.165949 -0.0805689 0.151606 +-0.157867 -0.111652 0.162619 +-0.182289 -0.134815 0.160033 +-0.171616 -0.0265274 0.119564 +-0.182821 -0.0294707 0.089096 +-0.207158 -0.0941133 0.130893 +-0.0813687 -0.408143 0.0168626 +-0.0232624 -0.242141 -0.150317 +0.237084 0.148575 0.150278 +0.21825 0.135883 0.152701 +0.196547 0.147262 0.152063 +0.248839 0.134889 0.149793 +0.25417 0.116897 0.146677 +0.154738 -0.248351 -0.113516 +0.149894 -0.252291 -0.14374 +0.127807 -0.247316 -0.112579 +0.100037 -0.239188 -0.118127 +0.171952 -0.258325 -0.155783 +0.206243 -0.267544 -0.164319 +0.152779 -0.244265 -0.170212 +0.238869 -0.271194 -0.164355 +0.19948 -0.240785 -0.114164 +0.228533 -0.228656 -0.117975 +0.0806348 -0.448964 -0.0364622 +0.092817 -0.46403 -0.0236687 +0.131465 -0.464547 -0.0186627 +0.111576 -0.45856 -0.0162136 +0.12236 -0.437795 -0.0167687 +0.116113 -0.473014 -0.0333379 +0.141834 -0.466374 -0.0462667 +0.15629 -0.45187 -0.0265272 +0.162053 -0.430562 -0.0436087 +0.170805 -0.433786 -0.074571 +0.150694 -0.440322 -0.089161 +0.142403 -0.453672 -0.0687084 +0.20922 0.0225383 -0.118012 +0.245897 0.00269769 -0.0710137 +-0.0868896 -0.445579 -0.0827631 +-0.0899978 -0.418668 -0.0662628 +-0.0919895 -0.382051 -0.0731611 +-0.286076 -0.18977 0.00251657 +0.166397 -0.235956 -0.0665238 +0.18289 -0.231659 -0.0402536 +0.183601 -0.256036 -0.0114407 +0.19304 -0.222737 -0.0114233 +0.168396 -0.264129 0.0198747 +0.175145 -0.292863 -0.0261367 +0.159612 -0.311932 -0.0502102 +0.151795 -0.349231 -0.058414 +0.168467 0.120276 0.165442 +0.179322 0.109989 0.151163 +0.191745 0.091503 0.1476 +0.207409 0.0731218 0.143583 +0.170472 0.088013 0.148441 +0.198308 0.0526608 0.137187 +-0.288444 -0.322548 -0.196751 +-0.258254 -0.336596 -0.201797 +-0.260706 -0.370334 -0.191889 +-0.262012 -0.38355 -0.234182 +0.169409 0.331718 0.106522 +-0.0883279 -0.427369 -0.00320489 +-0.0757242 -0.410706 -0.00350047 +-0.0694098 -0.396348 -0.0215868 +-0.339105 -0.28249 -0.133907 +0.14338 -0.190029 -0.185968 +0.113197 -0.189729 -0.178573 +0.161752 -0.208101 -0.1989 +0.163143 -0.233988 -0.192556 +0.187542 -0.24244 -0.20457 +0.214342 -0.231174 -0.221761 +0.200695 -0.263551 -0.191549 +0.0888974 -0.174918 -0.165344 +0.0728578 -0.155488 -0.148655 +0.0857975 -0.13271 -0.133069 +0.0496654 -0.153477 -0.133288 +0.208417 -0.252602 -0.211864 +0.214499 -0.20684 -0.209109 +0.212326 -0.182246 -0.176825 +0.196622 -0.193456 -0.194925 +-0.0366034 0.0848157 -0.0747335 +-0.0106036 0.0767347 -0.0825468 +-0.248014 -0.143811 -0.0711582 +0.156176 -0.353723 -0.00967102 +0.161881 -0.35946 -0.0354879 +0.154192 -0.374021 -0.054565 +0.153835 -0.401954 -0.0551512 +0.147106 -0.376782 -0.0111704 +0.141013 -0.401853 -0.0175381 +0.127378 -0.38782 -0.00428773 +0.152558 -0.410563 -0.0345712 +0.144573 -0.387551 -0.0699167 +0.129797 -0.395951 -0.0860393 +0.110844 -0.383365 -0.0877166 +0.111358 -0.362136 -0.0828181 +0.10863 -0.332992 -0.0757964 +0.131091 -0.348484 -0.0736181 +0.114528 -0.372564 0.00601769 +0.116893 -0.350867 0.0177725 +0.143657 -0.369483 -0.0686154 +0.0433039 -0.239647 0.0998892 +-0.318832 -0.357055 -0.211401 +-0.299837 -0.377374 -0.238049 +-0.340344 -0.383626 -0.224893 +-0.356366 -0.419986 -0.188103 +-0.285529 -0.404192 -0.228972 +-0.356375 -0.393121 -0.201407 +-0.349321 -0.392013 -0.165399 +-0.328811 -0.42272 -0.163607 +-0.345548 -0.417553 -0.216974 +-0.322795 -0.427865 -0.195551 +-0.33518 -0.363207 -0.161311 +-0.0812327 -0.396788 0.0342935 +-0.065289 -0.38943 0.0224745 +-0.0508718 -0.371639 0.0298172 +-0.260668 -0.216401 0.0653687 +-0.2704 -0.185201 0.0538295 +0.187032 0.486356 0.0996338 +0.279593 -0.136382 0.110973 +0.26837 -0.117918 0.105466 +0.248285 -0.109463 0.116456 +0.232397 -0.125931 0.141691 +0.210603 -0.141776 0.171116 +0.137574 -0.108705 0.207737 +0.169921 0.29167 0.0522744 +0.00992085 -0.113945 -0.0964453 +0.258261 -0.257702 -0.154872 +0.275321 -0.267702 -0.17038 +0.295633 -0.272896 -0.184932 +0.295815 -0.294739 -0.20199 +0.314713 -0.27743 -0.201437 +0.327332 -0.256197 -0.214678 +0.340385 -0.261017 -0.241446 +0.313356 -0.232789 -0.209684 +0.296344 -0.226073 -0.182212 +0.31592 -0.301772 -0.216769 +0.318635 -0.326842 -0.222796 +0.307178 -0.325937 -0.251416 +0.274745 -0.303144 -0.21295 +0.263287 -0.308346 -0.232527 +0.255382 -0.319889 -0.248754 +0.332002 -0.310475 -0.229091 +0.353636 -0.307458 -0.245121 +0.335859 -0.313851 -0.265914 +0.340499 -0.300896 -0.286697 +0.344989 -0.280039 -0.276203 +0.327449 -0.28026 -0.295194 +0.304942 -0.268737 -0.28762 +0.34983 -0.283684 -0.251927 +0.343136 -0.265469 -0.261534 +0.326713 -0.248963 -0.256716 +0.307917 -0.24034 -0.252462 +0.279159 -0.231625 -0.241522 +0.300353 -0.229376 -0.234338 +0.311358 -0.251222 -0.26759 +0.299024 -0.289572 -0.301481 +0.279907 -0.305571 -0.290358 +0.263002 -0.29286 -0.276914 +0.260616 -0.313748 -0.268771 +0.275922 -0.322371 -0.224156 +0.284975 -0.33259 -0.244221 +0.303023 -0.336946 -0.233483 +0.289605 -0.333838 -0.221905 +0.166435 0.39886 0.154509 +0.189152 0.404825 0.153461 +0.197133 0.400723 0.1737 +0.17424 0.413608 0.143911 +0.169142 0.426834 0.132439 +0.188725 0.386035 0.180698 +0.186219 0.378081 0.198788 +-0.267025 -0.372115 -0.138391 +-0.248022 -0.367522 -0.158602 +0.174505 0.292586 0.0990952 +0.186251 0.309263 0.0928235 +0.181697 0.30513 0.109614 +0.189499 0.279776 0.119317 +0.172647 0.294457 0.120787 +0.158057 0.303956 0.130265 +0.143476 0.291331 0.139139 +0.131312 0.30031 0.159002 +0.186095 0.298863 0.131041 +0.198975 0.28677 0.132576 +0.172236 0.277192 0.117866 +0.184313 0.260452 0.109718 +0.15755 0.265746 0.122578 +0.145983 0.269471 0.137935 +0.151234 0.256355 0.155644 +0.124293 0.323596 0.164277 +0.126678 0.342635 0.150186 +0.129524 0.341544 0.128525 +0.146576 0.349856 0.118779 +0.192269 0.30374 0.0759625 +0.202728 0.285813 0.0690781 +0.210479 0.281567 0.0483558 +0.222196 0.26209 0.0407369 +0.224073 0.261141 0.0186008 +0.162756 0.306191 0.114529 +0.149682 0.318744 0.121136 +0.152677 0.341974 0.100993 +0.164071 0.331208 0.0841361 +0.146523 0.323278 0.093798 +0.15695 0.312461 0.0714443 +0.22266 -0.203518 -0.100877 +0.262076 -0.292278 -0.202356 +0.249754 -0.28212 -0.183581 +0.242451 -0.284733 -0.203885 +0.229725 -0.273053 -0.211906 +0.243386 -0.275428 -0.225419 +0.255999 -0.283472 -0.239546 +-0.261873 -0.405224 -0.222848 +-0.280772 -0.420055 -0.201182 +-0.274389 -0.414773 -0.173401 +-0.298626 -0.411672 -0.158377 +-0.28738 -0.389898 -0.148508 +-0.300008 -0.369107 -0.135836 +-0.257381 -0.39915 -0.185758 +-0.257531 -0.421709 -0.186727 +-0.319983 -0.369357 -0.146016 +-0.25404 -0.39271 -0.206532 +-0.269186 -0.375948 -0.213104 +0.171129 0.312683 0.0555484 +0.186538 0.309469 0.0612947 +0.17697 0.322584 0.0897939 +0.180094 0.317456 0.102692 +0.0389455 -0.294719 0.0707663 +0.19085 0.129482 0.148059 +0.26893 -0.330546 -0.250405 +0.261495 -0.324416 -0.260179 +0.163955 0.0845671 -0.00775852 +0.172992 0.467003 0.114773 +0.17962 0.47069 0.135115 +0.167392 0.460661 0.148013 +0.0927702 -0.0102964 0.178794 +0.0791092 -0.00358862 0.211868 +0.0484002 -0.0727004 0.143042 +0.0857054 -0.0664246 0.132462 +0.170606 0.462905 0.162683 +0.107346 -0.291576 0.0507084 +0.123054 -0.26548 0.0555752 +0.1033 -0.273351 0.0618915 +-0.217347 -0.0684085 0.0793768 +-0.232534 -0.1003 0.0785864 +0.160705 0.203815 0.112095 +0.157448 0.189802 0.0951937 +0.163855 0.222961 0.107992 +0.178039 0.226994 0.0939715 +0.157779 0.236558 0.121407 +0.156862 0.233096 0.141593 +0.254115 0.147478 0.0328869 +0.246739 0.139758 0.0163119 +-0.313249 -0.26088 -0.138114 +-0.319034 -0.272336 -0.0954566 +-0.312031 -0.286413 -0.151154 +-0.318615 -0.301412 -0.127758 +-0.31358 -0.30952 -0.0911544 +-0.342054 -0.297563 -0.104135 +-0.285707 -0.289103 -0.098473 +-0.332554 -0.290038 -0.0650158 +0.224391 0.444149 0.0748945 +0.224127 0.466497 0.0733316 +0.00933378 -0.0890982 -0.073455 +-0.196836 -0.0544369 -0.0547609 +-0.268852 -0.35939 -0.204575 +-0.134821 -0.144762 0.184037 +-0.134018 -0.119846 0.172991 +-0.108849 -0.110436 0.169417 +-0.142893 -0.258813 -0.176858 +0.163435 0.422628 0.144619 +0.149105 0.425301 0.157986 +0.151653 0.445126 0.160854 +0.205634 0.453218 0.0682861 +0.196116 0.437078 0.0613117 +0.305429 0.136514 0.131635 +0.304223 0.128705 0.150462 +0.294739 0.1352 0.16485 +0.29983 0.148475 0.176204 +0.293633 0.16134 0.186506 +0.312816 0.146868 0.144611 +0.290574 0.119539 0.149687 +0.280449 0.10933 0.137413 +0.285959 0.112117 0.117297 +0.154398 0.116961 0.162863 +0.147042 0.108372 0.152274 +0.179394 0.214392 0.162515 +0.185651 0.194518 0.157404 +0.180628 0.232354 0.173507 +0.198969 0.238329 0.174545 +0.207694 0.253512 0.177641 +0.203869 0.264161 0.186147 +0.189501 0.273156 0.193533 +0.17312 0.263127 0.188581 +-0.206119 -0.0619918 0.116346 +-0.201545 -0.0465532 0.095691 +0.256266 0.152102 0.0503785 +0.264034 0.143148 0.0672501 +0.26342 0.152022 0.0867622 +0.269601 0.144159 0.103885 +0.281713 0.137095 0.0629023 +0.296165 0.127981 0.0376256 +0.300117 0.13462 0.0559043 +0.287642 0.140563 0.0456708 +0.278661 0.132147 0.0309413 +0.271646 0.118273 0.028754 +0.262921 0.1025 0.0261376 +0.261118 0.0855637 0.0169037 +0.25422 0.0767023 0.000233527 +0.237362 0.0575218 0.00198963 +0.283388 0.119704 0.0383643 +0.282941 0.112062 0.0540402 +0.249937 0.0937398 -0.00575339 +0.231931 0.0954578 -0.0107377 +0.210437 0.0914748 -0.0140972 +0.239252 0.109782 0.000233887 +0.191402 0.0870306 -0.0134669 +0.184376 0.0704441 -0.0225342 +0.184719 0.0606504 -0.044543 +0.166145 0.0578967 -0.0668264 +0.200251 0.061117 -0.0313226 +0.217304 0.057967 -0.0199728 +0.227686 0.12158 0.00370932 +0.20937 0.123042 0.000300618 +0.244333 0.124524 0.00810813 +0.295429 0.120597 0.0522453 +0.178132 0.0791963 -0.0112798 +0.177197 -0.279627 -0.000252101 +0.173639 -0.299787 -0.00606886 +0.172196 -0.313975 -0.0223573 +0.166117 -0.326159 -0.00858114 +0.168079 -0.321719 -0.0379096 +0.162521 -0.339731 -0.0445028 +0.151373 -0.32895 -0.0576036 +0.312369 -0.105021 0.0899766 +0.306 -0.11652 0.0866674 +0.301418 -0.129182 0.0942967 +0.290875 -0.135236 0.101483 +0.289966 -0.143698 0.1109 +0.295915 -0.13953 0.122573 +0.279108 -0.148197 0.122497 +0.27841 -0.152315 0.142258 +0.265867 -0.157983 0.158785 +0.256687 -0.14661 0.137703 +0.25422 -0.140442 0.172759 +0.232237 -0.161116 0.192798 +0.192807 -0.160413 0.202508 +0.178601 -0.140578 0.237092 +0.154384 -0.117167 0.24831 +0.13004 -0.134226 0.269277 +0.17845 -0.105479 0.223698 +0.247464 -0.158843 0.179106 +0.226891 -0.158442 0.171794 +0.209982 -0.159856 0.187271 +0.217821 -0.141328 0.207646 +0.23745 -0.141109 0.186416 +0.229503 -0.142546 0.156329 +0.214657 -0.125289 0.155947 +0.193847 -0.12199 0.171057 +0.217246 -0.105649 0.140104 +0.198069 -0.0856194 0.142621 +0.193693 -0.14343 0.18682 +0.198045 -0.145975 0.222277 +0.178989 -0.164931 0.225321 +0.158831 -0.146831 0.218292 +0.158889 -0.159611 0.244735 +0.138513 -0.154491 0.257842 +0.156487 -0.13924 0.256434 +-0.290841 -0.208347 -0.00770324 +-0.29533 -0.224009 -0.017137 +-0.30561 -0.24462 -0.0155011 +-0.278365 -0.220452 -0.0277869 +-0.267819 -0.241114 -0.0357093 +-0.286737 -0.259306 -0.0462551 +-0.310093 -0.264404 -0.0203987 +-0.307167 -0.250649 -0.0341839 +-0.307612 -0.281242 -0.0310235 +-0.321036 -0.286281 -0.0471544 +-0.310491 -0.270102 -0.0639157 +-0.311345 -0.301149 -0.0633156 +-0.297683 -0.291436 -0.0450671 +-0.294949 -0.304108 -0.0790095 +-0.285459 -0.27779 -0.0488974 +-0.296472 -0.275126 -0.0168658 +-0.276222 -0.270671 -0.00788631 +-0.246454 -0.248267 -0.0329014 +-0.244456 -0.252303 -0.00937036 +-0.304286 -0.259682 -0.0492577 +-0.294933 -0.27203 -0.0604957 +-0.300998 -0.278796 -0.0743602 +-0.316674 -0.274623 -0.0789273 +-0.337714 -0.280945 -0.0853892 +-0.325825 -0.275251 -0.0655092 +-0.332977 -0.302425 -0.0833069 +-0.293564 -0.290291 -0.0772666 +-0.298024 -0.281309 -0.0905074 +-0.293634 -0.272694 -0.109468 +-0.270428 -0.274072 -0.107657 +-0.256077 -0.253991 -0.120812 +-0.261078 -0.296954 -0.0999473 +-0.2381 -0.297373 -0.0849839 +-0.232752 -0.278906 -0.0645746 +-0.272041 -0.319246 -0.10842 +-0.21032 -0.284441 -0.0448701 +-0.256436 -0.341131 -0.11181 +-0.225098 -0.336223 -0.113241 +-0.200175 -0.288996 -0.0158483 +-0.223009 -0.317757 -0.0905879 +-0.301096 -0.262202 -0.123506 +-0.32405 -0.263071 -0.116908 +-0.292477 -0.257052 -0.14263 +-0.270149 -0.255918 -0.142108 +-0.275486 -0.258003 -0.162669 +-0.259523 -0.2674 -0.178244 +-0.251069 -0.250018 -0.0970302 +-0.24056 -0.260706 -0.172311 +-0.232499 -0.247239 -0.154361 +-0.34182 -0.274562 -0.107339 +-0.294559 -0.307923 -0.0994756 +-0.275844 -0.269552 -0.0355918 +-0.227344 -0.270897 -0.045083 +0.25093 0.170443 0.120028 +0.248384 0.184009 0.106523 +0.235777 0.198062 0.103222 +0.23641 0.211305 0.086191 +0.221152 0.226047 0.0898201 +0.223243 0.24123 0.111495 +0.203883 0.250541 0.105061 +0.226958 0.225862 0.123117 +0.219737 0.240254 0.12789 +0.214138 0.253162 0.132941 +0.232275 0.224561 0.138088 +0.109391 -0.247931 -0.0995264 +0.104952 -0.262437 -0.0820427 +0.080763 -0.274056 -0.0783487 +0.0604155 -0.262392 -0.0950373 +-0.227936 -0.329497 -0.190147 +-0.214125 -0.337031 -0.170051 +0.263325 -0.0528405 0.0685009 +0.251926 -0.0484757 0.0715634 +0.237277 -0.0480579 0.0658708 +0.244491 -0.055646 0.0790843 +0.239659 -0.0616442 0.0888399 +0.226162 -0.0616059 0.0920824 +0.21522 -0.0631162 0.0781895 +0.212545 -0.0629682 0.0966232 +0.196781 -0.0599901 0.105959 +0.210127 -0.0657511 0.11188 +0.250495 -0.0660959 0.0846797 +0.234672 -0.0671026 0.0978575 +0.237261 -0.0846396 0.108485 +0.25989 -0.0423809 0.0666642 +0.259987 -0.0257531 0.0664908 +0.247883 -0.0247631 0.0554477 +0.242689 -0.0135836 0.0440572 +0.246291 0.00496067 0.0457059 +0.245187 0.0234669 0.0372413 +0.250061 0.17416 0.133813 +0.259114 0.167602 0.148828 +0.26511 0.166925 0.171546 +0.238618 0.181672 0.138204 +0.229669 0.176644 0.149535 +0.262049 0.187134 0.176237 +0.261795 0.200868 0.165371 +0.276513 0.199318 0.153854 +0.292677 0.199982 0.157209 +0.302715 0.186361 0.157188 +0.308755 0.181779 0.171774 +0.305926 0.190608 0.185482 +0.312423 0.167782 0.169221 +0.31381 0.157653 0.158921 +0.310783 0.154703 0.171639 +0.301108 0.177938 0.144841 +0.293264 0.189309 0.147256 +0.279322 0.188458 0.145304 +0.262483 0.193127 0.192418 +0.274289 0.192768 0.20161 +0.254841 0.206509 0.193978 +0.245154 0.222549 0.189318 +0.253012 0.22552 0.174345 +0.265429 0.23121 0.17081 +-0.253206 -0.236908 -0.0443888 +0.149428 0.386275 0.232451 +0.147867 0.371017 0.232576 +0.152926 0.356705 0.229375 +0.149032 0.338169 0.225131 +0.166114 0.363727 0.223417 +0.172256 0.353426 0.215568 +0.179541 0.338962 0.221969 +0.181625 0.354174 0.201921 +0.186426 0.343494 0.187951 +0.192075 0.328517 0.215563 +0.192453 0.320313 0.195502 +0.17815 0.351274 0.174302 +0.17655 0.370022 0.172318 +0.165276 0.33179 0.225541 +0.00939661 -0.323412 0.0804555 +0.117561 -0.144032 0.250595 +0.120353 -0.125008 0.233582 +0.111251 -0.145731 0.271784 +0.11093 -0.120815 0.285658 +0.0754192 -0.0921393 0.301481 +0.0769558 -0.124739 0.290267 +0.0748528 -0.117401 0.265004 +0.0426218 -0.103655 0.282975 +0.0504123 -0.0659143 0.287583 +0.0836935 -0.0669285 0.279976 +0.0588543 -0.11803 0.279938 +0.0586609 -0.105277 0.297458 +0.0557269 -0.0839063 0.29826 +0.0381914 -0.083198 0.286361 +0.0371995 -0.0680895 0.266535 +0.047335 -0.0888232 0.265922 +0.05563 -0.0732275 0.247968 +0.0616189 -0.0543441 0.232231 +0.0811821 -0.0784737 0.231059 +0.0764784 -0.0353683 0.254905 +0.0689625 -0.0703705 0.29266 +0.0661415 -0.0548095 0.278244 +0.0608765 -0.028919 0.235586 +0.087271 -0.018263 0.234864 +0.0756435 -0.10953 0.298971 +0.0951645 -0.0988538 0.288259 +0.0930654 -0.116235 0.295574 +0.0947803 -0.133863 0.284699 +0.0966033 -0.0830131 0.273711 +0.113798 -0.076403 0.258582 +0.127442 -0.0600385 0.234949 +0.132794 -0.0953943 0.252522 +0.0489111 -0.0556973 0.272686 +0.0606107 -0.0431898 0.263976 +0.0971312 -0.036293 0.245012 +0.110687 -0.0488392 0.23675 +0.126176 -0.0414728 0.221378 +0.136057 -0.0243951 0.201716 +0.122078 0.00127519 0.196707 +0.142291 0.00027007 0.178375 +0.0664164 -0.0191578 0.217877 +0.0802696 -0.0234954 0.199319 +0.0910082 -0.0454502 0.20083 +0.0798776 -0.132726 0.273919 +0.102454 0.00166634 0.210465 +0.0802091 -0.00534582 0.192641 +0.0863635 0.00814252 0.179895 +0.0946306 0.0282399 0.168655 +0.0981336 0.029523 0.148764 +0.101777 0.0395859 0.135111 +0.102082 0.0581642 0.134881 +0.0956437 0.0321468 0.122829 +0.0938658 0.0161985 0.122282 +0.107901 0.00369122 0.128399 +0.078491 0.00576055 0.124425 +0.0841199 0.0382034 0.11313 +0.0659972 0.0331947 0.109714 +0.0520056 0.0196069 0.12098 +0.108345 -0.0142416 0.126349 +0.0915975 -0.0313276 0.129913 +0.122833 -0.0287943 0.124051 +0.146418 -0.0426624 0.119895 +0.142658 -0.0228961 0.131632 +0.132595 -0.0194368 0.150249 +0.160419 -0.0327892 0.133975 +0.163125 -0.050543 0.147173 +0.060233 0.0422739 0.0970401 +0.0469107 0.0353785 0.0851224 +0.0330985 0.0252247 0.0760721 +0.0344131 0.0145341 0.0525338 +0.0185411 0.0141735 0.0691085 +-0.00651953 0.00766464 0.081092 +0.0314926 0.0314677 0.0951056 +0.0155266 0.0258059 0.107793 +0.11957 0.0050674 0.144577 +0.11348 -0.010764 0.15919 +0.0864989 0.00930931 0.196192 +0.112679 0.0343949 0.172228 +0.110056 0.0172326 0.144505 +-0.231861 -0.256194 -0.0373807 +-0.233847 -0.249852 -0.0220477 +-0.230235 -0.258784 -0.00973726 +-0.217151 -0.280061 0.00814621 +-0.228026 -0.273051 0.0389012 +-0.222798 -0.271648 -0.00409819 +-0.229682 -0.268052 0.0118625 +-0.212876 -0.279385 -0.0140325 +-0.214439 -0.277583 -0.0303969 +-0.199886 -0.285356 -0.0320197 +-0.187179 -0.295224 -0.0255156 +-0.167219 -0.315028 -0.0304058 +-0.156845 -0.302235 -0.0544314 +-0.236758 -0.254924 0.00227314 +0.0884351 -0.404348 -0.0195924 +0.0722252 -0.268984 0.0670772 +0.070147 -0.245252 0.0862941 +0.0966471 -0.229612 0.0882203 +0.0926053 -0.203806 0.103764 +0.0777673 -0.186021 0.118999 +0.0417862 -0.182948 0.126604 +0.0709209 -0.158179 0.128709 +0.095465 -0.128791 0.124296 +0.0102764 -0.16375 0.133447 +-0.0233099 -0.171526 0.153541 +-0.0499934 -0.0465621 -0.00582837 +-0.0749973 -0.0355191 0.0101971 +-0.0645299 -0.324704 -0.077104 +0.221779 0.470802 0.0892895 +0.219761 0.464582 0.1032 +0.246597 0.0246927 0.0795416 +0.253586 0.0320272 0.0977802 +0.252394 0.0305168 0.0670227 +0.261064 0.0424817 0.0637394 +0.267205 0.0556508 0.058182 +0.262106 0.0615289 0.0436471 +0.250683 0.0500973 0.0298185 +0.272972 0.0454164 0.0731281 +0.274554 0.0385023 0.090004 +0.285852 0.0505507 0.0780368 +0.287544 0.066644 0.0791877 +0.280213 0.0764884 0.0661465 +0.226162 0.0537579 -0.00800313 +0.231726 0.0372941 0.00212281 +0.226833 0.070796 -0.0125112 +-0.0228881 0.0822405 -0.0141151 +-0.0164496 0.062439 -0.0353807 +-0.0311204 0.09353 -0.0291259 +-0.0468617 0.0890411 -0.0503417 +-0.0192694 0.0958145 -0.0445491 +-0.0451838 0.0631149 -0.0497516 +-0.0349277 0.0970377 -0.0439657 +-0.0281121 0.0908295 -0.0597278 +-0.0422149 0.0875756 -0.0360098 +-0.0493018 0.0748281 -0.0407497 +-0.0508974 0.0756362 -0.0555946 +-0.045787 0.0616401 -0.0714534 +-0.0463878 0.0860458 -0.0643425 +-0.0469 0.0754389 -0.0734442 +-0.0361876 0.0721397 -0.0877453 +-0.0344753 0.0506229 -0.0835042 +-0.0209274 0.0429352 -0.0951495 +-0.00835098 0.0548898 -0.109767 +-0.0439408 0.0675081 -0.0809412 +-0.0384794 0.0604865 -0.0888934 +-0.0325578 0.0529818 -0.0938199 +-0.0250287 0.0507859 -0.100857 +-0.0171358 0.0586173 -0.103485 +-0.00108771 0.0669554 -0.09638 +0.0141047 0.0764389 -0.0789872 +-0.0166767 0.0687863 -0.0931008 +-0.0154196 0.0443974 -0.106822 +0.00804033 0.0334573 -0.118139 +-0.00353356 0.0420783 -0.115203 +0.00267945 0.0333406 -0.10199 +0.0284162 0.0260832 -0.102463 +0.0140719 0.0342408 -0.0876383 +0.01206 0.042083 -0.0690778 +0.0262722 0.0834922 -0.057317 +0.052314 0.0257381 -0.0888721 +0.0550064 0.0153199 -0.121681 +0.0742668 0.0307726 -0.0684202 +0.0254542 0.0462258 -0.0537161 +0.0192751 0.0579365 -0.0299961 +0.043388 0.0389601 -0.0621497 +0.0632571 0.0407552 -0.0511604 +0.0628168 0.0511918 -0.0295138 +-0.00769957 0.0468719 -0.0674097 +0.0356439 0.036944 -0.129564 +0.00985644 0.0486694 -0.11871 +0.0293481 0.0500299 -0.116265 +0.034304 0.0639803 -0.0982281 +0.0203799 0.0394103 -0.126099 +0.0274107 0.0238815 -0.120304 +-0.00989932 0.038173 -0.0977698 +0.0409915 0.0204434 -0.130582 +0.0603476 0.0361414 -0.135064 +0.0745924 0.0111822 -0.144256 +0.0995383 0.0164619 -0.152082 +0.079494 0.0098491 -0.119596 +0.109969 -0.00178903 -0.14121 +0.128369 -0.00667529 -0.145234 +0.147176 -0.000628591 -0.159936 +0.143478 0.0207956 -0.143584 +0.15945 -0.0140125 -0.151421 +0.167046 -0.013357 -0.130058 +0.175024 -0.000463673 -0.161193 +0.200548 0.00730904 -0.144289 +0.228188 0.00606999 -0.13371 +0.232374 -0.0225206 -0.12062 +0.217352 -0.0205681 -0.149989 +0.196446 -0.0094088 -0.159916 +0.0468892 0.0318746 -0.136603 +0.0588847 0.0194871 -0.141629 +0.0497176 0.0425705 -0.12546 +0.067316 0.0466181 -0.121528 +0.0829023 0.0554408 -0.10632 +0.0702884 0.0671402 -0.0864572 +0.0736048 0.0280122 -0.141966 +-0.0393368 0.0927115 -0.058201 +-0.074253 -0.462729 -0.0674302 +-0.0882268 -0.46748 -0.0836924 +-0.10265 -0.454789 -0.102517 +-0.100302 -0.434985 -0.0953132 +-0.123508 -0.439573 -0.0964816 +0.30376 -0.329009 -0.220778 +-0.34576 -0.287787 -0.1184 +-0.333412 -0.299886 -0.118936 +-0.318278 -0.306436 -0.109371 +-0.342798 -0.273541 -0.122349 +-0.330946 -0.265681 -0.13448 +-0.32759 -0.278136 -0.147142 +-0.313986 -0.269795 -0.152301 +-0.304937 -0.277784 -0.160852 +-0.289134 -0.290053 -0.171285 +-0.300398 -0.29313 -0.159904 +-0.305136 -0.304081 -0.143109 +-0.303823 -0.326091 -0.148763 +-0.297334 -0.338307 -0.131821 +-0.0440833 -0.337561 0.102751 +-0.0280108 -0.346215 0.0792887 +0.190023 -0.166658 -0.160984 +0.187606 0.489479 0.0788413 +0.169798 0.492699 0.0805537 +0.160239 0.479513 0.0724411 +0.160997 0.477019 0.0876359 +0.167909 0.48647 0.0907839 +0.168839 0.465921 0.0685027 +0.185848 0.461592 0.0756332 +0.163713 0.449815 0.0719867 +0.171034 0.442192 0.0868531 +0.172622 0.439121 0.100638 +0.176648 -0.0540189 0.138439 +0.191763 0.435033 0.0761478 +0.150024 0.450095 0.173316 +0.142684 0.444609 0.180888 +0.134925 0.435737 0.185852 +0.0901553 -0.0455623 0.257862 +0.0764097 -0.0467149 0.266788 +0.218445 0.190081 -0.00453558 +0.212983 0.187132 0.0158667 +0.234912 0.203072 -0.0090602 +0.217724 0.208098 -0.00630956 +0.209095 0.231498 0.0538229 +0.223398 0.222537 0.0510417 +0.229495 0.205818 0.051858 +0.241614 0.200114 0.0387668 +0.245196 0.212463 0.0252865 +0.232616 0.199508 0.066443 +0.245867 0.187445 0.0704899 +0.218046 0.211438 0.0580939 +0.206013 0.207163 0.0667587 +0.208167 0.217137 0.0808695 +0.189985 0.216171 0.0819923 +-0.328288 -0.282754 -0.0562593 +-0.321215 -0.270892 -0.0527491 +-0.321885 -0.294532 -0.0580289 +-0.324301 -0.301836 -0.070993 +-0.309665 -0.294095 -0.0515043 +-0.298437 -0.298535 -0.0585809 +-0.293755 -0.297175 -0.0685565 +-0.301865 -0.303693 -0.0670723 +-0.312242 -0.307406 -0.0760424 +0.113855 0.0103494 0.135894 +0.117356 -0.000872108 0.134011 +0.24192 0.231796 0.179613 +0.236568 0.24336 0.180529 +0.226028 0.250706 0.186633 +0.280884 -0.220307 -0.163899 +0.26654 -0.211351 -0.150233 +0.265056 -0.233891 -0.14678 +0.318482 -0.331697 -0.239506 +0.324395 -0.322699 -0.253479 +0.31194 -0.314679 -0.269415 +0.329739 -0.334727 -0.229668 +0.336703 -0.323152 -0.229076 +0.344428 -0.313085 -0.23571 +0.342498 -0.293727 -0.236916 +0.350543 -0.322922 -0.2465 +0.353252 -0.314 -0.261759 +0.347047 -0.326986 -0.235121 +0.0827363 -0.465408 -0.0592863 +0.0757733 -0.45735 -0.0483001 +0.0758332 -0.442944 -0.0486429 +0.0763754 -0.427162 -0.064874 +0.0810297 -0.429275 -0.0354104 +0.0760881 -0.402196 -0.0628009 +0.0803331 -0.462498 -0.0366385 +0.075746 -0.427719 -0.0496393 +0.213629 0.454927 0.154222 +0.216172 0.433851 0.152191 +0.213875 -0.163106 0.208849 +0.228479 0.0837143 -0.0171959 +0.214862 0.0777937 -0.0178642 +0.203914 0.0820668 -0.0169156 +0.213551 0.066976 -0.0133462 +-0.291696 -0.291685 -0.053913 +-0.288445 -0.286967 -0.0453936 +-0.283457 -0.280518 -0.0392925 +0.198493 0.267303 0.113918 +0.312224 -0.337685 -0.224702 +0.0776115 -0.0114015 0.225043 +0.094616 -0.00802053 0.222738 +0.212523 -0.00317223 -0.153514 +0.228944 -0.0069181 -0.146501 +0.230166 -0.0223035 -0.138067 +0.212902 -0.0238532 -0.132712 +0.194522 -0.0219296 -0.138137 +0.240306 -0.00819778 -0.130311 +0.24497 -0.0122967 -0.113875 +0.221562 -0.0094445 -0.0973672 +0.242491 -0.00970392 -0.0927411 +-0.195428 -0.293105 -0.0588105 +-0.174639 -0.293714 -0.0615636 +-0.159198 -0.295096 -0.0708856 +-0.150745 -0.297027 -0.0916319 +-0.165094 -0.309633 -0.116063 +-0.129532 -0.293794 -0.0901166 +-0.12154 -0.29002 -0.105668 +-0.103655 -0.284754 -0.110478 +-0.083304 -0.273535 -0.126518 +-0.126229 -0.291149 -0.124142 +-0.0551206 -0.282297 -0.123125 +-0.0279253 -0.280704 -0.123568 +-0.0254074 -0.296918 -0.100527 +-0.143636 -0.296672 -0.0765836 +0.228772 0.249576 0.00807469 +0.246793 0.197559 -0.000456927 +0.249351 0.185655 0.00965958 +0.077471 -0.38535 -0.0716786 +0.0780138 -0.366405 -0.0698751 +0.0796117 -0.349597 -0.0694382 +0.0817673 -0.324046 -0.067713 +0.0920794 -0.339278 -0.0766687 +0.0745961 -0.308674 -0.0513846 +0.0686559 -0.285979 -0.0584538 +0.0701691 -0.296007 -0.0346939 +0.0958416 -0.324563 -0.0739969 +0.111686 -0.315208 -0.0712996 +0.118212 -0.295045 -0.0671537 +0.145789 -0.285221 -0.0572786 +0.142444 -0.258951 -0.0651148 +0.125807 -0.256448 -0.0777825 +0.0725557 -0.302564 -0.0188272 +0.0757738 -0.318738 -0.0113816 +0.0755625 -0.334153 -0.022547 +0.0716925 -0.292684 -0.00740334 +0.0574002 -0.292216 -0.00131701 +0.0442788 -0.29974 -0.0118635 +0.0322898 -0.309073 -0.00126775 +0.0158934 -0.319374 -0.00927168 +0.00270388 -0.318254 -0.036966 +0.00321031 -0.33353 0.006095 +0.0101246 -0.330737 0.0331595 +0.0571801 -0.291727 0.0142738 +0.0411549 -0.302632 0.0323113 +0.0568056 -0.290026 0.0325413 +0.0726196 -0.279494 0.0399911 +0.0843075 -0.293947 0.0355701 +0.0802412 -0.296732 0.0208207 +0.0757523 -0.290551 0.00911073 +0.0904109 -0.307387 0.0401159 +0.0937218 -0.321431 0.0333001 +0.0876185 -0.332554 0.0196986 +-0.261918 -0.356193 -0.123562 +-0.274572 -0.363058 -0.128675 +-0.283885 -0.374671 -0.137095 +0.0993425 -0.475253 -0.0345906 +0.105878 -0.470302 -0.022596 +0.161209 0.00758193 -0.157082 +0.162861 -0.00496129 -0.160125 +0.14622 0.0234899 0.00861402 +0.16407 0.00688456 0.00334424 +0.187476 0.0108016 -0.000104135 +0.198618 0.0267239 -0.00776275 +0.213159 0.032032 -0.0211609 +0.229764 0.0271876 -0.0288068 +0.229938 0.0432028 -0.0342052 +0.231973 0.0361819 -0.05417 +0.241585 0.0230077 -0.0674939 +0.235826 0.0200922 -0.0913851 +0.229532 0.00831192 -0.0604593 +0.228417 0.0182383 -0.11087 +0.214387 0.0313739 -0.095916 +0.23826 0.0319925 -0.0407356 +0.240603 0.0153722 -0.0478262 +0.185434 0.0390225 -0.0120783 +0.174046 0.035224 -0.0278333 +0.183039 0.0254835 -0.0435084 +0.185088 0.013208 -0.0664572 +0.184517 -0.00115634 -0.0944301 +0.15883 0.0112792 -0.0789407 +0.166768 0.0454452 -0.0125857 +0.149871 0.0473393 -0.0127261 +0.24097 0.0273212 -0.0523021 +0.244689 0.0183228 -0.0578172 +0.239121 0.00955592 -0.0564169 +0.23067 0.0133196 -0.0511149 +0.217815 0.013095 -0.0555127 +0.202953 0.0215885 -0.0445658 +0.223255 0.0309758 -0.00933388 +0.246338 0.00680161 -0.0920968 +-0.29666 -0.251794 -0.0420083 +-0.282377 -0.246563 -0.0382484 +-0.274248 -0.257163 -0.0411355 +0.121069 0.3764 0.220244 +0.124178 0.361607 0.222425 +0.12316 0.347289 0.21517 +0.120818 0.335014 0.200629 +0.131773 0.318764 0.203442 +0.240354 -0.189104 -0.174254 +0.226426 -0.17846 -0.157236 +0.25469 -0.197929 -0.186668 +0.262527 -0.207499 -0.20859 +0.275709 -0.206748 -0.189755 +0.268196 -0.218714 -0.226562 +0.252109 -0.214264 -0.221034 +0.231966 -0.219863 -0.222417 +0.16439 -0.290409 -0.045741 +0.174232 0.353361 0.161991 +0.167416 0.346038 0.151615 +0.153417 0.351454 0.147309 +0.141711 0.365653 0.160008 +0.174784 0.33351 0.146976 +0.172695 0.32064 0.137876 +0.171538 0.327653 0.122668 +-0.153467 -0.465689 -0.0917447 +-0.142244 -0.458217 -0.0978282 +-0.137315 -0.444624 -0.0945322 +-0.142546 -0.468457 -0.0929801 +-0.130113 -0.470071 -0.0887414 +-0.111868 -0.466578 -0.0912306 +-0.129822 -0.476932 -0.0773011 +-0.116192 -0.47396 -0.0799073 +-0.102072 -0.471199 -0.0816089 +0.0648327 -0.288276 0.006469 +0.290523 -0.14969 0.120852 +0.286341 -0.149084 0.132395 +0.276561 -0.154417 0.131433 +0.266874 -0.144863 0.128327 +0.266123 -0.155511 0.139202 +0.254682 -0.156501 0.14847 +0.243072 -0.144724 0.147014 +0.246658 -0.132891 0.13506 +0.271484 -0.158645 0.148826 +0.262513 -0.161728 0.150556 +0.255383 -0.163883 0.160093 +0.258182 -0.154155 0.170424 +0.247063 -0.165211 0.168804 +0.236375 -0.166699 0.177267 +0.223809 -0.16596 0.182974 +0.219971 -0.167303 0.19665 +0.224247 -0.15536 0.203023 +0.206877 -0.166582 0.198203 +0.201256 -0.167208 0.210293 +0.187949 -0.165778 0.214542 +0.175727 -0.151043 0.207983 +0.205839 -0.156778 0.218275 +0.191606 -0.158183 0.226132 +0.180969 -0.154585 0.235065 +0.170507 -0.150398 0.244702 +0.167678 -0.135398 0.246604 +0.174695 -0.121433 0.234619 +0.192199 -0.123695 0.219574 +0.161002 -0.150315 0.252813 +0.149901 -0.156196 0.25282 +0.145756 -0.15618 0.238445 +0.158231 -0.157867 0.22927 +0.148019 -0.147104 0.261177 +0.14318 -0.132144 0.260892 +0.131504 -0.114456 0.261736 +0.136414 -0.145181 0.266602 +0.124033 -0.152215 0.261533 +0.128756 -0.151616 0.248741 +0.169715 -0.162656 0.235355 +0.125332 -0.145025 0.270918 +0.118124 -0.13431 0.277651 +0.122928 -0.121301 0.271952 +0.113017 -0.148351 0.260498 +0.105868 -0.137752 0.254904 +0.0970603 -0.116879 0.246491 +0.113377 -0.13188 0.244126 +0.102989 -0.14407 0.26402 +0.09993 -0.141861 0.276203 +-0.208269 -0.22401 0.141633 +-0.20692 -0.250284 0.132437 +0.0965268 -0.427234 -0.105996 +0.0991486 -0.439673 -0.0998914 +0.19126 -0.17619 0.0390751 +0.184715 -0.204433 0.0324441 +0.164304 -0.221583 0.0465757 +0.1444 -0.208807 0.0686986 +0.0226172 -0.0147867 0.137076 +-0.142255 -0.49298 -0.0216335 +0.233691 0.0208001 -0.0385404 +-0.192672 -0.315988 0.0839294 +-0.202286 -0.295403 0.104035 +-0.212462 -0.276423 0.111373 +-0.218066 -0.285356 0.0914372 +-0.230517 -0.270625 0.068595 +0.136055 0.0355608 0.0131192 +0.121886 0.0399552 0.0198872 +0.106186 0.0275039 0.0255554 +0.0928691 0.0373146 0.0446539 +0.107832 0.0113031 0.0106037 +0.0853288 0.00897116 0.0135994 +0.0648776 -0.00152148 0.00684991 +0.301901 0.1917 0.196837 +0.304498 0.181718 0.192274 +0.29757 0.171529 0.192207 +0.283611 0.170157 0.190984 +0.17589 0.332048 0.230978 +0.176274 0.318104 0.221305 +0.189786 0.308195 0.22975 +0.199452 0.291101 0.221444 +0.210647 0.278153 0.221165 +0.212403 0.290739 0.232707 +0.229872 0.295702 0.229994 +0.238851 0.283146 0.23072 +0.237981 0.260514 0.227763 +0.248013 0.243086 0.221386 +0.245976 0.271423 0.230129 +0.237201 0.240055 0.208931 +0.239318 0.292509 0.222434 +0.244312 0.28734 0.210021 +0.234086 0.289095 0.199595 +0.221914 0.298769 0.201947 +0.1778 0.322602 0.229777 +0.232474 0.299285 0.221376 +0.223334 0.304746 0.213608 +0.207337 0.311267 0.204764 +0.224642 0.304397 0.226583 +0.214619 0.302742 0.233384 +0.203769 0.313465 0.232857 +0.204968 0.319702 0.218324 +0.201735 0.298965 0.232154 +-0.0492057 -0.0812756 -0.10551 +-0.0710597 -0.075701 -0.12067 +-0.0879497 -0.0905516 -0.13677 +-0.0843511 -0.119489 -0.147588 +-0.0762899 -0.059326 -0.102542 +-0.0985707 -0.0477827 -0.098696 +-0.118275 -0.0536394 -0.113913 +-0.11441 -0.0717159 -0.128365 +0.179503 0.303256 0.0436704 +0.192013 0.290229 0.0290644 +0.17689 0.287515 0.0370015 +0.192038 0.271729 0.0156116 +0.209167 0.267708 0.00969983 +0.200133 0.255704 0.00478026 +-0.247504 -0.392344 -0.224787 +-0.247477 -0.405986 -0.218212 +-0.243099 -0.400741 -0.206484 +-0.246703 -0.405341 -0.193269 +-0.249065 -0.417066 -0.193806 +-0.263856 -0.417281 -0.202583 +-0.253854 -0.410374 -0.185389 +-0.264275 -0.407223 -0.177693 +-0.272044 -0.40206 -0.166216 +-0.284666 -0.409799 -0.163624 +-0.28689 -0.423019 -0.170791 +-0.283285 -0.428723 -0.186577 +-0.301536 -0.424549 -0.197331 +-0.276684 -0.426319 -0.176604 +-0.270204 -0.426002 -0.18843 +-0.267033 -0.421163 -0.178871 +-0.28572 -0.431162 -0.176917 +0.0984334 0.0428629 0.147655 +0.0984512 0.0370662 0.158757 +-0.324734 -0.278381 -0.0492733 +-0.319049 -0.278035 -0.0388895 +-0.314693 -0.271902 -0.0298211 +-0.0814975 -0.486596 -0.0514846 +-0.0716057 -0.47534 -0.0576231 +-0.0807984 -0.475501 -0.0687174 +-0.0782273 -0.46782 -0.0773567 +-0.0794515 -0.454639 -0.076562 +-0.0865219 -0.442019 -0.0638219 +-0.0826697 -0.456554 -0.0896798 +-0.0913604 -0.446861 -0.0969099 +-0.0924184 -0.432044 -0.0753911 +-0.098273 -0.416607 -0.0817744 +-0.111942 -0.395187 -0.0818225 +-0.0923505 -0.401008 -0.0727607 +-0.110463 -0.376831 -0.0757945 +-0.0955645 -0.358515 -0.0727168 +-0.0748788 -0.367775 -0.053732 +-0.099584 -0.336657 -0.0718408 +-0.0617229 -0.346951 -0.0508932 +-0.0372908 -0.340191 -0.0358611 +-0.187209 -0.0514446 0.134371 +-0.172275 -0.062062 0.144345 +-0.181772 -0.0387772 0.12984 +0.27325 0.225257 0.167666 +0.283037 0.221467 0.169903 +0.141164 -0.00931766 -0.150578 +0.223335 -0.262546 -0.149684 +0.199958 -0.258684 -0.141852 +0.218212 -0.249649 -0.131577 +-0.0730224 -0.485274 -0.0383372 +-0.0765985 -0.473674 -0.025717 +-0.0833487 -0.485599 -0.0202509 +-0.0969784 -0.487241 -0.0157338 +-0.106328 -0.475595 -0.0156679 +-0.107519 -0.486132 -0.0147883 +-0.117398 -0.491224 -0.0155421 +-0.11866 -0.497871 -0.0255495 +0.192205 -0.0198585 -0.151725 +0.281772 0.238327 0.210562 +0.269826 0.243309 0.222088 +0.243244 0.207816 -0.00325363 +0.239729 0.221932 -0.000908316 +0.243256 0.225044 0.0142927 +0.235434 0.23543 0.00346349 +0.158954 -0.447934 -0.074517 +0.164 -0.440163 -0.0849532 +0.160645 -0.422992 -0.0839209 +0.160099 -0.41995 -0.0633914 +0.170063 -0.432118 -0.0580684 +0.170775 -0.442201 -0.0470561 +0.167356 -0.452883 -0.036848 +0.157537 -0.464023 -0.0432353 +0.154265 -0.458207 -0.0582632 +0.146921 -0.466798 -0.0291891 +0.17099 -0.445942 -0.0649823 +0.152813 -0.426396 -0.0985179 +0.142833 -0.435406 -0.0989063 +0.126573 -0.436557 -0.100225 +0.120949 -0.42189 -0.103936 +0.130685 -0.411647 -0.0938972 +0.160351 -0.460975 -0.0324222 +0.164884 -0.460693 -0.0398836 +0.167083 -0.430709 -0.0834012 +0.161089 -0.432508 -0.0931652 +0.165433 -0.424956 -0.0749657 +0.155909 -0.417913 -0.0743018 +0.149825 -0.407366 -0.067413 +0.142015 -0.399818 -0.0764637 +0.153043 -0.435416 -0.0966096 +0.148842 -0.431897 -0.101759 +0.145045 -0.424265 -0.10134 +0.147732 -0.418014 -0.0911084 +0.138977 -0.417451 -0.0965307 +0.139635 -0.411036 -0.0878314 +0.14174 -0.430413 -0.104765 +0.134784 -0.434536 -0.101822 +0.135086 -0.440748 -0.0918112 +0.13766 -0.447456 -0.0800542 +0.122938 -0.455334 -0.0698495 +0.127914 -0.428797 -0.106691 +0.135671 -0.430083 -0.106069 +0.000262015 -0.258244 0.142866 +0.0151742 -0.229959 0.128466 +-0.00970849 -0.227931 0.154073 +0.0337917 -0.209923 0.115845 +0.0199495 -0.192987 0.125832 +-0.154293 -0.0335699 -0.082135 +-0.129631 -0.0324487 -0.0813475 +-0.120097 -0.027431 -0.0586998 +-0.0956922 -0.0340394 -0.0533561 +-0.0814148 -0.0448428 -0.0722969 +-0.0594432 -0.0515596 -0.0534184 +-0.160793 -0.0482086 -0.0989707 +-0.166155 -0.0307425 -0.0663998 +-0.169924 -0.0270352 -0.0414151 +-0.183311 -0.0375758 -0.0551581 +-0.174206 -0.0274939 -0.0203147 +-0.192353 -0.0397338 -0.00141151 +-0.170447 -0.0249801 0.0063437 +-0.211587 -0.0636911 -0.00501259 +-0.0018753 -0.187141 -0.149775 +0.0183103 -0.182965 -0.142326 +0.0322217 -0.167313 -0.134641 +0.0236675 -0.146992 -0.123167 +-0.00232452 -0.142332 -0.126149 +0.0375806 -0.18533 -0.140019 +0.0530379 -0.201545 -0.137283 +0.0772348 -0.20845 -0.140694 +0.0988175 -0.224384 -0.140468 +0.119251 -0.222512 -0.162731 +0.03788 -0.218276 -0.135529 +0.0772845 -0.19139 -0.155355 +0.080882 -0.225907 -0.127445 +0.0653619 -0.242778 -0.113036 +0.0731805 -0.173068 -0.155239 +0.0897045 -0.191329 -0.166141 +0.102707 -0.199007 -0.171074 +0.119058 -0.208637 -0.176942 +0.127514 -0.196293 -0.185172 +0.13998 -0.205302 -0.190755 +0.149824 -0.215626 -0.194546 +0.161245 -0.221969 -0.199237 +0.175364 -0.230409 -0.20401 +0.173584 -0.215336 -0.204853 +0.178202 -0.198362 -0.197173 +0.188397 -0.22907 -0.211289 +0.202734 -0.22056 -0.215065 +0.199745 -0.239634 -0.214151 +0.0815106 -0.18364 -0.162988 +-0.172104 -0.359269 -0.00938238 +-0.172319 -0.335226 -0.0164663 +-0.16873 -0.368903 -0.0231312 +-0.292266 -0.291505 -0.0889456 +-0.288266 -0.299574 -0.0955502 +-0.280983 -0.308012 -0.105167 +-0.278654 -0.297571 -0.101297 +-0.274336 -0.285615 -0.103446 +-0.260134 -0.28158 -0.0989442 +-0.257005 -0.265144 -0.10215 +-0.26942 -0.305285 -0.10276 +-0.257003 -0.309674 -0.100476 +-0.244993 -0.306014 -0.0938734 +-0.249351 -0.292113 -0.0926885 +-0.25954 -0.322424 -0.104282 +-0.267093 -0.332079 -0.111051 +-0.283312 -0.328944 -0.119574 +-0.249017 -0.331591 -0.10481 +-0.232981 -0.32784 -0.100164 +-0.240291 -0.342062 -0.113719 +-0.229688 -0.345883 -0.126712 +-0.23058 -0.352629 -0.145077 +-0.21352 -0.337371 -0.127344 +-0.269191 -0.344874 -0.117105 +-0.208623 -0.327937 -0.112241 +-0.191793 -0.321843 -0.117022 +-0.180909 -0.311277 -0.104708 +0.11012 0.10505 0.0238496 +0.213679 0.221732 0.163906 +-0.0357839 -0.0025294 0.108473 +-0.0312254 -0.0135193 0.128152 +-0.0238807 -0.033229 0.139313 +-0.00300831 -0.046529 0.144036 +-0.00364169 -0.0760125 0.145155 +-0.0103288 -0.10643 0.141831 +0.015326 -0.129347 0.142131 +-0.041062 -0.0443202 0.130625 +-0.0555252 -0.0465254 0.114753 +-0.0556686 -0.0325657 0.0996413 +-0.0768736 -0.0422105 0.0949058 +-0.0167984 0.000564353 0.123722 +0.00524698 0.0020139 0.129964 +-0.0281137 -0.0861213 0.139333 +-0.0785841 -0.0379469 0.0747431 +-0.0762529 -0.0505618 0.114297 +-0.032521 -0.108383 0.136839 +-0.0633754 -0.0458183 0.101476 +-0.0250298 0.00663901 0.112981 +-0.0219675 0.00393164 0.0935556 +-0.147404 -0.304789 -0.127071 +0.192111 0.473304 0.143665 +0.202701 0.475169 0.131787 +0.206558 0.475874 0.120017 +0.202492 0.480449 0.108775 +0.157654 -0.366957 -0.0205798 +0.26661 -0.307414 -0.281977 +0.270077 -0.295571 -0.288815 +0.283263 -0.291236 -0.297392 +0.290598 -0.279448 -0.297082 +0.304158 -0.276932 -0.29882 +0.315035 -0.2885 -0.301158 +0.307588 -0.298676 -0.297006 +0.297613 -0.307939 -0.283621 +0.293787 -0.301201 -0.295424 +0.318389 -0.297707 -0.296483 +0.328066 -0.301032 -0.289042 +0.324582 -0.309109 -0.276338 +0.33579 -0.291676 -0.2964 +0.346867 -0.288071 -0.287976 +0.353956 -0.299169 -0.28317 +0.345495 -0.307423 -0.274703 +0.352866 -0.288693 -0.277818 +0.351312 -0.284395 -0.265224 +0.355354 -0.294774 -0.257468 +0.360217 -0.304818 -0.260578 +0.35682 -0.308388 -0.269609 +0.359106 -0.312264 -0.252967 +0.356474 -0.316127 -0.245135 +0.351445 -0.319298 -0.237976 +-0.26647 -0.314705 -0.199507 +-0.27426 -0.329739 -0.204261 +-0.290128 -0.337563 -0.206145 +-0.303723 -0.332243 -0.195363 +-0.303858 -0.323407 -0.176279 +-0.302757 -0.349394 -0.210447 +-0.304665 -0.364526 -0.223447 +-0.321319 -0.375627 -0.232938 +-0.285437 -0.371465 -0.224735 +-0.28011 -0.37957 -0.242654 +-0.314609 -0.397575 -0.24523 +-0.31498 -0.344154 -0.199865 +-0.330892 -0.351901 -0.189469 +-0.332902 -0.388937 -0.243068 +-0.348245 -0.402805 -0.233911 +-0.328232 -0.404959 -0.235266 +-0.273541 -0.396265 -0.240028 +-0.293049 -0.39498 -0.245656 +-0.355214 -0.402159 -0.217135 +-0.360108 -0.415844 -0.205721 +-0.346381 -0.42668 -0.201491 +-0.340374 -0.436455 -0.180032 +-0.360217 -0.406031 -0.193698 +-0.356506 -0.391255 -0.182727 +-0.356512 -0.407116 -0.177427 +-0.347384 -0.421732 -0.172779 +-0.348669 -0.37532 -0.17511 +-0.341266 -0.408591 -0.160307 +-0.332592 -0.391247 -0.153464 +-0.323849 -0.407723 -0.153687 +-0.349384 -0.43169 -0.189135 +-0.335815 -0.43119 -0.192046 +-0.324454 -0.435806 -0.181733 +-0.331465 -0.433295 -0.170921 +-0.314528 -0.431132 -0.168412 +-0.260177 -0.397767 -0.235 +-0.252953 -0.401301 -0.227678 +-0.247407 -0.394723 -0.238053 +-0.24372 -0.401046 -0.225417 +-0.243948 -0.396615 -0.216223 +-0.258003 -0.38952 -0.247437 +-0.272162 -0.387844 -0.252537 +-0.287147 -0.384539 -0.255755 +-0.302942 -0.384129 -0.252391 +-0.315505 -0.382766 -0.24459 +-0.323099 -0.390444 -0.249836 +-0.312399 -0.390336 -0.253745 +-0.328503 -0.399215 -0.245058 +-0.340635 -0.398589 -0.24271 +-0.266346 -0.382624 -0.244488 +-0.267321 -0.391914 -0.245578 +-0.0266812 0.0695328 -0.0242573 +-0.00773299 0.0681739 -0.0184911 +0.0122858 0.0669077 -0.0123781 +0.0150035 0.0767227 0.00239352 +0.0141467 0.0954062 -0.00215996 +0.0325338 0.098411 -0.00617133 +0.0450676 0.0983028 0.010086 +0.0314473 0.0730983 0.00401189 +0.0505593 0.0686309 0.00292132 +0.0698817 0.067505 0.00832925 +0.145383 0.180744 0.0984363 +0.132189 0.17376 0.0925198 +0.121241 0.164951 0.0850023 +0.133425 0.169934 0.0774819 +0.11505 0.153676 0.07879 +-0.083942 -0.368893 -0.0674225 +-0.0809876 -0.385027 -0.0581697 +-0.0723248 -0.382058 -0.0416794 +-0.00904893 0.0914446 -0.0120745 +0.00504523 0.0987359 -0.0150796 +0.0060609 0.0932522 -0.034057 +0.0248461 0.0873188 -0.0377031 +0.0363994 0.089055 -0.023789 +0.00213821 0.0914225 -0.00482177 +0.0092558 0.0863088 0.00212053 +0.106375 0.0274106 0.14138 +-0.263884 -0.385451 -0.252252 +0.258755 0.24689 0.225661 +0.259085 0.23306 0.219814 +0.249971 0.25591 0.228242 +-0.322841 -0.345115 -0.164492 +-0.323706 -0.355326 -0.152393 +-0.279169 -0.265328 -0.0439542 +-0.285416 -0.267917 -0.0516616 +-0.294745 -0.263175 -0.0517725 +0.23393 -0.0149701 -0.10397 +0.219738 -0.0165453 -0.112039 +0.204608 -0.00981825 -0.104246 +0.187184 -0.00954937 -0.110855 +0.228145 0.230452 0.102316 +0.214447 0.238029 0.0983297 +0.23229 0.220992 0.0943503 +0.215398 0.247623 0.105271 +0.217938 0.25177 0.117669 +0.210276 0.258003 0.111405 +0.220949 0.241286 0.103103 +0.290344 -0.337843 -0.233955 +0.276226 -0.337233 -0.22831 +0.296573 -0.339782 -0.226215 +0.227663 0.461812 0.0838481 +0.234265 0.455281 0.0718225 +0.229698 0.445794 0.0603386 +0.225781 0.470182 0.0813133 +0.214396 0.4698 0.0788369 +0.208406 0.478123 0.0862021 +0.214031 0.460896 0.0711899 +0.217085 0.451741 0.0628259 +0.219354 0.474333 0.0827819 +0.21619 0.47758 0.0903862 +0.217994 0.472178 0.097233 +0.209525 0.481852 0.0939712 +0.227208 0.456115 0.0633709 +0.234329 0.451682 0.0642008 +0.23166 0.462658 0.0759848 +0.273713 -0.249314 -0.252993 +0.274317 -0.268417 -0.267071 +0.263304 -0.282613 -0.260934 +-0.240326 -0.404033 -0.2139 +-0.241182 -0.408607 -0.207233 +0.243855 0.194683 0.113624 +0.235959 0.206195 0.114609 +-0.329827 -0.30598 -0.098469 +-0.057071 -0.0425853 0.0117122 +-0.0551192 -0.0420888 0.0309046 +-0.0534835 -0.0402863 0.0500454 +-0.0435993 -0.0469165 0.00748095 +-0.0255629 -0.0374196 0.00481763 +-0.00817324 -0.0328811 -0.0061182 +-0.00350439 -0.0437548 -0.0255784 +-0.0349503 -0.0490115 -0.00492533 +-0.0419875 -0.0536475 -0.0293419 +-0.0139014 -0.0607747 -0.0378374 +-0.0105205 -0.0780801 -0.0585195 +-0.0335249 -0.0540562 -0.0180409 +-0.0278411 -0.0595083 -0.0313207 +0.193253 0.49569 0.0858481 +0.189805 0.494474 0.0949255 +0.179559 0.491992 0.0947812 +0.19709 0.487808 0.0978913 +0.174576 0.497081 0.0879734 +0.179584 0.496616 0.0784813 +0.175502 0.48892 0.0725035 +0.169475 0.481635 0.069206 +0.164994 0.474033 0.0669237 +0.155945 0.469227 0.0714265 +0.159639 0.459314 0.0671634 +0.160451 -0.0544036 0.113535 +0.0454737 -0.0938547 0.293886 +0.0481458 -0.104952 0.292926 +0.0550885 -0.114349 0.29062 +0.0654216 -0.120788 0.289843 +0.0691263 -0.126298 0.278339 +0.0372417 -0.0943784 0.286279 +0.0377118 -0.088702 0.274623 +0.179652 -0.262284 0.0054219 +0.186087 -0.244472 0.00347757 +0.246807 -0.00615903 -0.103541 +0.242297 -0.0135206 -0.100916 +0.240802 -0.0172339 -0.108388 +0.232593 -0.0188607 -0.112191 +0.240348 -0.0194541 -0.117278 +0.238974 -0.018297 -0.127651 +-0.164632 -0.397326 -0.024693 +0.0813645 -0.458079 -0.0716845 +0.302397 0.127887 0.0470846 +0.298473 0.138148 0.0455108 +0.292313 0.136477 0.0386335 +0.288054 0.130079 0.0326142 +0.28271 0.137427 0.0379629 +0.271939 0.136706 0.038053 +0.261008 0.14116 0.0404912 +0.28194 0.12422 0.0312108 +0.300876 0.126279 0.0551937 +0.295306 0.129324 0.0632115 +0.286846 0.130603 0.0706512 +0.282604 0.11846 0.0804122 +0.273418 0.134767 0.0747422 +0.296205 0.121995 0.0600976 +0.289869 0.116278 0.0576534 +0.283444 0.108666 0.0679441 +0.208186 0.435058 0.0678801 +0.218992 0.437774 0.0675136 +0.20517 0.444041 0.0615 +0.195457 0.447135 0.0675955 +0.224157 0.438328 0.0597838 +0.221367 0.446069 0.0584788 +0.168291 -0.443724 -0.076199 +-0.239169 -0.248023 -0.0426243 +-0.246509 -0.244281 -0.0523825 +-0.245933 -0.250709 -0.0701381 +-0.252213 -0.23035 -0.0598084 +-0.256922 -0.212794 -0.063622 +-0.26443 -0.20039 -0.048456 +-0.236601 -0.248665 -0.0331221 +-0.248238 -0.244973 -0.04299 +-0.257005 -0.243536 -0.0363368 +-0.264619 -0.253098 -0.0324677 +-0.260909 -0.234911 -0.0387305 +-0.270856 -0.228969 -0.0335016 +-0.268106 -0.214873 -0.0367573 +-0.255525 -0.250409 -0.0291707 +-0.246354 -0.252152 -0.0213798 +-0.25421 -0.258055 -0.0140562 +-0.253371 -0.258976 0.00135493 +-0.263391 -0.256528 0.0180325 +-0.264412 -0.265611 -0.0106557 +-0.268835 -0.263918 0.00476582 +-0.24972 -0.252323 0.0327963 +-0.239732 -0.259608 0.0493553 +-0.242639 -0.251027 0.0706418 +-0.27192 -0.270836 -0.02103 +-0.264888 -0.241199 0.0366373 +-0.279792 -0.22631 0.033251 +-0.274206 -0.207933 0.0474852 +-0.283361 -0.276288 -0.0174295 +-0.267659 -0.226048 0.0482271 +0.202151 0.274483 0.19338 +0.194908 0.283204 0.198963 +-0.157532 -0.273615 -0.179435 +-0.176899 -0.279729 -0.184503 +-0.188947 -0.290942 -0.187096 +-0.192598 -0.3074 -0.18306 +-0.203551 -0.297799 -0.190929 +-0.222085 -0.288246 -0.191352 +-0.217908 -0.303036 -0.194268 +-0.355074 -0.426501 -0.195973 +-0.354866 -0.423993 -0.205337 +-0.355569 -0.419108 -0.214528 +-0.353763 -0.412061 -0.224887 +-0.346029 -0.286085 -0.1062 +-0.341227 -0.288967 -0.0947058 +-0.336277 -0.278132 -0.0971269 +-0.328988 -0.269127 -0.105169 +-0.340297 -0.292656 -0.0831052 +-0.335578 -0.266756 -0.115188 +-0.339311 -0.299368 -0.0917431 +0.212569 0.261061 0.18216 +0.216886 0.255854 0.175009 +0.219484 0.251322 0.162982 +0.212289 0.247584 0.170006 +0.218513 0.26322 0.154269 +0.225667 0.261532 0.178216 +0.218436 0.276817 0.178562 +0.234042 0.273996 0.185236 +0.223426 0.242038 0.154678 +0.21181 0.288948 0.181391 +0.220498 0.257755 0.18435 +0.211254 0.266563 0.187703 +0.211739 0.26954 0.199826 +0.278409 -0.209413 -0.174692 +0.233056 0.457965 0.0658843 +0.227063 0.46182 0.0682472 +0.220168 0.458063 0.0666597 +-0.0481392 -0.0447802 0.0166181 +0.131516 0.0530135 0.000672445 +0.12038 0.0567042 0.000376152 +0.134766 0.046581 0.0097546 +0.0956782 -0.141364 0.26837 +0.0877085 -0.13595 0.269242 +0.0854698 -0.124959 0.261926 +0.0839071 -0.111836 0.253439 +0.0904091 -0.099649 0.239147 +0.0872053 -0.136949 0.279095 +0.085161 -0.130401 0.287023 +0.0763801 -0.13103 0.282851 +-0.00884361 -0.0890856 -0.0728998 +-0.00654069 -0.102279 -0.0895079 +-0.0290648 -0.104665 -0.111248 +-0.0100257 -0.116287 -0.107029 +0.0875054 -0.104584 0.297054 +0.191386 -0.264049 -0.175252 +0.190045 -0.262732 -0.156889 +0.204589 -0.269071 -0.178679 +0.222111 -0.273266 -0.172895 +0.189235 0.0753918 -0.0129238 +0.0782752 -0.467624 -0.0498343 +0.0759673 -0.46177 -0.0555898 +0.0772195 -0.460605 -0.0642783 +0.151932 0.323656 0.079912 +0.153175 0.313215 0.0881136 +0.161272 0.302381 0.0857396 +0.163146 0.324848 0.0718597 +0.151557 0.334415 0.0880604 +0.142886 0.334889 0.0972586 +0.140662 0.34411 0.107021 +0.133598 0.347717 0.117582 +0.131314 0.355467 0.129074 +0.127988 0.361743 0.142546 +0.123763 0.348981 0.138438 +0.119822 0.353337 0.149718 +0.116288 0.351928 0.168204 +0.226419 0.174912 -0.00671405 +0.232006 0.15884 0.00199041 +0.243933 0.169091 0.00253819 +0.237571 0.172786 -0.00612936 +0.183717 0.142245 0.147062 +0.183533 0.157982 0.153224 +0.200684 0.169917 0.154336 +0.175927 0.14817 0.154877 +0.164064 0.143191 0.159694 +0.181391 0.132744 0.149775 +0.177453 0.123521 0.157312 +0.108424 0.0602759 0.0311611 +0.101691 0.0511896 0.042029 +0.297187 0.12858 0.124591 +0.286869 0.125817 0.115842 +0.279264 0.13651 0.11071 +0.277464 0.150893 0.114839 +0.267972 0.163015 0.116989 +0.29066 -0.215317 -0.195858 +-0.0439761 -0.143405 -0.149346 +0.0959309 0.0199379 0.158053 +0.0941358 0.00844127 0.16726 +0.273991 -0.158318 0.138404 +0.280108 -0.155995 0.136908 +0.28311 -0.154668 0.131232 +0.287165 -0.152142 0.126309 +0.291082 -0.145525 0.127381 +0.258354 -0.329753 -0.2515 +0.256649 -0.327468 -0.240856 +0.265642 -0.321399 -0.233195 +0.269005 -0.32965 -0.227653 +0.204877 0.287044 0.0357487 +0.289139 -0.339472 -0.226774 +0.282728 -0.335989 -0.224475 +0.283065 -0.327384 -0.221193 +0.28398 -0.316486 -0.219293 +0.289461 -0.305296 -0.210924 +0.2738 -0.310998 -0.221733 +0.2646 -0.301502 -0.221281 +0.282981 -0.339471 -0.231684 +0.275544 -0.336339 -0.239462 +0.259131 -0.2954 -0.232139 +0.281853 -0.296955 -0.202405 +0.287258 -0.287693 -0.192682 +0.301236 -0.282638 -0.194913 +0.23745 0.0270265 -0.0333549 +0.234865 0.0358956 -0.0292661 +0.240774 0.0243245 -0.0402136 +0.034599 -0.0884904 0.28182 +0.0345637 -0.0787252 0.277243 +0.0422003 -0.0728232 0.283477 +0.048607 -0.0763619 0.292696 +0.0395236 -0.0802562 0.266836 +0.0486856 -0.0788086 0.257578 +0.044992 -0.0647291 0.254151 +0.0587204 -0.0731238 0.296598 +0.068389 -0.0812067 0.300077 +0.0829644 -0.0808872 0.290453 +0.0435251 -0.0559756 0.262078 +0.20354 0.276522 0.016541 +-0.253582 -0.386742 -0.238773 +-0.0267016 0.0982672 -0.0374627 +0.214024 0.433945 0.0622105 +0.204736 0.432758 0.058829 +0.201109 0.433103 0.0655996 +0.201809 0.436011 0.073894 +0.193477 0.433855 0.0682907 +0.185218 0.436354 0.0703184 +0.180836 0.436291 0.0819631 +0.191166 0.440882 0.0659291 +0.187348 0.447071 0.070626 +0.179215 0.453739 0.0726364 +0.193028 0.454826 0.0736221 +0.173421 0.440644 0.0776765 +-0.147031 -0.496444 -0.028386 +-0.151597 -0.495421 -0.0374969 +-0.157627 -0.484775 -0.0397619 +-0.140246 -0.499465 -0.0256815 +-0.132401 -0.5 -0.0296698 +-0.132703 -0.497498 -0.0384881 +-0.126331 -0.494492 -0.0452588 +-0.11646 -0.490117 -0.0524448 +-0.101295 -0.487303 -0.0547567 +-0.136101 -0.494007 -0.0471871 +-0.13938 -0.490039 -0.0561432 +-0.133381 -0.483866 -0.0661423 +-0.15577 -0.492035 -0.0446482 +-0.153261 -0.490282 -0.0555144 +0.197755 0.272342 0.0690149 +0.190382 0.263313 0.0560052 +0.0686632 -0.292912 -0.0237205 +0.056243 -0.29127 -0.0303266 +0.0398126 -0.298058 -0.030698 +0.0315681 -0.295788 -0.0489563 +0.043708 -0.285681 -0.061727 +0.0621136 -0.289132 -0.040881 +0.0722108 -0.295077 -0.0484755 +0.0577034 -0.286988 -0.0524253 +0.0569935 -0.281989 -0.0659264 +0.064236 -0.290328 -0.0328163 +-0.0127838 0.0757233 -0.00921143 +0.0935192 0.0772038 0.0642915 +0.169714 0.302879 0.0497006 +0.163659 0.300165 0.0640716 +0.172929 0.295611 0.0434924 +0.049865 0.0913802 0.0221499 +0.0418831 0.0808731 0.013212 +0.0368549 0.0913191 0.0145569 +0.0319565 0.0968433 0.00544037 +0.310435 0.13526 0.142507 +0.026474 0.0305763 -0.129196 +0.017822 0.0292426 -0.122273 +0.0163904 0.0280919 -0.108702 +0.0350495 0.0278097 -0.132911 +0.178361 0.286185 0.0866978 +0.184473 0.288229 0.0959947 +0.0746028 -0.0119842 0.202652 +0.0770488 -0.00198153 0.201878 +0.0861829 0.00359659 0.206228 +0.0964676 0.00912576 0.20305 +0.110414 0.00821695 0.200752 +0.119478 0.0159283 0.18886 +-0.0749585 -0.470198 -0.0703816 +-0.0722579 -0.469101 -0.0627931 +-0.0775597 -0.45771 -0.0519849 +-0.0725204 -0.466379 -0.0530837 +-0.0822617 -0.458336 -0.0360309 +0.11796 -0.00196684 -0.151498 +0.110489 0.008862 -0.155734 +0.119387 0.0273131 -0.141295 +0.100036 0.00317869 -0.149099 +0.0946498 0.00360487 -0.130289 +0.0996271 0.00897841 -0.108462 +0.0876406 0.00969553 -0.149119 +0.0889673 0.0239205 -0.144401 +0.103773 0.0275171 -0.140968 +0.112143 0.0407687 -0.122665 +0.128275 -0.00210722 -0.155193 +0.136944 0.00690927 -0.158099 +0.1315 0.01712 -0.150046 +0.148823 0.0111196 -0.154092 +0.137878 -0.00286061 -0.157253 +0.0812501 0.0180999 -0.148671 +0.0723702 0.0199576 -0.146504 +0.0894465 0.0177562 -0.14994 +-0.244247 -0.411744 -0.197734 +0.0532101 -0.0425986 0.239458 +0.0614299 -0.034607 0.250277 +0.0718515 -0.0264935 0.244569 +0.0612036 -0.0408317 0.227838 +0.211416 0.21985 0.0506815 +0.209629 0.209187 0.0516229 +0.197715 0.200596 0.0531448 +0.210711 0.212673 0.041983 +0.209533 0.205981 0.0261421 +0.207685 0.214484 0.0320655 +0.204793 0.215907 0.019768 +0.207322 0.190012 0.0316877 +0.210424 0.206724 0.0353988 +0.209086 0.197885 0.0355421 +0.19948 0.191764 0.0420701 +0.206287 0.1798 0.0239909 +0.199532 0.162119 0.0159658 +0.0889829 0.0153312 0.187549 +0.0895058 0.0194699 0.175832 +0.0997882 0.0258376 0.180178 +0.0912633 -0.43583 -0.104962 +0.0893849 -0.44209 -0.0966632 +0.0818551 -0.438899 -0.0891003 +0.0775492 -0.435915 -0.0759439 +0.0805228 -0.426773 -0.087989 +0.0848008 -0.421093 -0.0971385 +0.0844397 -0.410175 -0.0930928 +0.0796444 -0.399052 -0.082153 +0.096306 -0.399151 -0.0928503 +0.0992866 -0.434977 -0.10667 +-0.038871 -0.095203 0.134909 +-0.0453136 -0.074362 0.132403 +-0.0642973 -0.0816285 0.135216 +0.128958 0.371237 0.164377 +0.114324 0.368213 0.169385 +0.110394 0.358489 0.182698 +0.119359 0.382173 0.172221 +0.244566 0.0274799 0.091132 +0.236517 0.0321023 0.108593 +0.228129 0.0154777 0.110489 +0.243652 -0.0044318 0.106704 +0.215089 0.0116198 0.126655 +0.193164 -0.00203925 0.149761 +0.295901 -0.145148 0.11649 +0.181002 0.326878 0.162405 +0.192626 0.308402 0.164847 +0.180295 0.335983 0.171005 +0.215019 0.222685 -0.0085752 +0.216226 0.238327 -0.00679645 +0.204842 0.243639 -0.00108745 +0.197086 0.237151 0.00943393 +0.207737 0.21475 -0.00125832 +0.200663 0.225332 0.00994825 +0.227239 0.239308 -0.00361834 +0.210369 0.205349 -0.000451507 +0.212421 0.195338 0.00658041 +0.0965367 0.0723068 0.0490018 +-0.263237 -0.382248 -0.20077 +-0.334935 -0.395374 -0.246716 +0.0666968 0.0983382 0.0352739 +0.0735768 0.104043 0.0256427 +0.0854137 0.105714 0.0280147 +0.0966684 0.103408 0.0197312 +-0.293219 -0.246559 0.00868918 +-0.284829 -0.260543 0.00656712 +0.231694 -0.239358 -0.229883 +0.249173 -0.248287 -0.23972 +-0.313753 -0.278534 -0.156686 +-0.167921 -0.0222432 0.100354 +-0.166557 -0.0217484 0.0804222 +-0.137191 -0.0189498 0.0544508 +-0.183157 -0.0297007 0.0652393 +-0.193717 -0.0386652 0.0428719 +-0.162262 -0.0205653 0.0563587 +-0.148465 -0.0201145 0.071316 +-0.122512 -0.0229086 0.0762312 +-0.112808 -0.0225311 0.0535636 +-0.15755 -0.0225071 0.112728 +-0.13968 -0.0242143 0.109228 +-0.128528 -0.0323847 0.121144 +-0.137944 -0.0426964 0.133983 +0.338353 -0.331842 -0.233 +0.197716 0.0369013 -0.0158252 +0.225598 0.0269623 0.107608 +0.227611 0.0352699 0.116368 +0.216481 0.0416846 0.126455 +0.20366 0.0291575 0.127785 +0.197706 0.0139181 0.138946 +0.177004 0.0154396 0.15063 +0.196436 0.0406475 0.130552 +0.183582 0.0465791 0.137895 +0.171962 0.0340634 0.144092 +0.209838 0.0350513 0.1214 +0.122018 -0.0147207 0.202688 +0.134625 -0.010294 0.190699 +0.150345 -0.0204184 0.190322 +0.171467 -0.0443352 0.191435 +0.124137 -0.0275222 0.21069 +0.115004 -0.0324307 0.220668 +0.103488 -0.0235525 0.230568 +-0.234966 -0.250492 -0.00657503 +0.230136 -0.0629922 0.010065 +0.22781 -0.0439028 0.0052695 +0.226758 -0.0758146 -0.00318988 +0.218119 -0.0755566 -0.0185995 +0.210925 -0.0881128 -0.0299059 +0.195391 -0.0835698 -0.0397083 +0.187049 -0.0970928 -0.0513544 +0.215909 -0.10623 -0.0275177 +0.221663 -0.111792 -0.00835326 +0.21689 -0.135734 -0.006698 +0.187289 -0.0668273 -0.0361071 +0.170089 -0.0549841 -0.0384156 +0.158135 -0.0292105 -0.0224101 +0.144698 -0.0631652 -0.0561794 +0.210349 -0.156804 0.00619425 +0.122465 -0.0210506 -0.020971 +0.25102 0.0827579 -0.00901225 +0.246076 0.0717907 -0.00732438 +0.248146 0.0653429 0.00439784 +0.245544 0.0538898 0.0151974 +0.255748 0.0868229 -0.000826293 +-0.125725 -0.258433 -0.170214 +0.151089 -0.0268375 0.140451 +0.244155 0.0131187 -0.0533056 +0.246127 0.0105937 -0.0612737 +0.239403 0.00492409 -0.0645919 +0.228547 -0.00190445 -0.0800819 +0.236042 0.000460551 -0.073323 +0.244455 -0.00400961 -0.0816292 +0.225173 0.00380285 -0.0703884 +0.247885 -0.00234363 -0.0902777 +0.247838 0.00379159 -0.0839495 +0.243353 0.0148187 -0.0838177 +0.236031 0.0244971 -0.0791546 +0.225616 0.0291453 -0.0875646 +-0.29518 -0.390079 -0.254006 +-0.303646 -0.394416 -0.248506 +-0.302477 -0.403327 -0.233435 +-0.298023 -0.412267 -0.217588 +-0.29425 -0.38151 -0.250683 +-0.302074 -0.390767 -0.254186 +0.191342 0.435898 0.0636941 +-0.0964353 -0.460913 -0.0144457 +0.137532 -0.0116873 0.139128 +0.343547 -0.294973 -0.292923 +0.137424 0.0947211 0.0118894 +0.147115 0.0902563 -0.00271409 +0.147874 0.0802052 -0.0226835 +0.255027 -0.310713 -0.257667 +0.257498 -0.300887 -0.266482 +0.220835 -0.0105204 -0.15317 +0.210403 -0.014095 -0.156518 +0.204562 -0.0228168 -0.148776 +3 561 1199 1209 +3 888 132 1150 +3 2100 17 2103 +3 1317 1316 321 +3 1015 1021 1016 +3 1219 1218 722 +3 970 1215 175 +3 518 520 178 +3 520 434 178 +3 1572 1554 1571 +3 660 661 625 +3 1114 1209 235 +3 272 6 273 +3 6 276 273 +3 607 938 939 +3 228 266 268 +3 2540 1727 2541 +3 2203 2202 2201 +3 11 199 271 +3 906 91 2058 +3 516 2698 2699 +3 2122 2124 2117 +3 1358 1360 752 +3 1345 1358 752 +3 1755 511 1873 +3 2601 1630 2600 +3 2316 2243 2317 +3 976 94 974 +3 101 21 102 +3 1662 1663 31 +3 1667 1663 1662 +3 2042 2043 288 +3 733 734 450 +3 583 1068 1070 +3 987 2169 2168 +3 2162 987 2168 +3 207 38 208 +3 2180 2183 459 +3 2700 250 2703 +3 209 540 928 +3 540 539 928 +3 1441 1440 431 +3 970 2132 94 +3 444 1006 1005 +3 945 1929 2509 +3 611 1498 1499 +3 1766 1771 504 +3 1570 2748 1986 +3 52 1469 1470 +3 2079 52 1470 +3 2346 2352 1364 +3 322 319 1742 +3 917 918 169 +3 513 555 691 +3 1984 240 1983 +3 400 1946 1947 +3 839 530 177 +3 1120 345 343 +3 1876 1875 131 +3 5 962 1092 +3 1328 1326 712 +3 78 27 1583 +3 1473 1664 168 +3 1932 1933 2594 +3 21 103 102 +3 21 101 29 +3 2158 943 1148 +3 281 2158 1148 +3 287 1920 1921 +3 1247 1845 429 +3 1735 1736 330 +3 682 1171 1169 +3 1170 682 1169 +3 1473 66 1664 +3 68 893 120 +3 253 1728 333 +3 1324 1325 437 +3 792 383 464 +3 1321 736 714 +3 1500 405 1499 +3 272 11 271 +3 270 272 271 +3 219 2098 2097 +3 251 252 74 +3 672 669 705 +3 1216 934 1214 +3 1581 1582 1958 +3 89 2051 961 +3 710 720 1217 +3 710 718 720 +3 47 274 273 +3 83 1962 2224 +3 200 147 64 +3 1980 1978 1979 +3 539 839 177 +3 74 254 1599 +3 252 254 74 +3 668 692 1488 +3 646 692 668 +3 289 17 290 +3 17 2100 290 +3 540 209 900 +3 264 262 289 +3 262 17 289 +3 1066 642 1803 +3 113 192 189 +3 1040 1033 866 +3 1504 2549 2226 +3 205 536 231 +3 1960 1582 27 +3 355 72 356 +3 660 643 659 +3 80 161 151 +3 1117 627 1155 +3 426 1390 1395 +3 790 789 384 +3 171 2637 447 +3 152 2078 150 +3 1638 1640 1639 +3 1640 1264 1639 +3 1483 134 1482 +3 2122 2115 2124 +3 349 2115 2122 +3 553 520 517 +3 64 257 267 +3 132 356 368 +3 367 132 368 +3 115 889 888 +3 86 2541 2542 +3 81 1283 1290 +3 1799 678 1802 +3 1623 570 696 +3 631 588 1788 +3 489 486 488 +3 1835 1247 54 +3 1686 1564 503 +3 1153 1053 1052 +3 42 1805 1808 +3 21 67 104 +3 79 78 82 +3 20 103 116 +3 20 149 103 +3 67 21 249 +3 999 251 1000 +3 252 251 65 +3 635 876 1646 +3 2001 114 2000 +3 1130 388 1131 +3 124 1598 1599 +3 157 1874 156 +3 118 157 156 +3 1776 1873 511 +3 496 497 399 +3 1127 740 298 +3 1241 1008 1244 +3 852 1796 1795 +3 2660 1796 852 +3 560 1206 1205 +3 1654 1022 1653 +3 151 161 51 +3 779 1544 1545 +3 736 716 451 +3 715 716 736 +3 980 982 61 +3 273 274 11 +3 903 91 902 +3 576 2278 1306 +3 1289 1462 1466 +3 68 120 116 +3 231 523 541 +3 133 356 889 +3 1520 1546 1519 +3 257 1700 261 +3 2057 2058 91 +3 6 266 276 +3 2529 63 239 +3 229 310 312 +3 40 82 78 +3 82 40 102 +3 764 1341 1340 +3 1343 764 1340 +3 163 256 258 +3 1966 163 258 +3 21 104 103 +3 928 176 1720 +3 928 929 176 +3 1874 157 158 +3 67 242 104 +3 276 228 47 +3 63 1985 239 +3 307 228 268 +3 421 422 181 +3 1726 1727 337 +3 1145 2409 2410 +3 2437 580 1086 +3 1468 1289 1466 +3 2 1120 1121 +3 1046 2488 2489 +3 1791 212 1789 +3 1716 981 1712 +3 257 261 267 +3 425 1411 1231 +3 512 2697 516 +3 2697 2696 516 +3 116 103 104 +3 157 118 119 +3 71 128 158 +3 63 240 1985 +3 1874 158 1875 +3 2032 2030 2031 +3 2263 2410 2264 +3 247 104 242 +3 247 68 104 +3 671 647 656 +3 1482 73 2113 +3 973 173 975 +3 256 24 258 +3 2001 2000 916 +3 1704 163 1471 +3 122 1000 74 +3 270 271 64 +3 417 144 416 +3 2203 2732 2167 +3 804 393 464 +3 1974 1560 2586 +3 2672 890 883 +3 890 885 883 +3 129 72 355 +3 275 107 286 +3 107 275 312 +3 217 81 1290 +3 2032 2031 134 +3 2204 2653 2202 +3 1118 1422 1421 +3 398 800 799 +3 2599 1622 695 +3 124 1599 254 +3 983 34 975 +3 885 1971 1969 +3 96 1299 268 +3 912 1747 915 +3 137 2109 2114 +3 23 227 76 +3 589 786 693 +3 330 1474 325 +3 1474 1475 325 +3 1332 1325 713 +3 1575 16 1574 +3 533 90 535 +3 2172 2204 2167 +3 2214 2557 2556 +3 1776 1764 1873 +3 271 199 200 +3 163 80 1471 +3 258 24 259 +3 301 146 927 +3 303 301 927 +3 555 551 170 +3 260 1967 1486 +3 229 309 310 +3 1875 158 131 +3 1878 2366 1463 +3 156 152 118 +3 1448 1452 1447 +3 742 889 115 +3 133 889 742 +3 935 1215 970 +3 971 935 970 +3 2645 686 2647 +3 431 180 432 +3 1702 147 894 +3 249 21 29 +3 82 161 79 +3 1267 2364 2659 +3 2711 77 838 +3 139 354 2121 +3 1307 1308 2249 +3 68 116 104 +3 1027 1022 1654 +3 2748 1569 1685 +3 1215 1216 1214 +3 1321 715 736 +3 906 901 91 +3 811 381 810 +3 496 375 497 +3 749 1172 2106 +3 819 817 473 +3 546 1339 172 +3 546 1338 1339 +3 885 890 1971 +3 625 1117 1122 +3 660 625 1122 +3 1234 1227 1238 +3 2690 2689 1417 +3 488 485 489 +3 1671 1197 1196 +3 1326 437 1325 +3 1381 1009 429 +3 913 912 914 +3 1835 1834 1246 +3 1834 1837 1246 +3 2708 2711 234 +3 985 971 977 +3 2637 2683 184 +3 1454 2739 1443 +3 257 1697 1700 +3 257 1698 1697 +3 338 323 1123 +3 1121 1120 344 +3 1498 543 1499 +3 2025 113 2006 +3 136 1478 1479 +3 1471 1693 1704 +3 204 958 959 +3 312 311 107 +3 312 310 311 +3 2059 2055 202 +3 999 121 251 +3 200 59 894 +3 1750 234 834 +3 843 215 1790 +3 532 843 1790 +3 85 335 1730 +3 607 899 608 +3 379 789 792 +3 961 960 959 +3 1996 976 918 +3 976 169 918 +3 1774 2719 2720 +3 271 200 64 +3 510 1673 1672 +3 2747 1682 2746 +3 1682 2747 1570 +3 1091 1089 1090 +3 183 2568 2569 +3 788 379 572 +3 1757 1763 1773 +3 462 802 376 +3 2137 1033 1032 +3 502 501 1560 +3 314 2035 2041 +3 462 463 495 +3 1164 759 1165 +3 539 177 929 +3 1211 1212 933 +3 1872 248 99 +3 1899 586 2236 +3 122 998 999 +3 266 96 268 +3 218 1596 1597 +3 48 306 307 +3 525 2703 2704 +3 2703 525 524 +3 1877 1876 454 +3 1790 1789 964 +3 780 2216 2215 +3 300 39 304 +3 39 300 313 +3 1515 1517 1522 +3 1567 1682 1566 +3 396 938 607 +3 2497 2311 2310 +3 527 840 841 +3 445 425 1233 +3 515 1495 2715 +3 1243 436 1242 +3 1658 2148 2153 +3 495 375 496 +3 1684 1683 1687 +3 1683 1567 1687 +3 1625 1626 570 +3 449 548 2635 +3 168 913 914 +3 255 1736 1735 +3 1736 255 1737 +3 356 72 368 +3 125 2225 1965 +3 125 1965 1967 +3 1105 2165 281 +3 877 1644 1361 +3 74 1000 251 +3 115 888 887 +3 123 74 1599 +3 74 123 122 +3 723 722 731 +3 30 527 529 +3 30 526 527 +3 381 812 810 +3 253 1731 1729 +3 333 1726 1733 +3 166 539 540 +3 1125 324 1123 +3 1736 1474 330 +3 2643 2642 686 +3 1731 1732 252 +3 223 1364 2355 +3 274 275 12 +3 2115 2116 2124 +3 1670 1832 1830 +3 574 1678 1067 +3 1053 1153 627 +3 1133 410 1072 +3 11 272 273 +3 903 1315 206 +3 1607 701 3 +3 2352 2346 2345 +3 171 2636 2682 +3 2072 2071 2070 +3 313 311 39 +3 311 310 39 +3 740 14 741 +3 6 265 266 +3 2150 1031 1035 +3 1042 2141 2140 +3 230 1483 135 +3 1779 509 1502 +3 577 681 767 +3 682 681 2106 +3 227 23 416 +3 786 706 669 +3 229 275 47 +3 228 229 47 +3 23 1146 2290 +3 2170 2653 2205 +3 2656 2655 818 +3 229 312 275 +3 803 376 794 +3 495 496 462 +3 1642 1458 478 +3 1262 1640 1638 +3 184 2690 2691 +3 1122 1117 1155 +3 821 826 398 +3 826 1168 398 +3 1878 1877 454 +3 133 742 740 +3 22 2047 293 +3 302 741 1002 +3 1632 572 575 +3 1131 1632 575 +3 1751 2708 234 +3 2708 1751 508 +3 1729 1731 65 +3 1709 1708 190 +3 2070 2071 954 +3 293 2047 2046 +3 889 132 888 +3 25 325 986 +3 229 228 308 +3 1146 76 1011 +3 1147 311 313 +3 140 415 787 +3 351 350 295 +3 2263 1156 3 +3 623 655 663 +3 740 1127 14 +3 2681 2684 404 +3 1197 561 560 +3 1199 561 1197 +3 2164 2201 2170 +3 2342 704 2343 +3 521 177 530 +3 596 1181 380 +3 1385 2309 2422 +3 825 142 823 +3 940 142 825 +3 174 323 339 +3 660 1122 643 +3 332 319 322 +3 1414 1399 1616 +3 2639 1802 678 +3 166 540 908 +3 928 539 929 +3 521 530 519 +3 1720 209 928 +3 327 88 329 +3 2453 769 2458 +3 911 1747 913 +3 1251 303 927 +3 2457 936 769 +3 1128 578 1130 +3 913 168 911 +3 316 1711 1710 +3 2258 2270 2408 +3 1791 1793 1792 +3 1713 1715 2545 +3 215 843 844 +3 338 1123 1740 +3 795 794 376 +3 285 1057 1056 +3 1097 1939 1942 +3 1745 1744 1100 +3 2263 2264 1156 +3 1941 996 280 +3 1734 75 1732 +3 495 806 830 +3 403 825 2685 +3 1244 1008 1236 +3 1447 1452 469 +3 2709 2707 523 +3 554 728 720 +3 2038 2037 291 +3 180 1121 344 +3 1422 1398 427 +3 455 130 739 +3 887 888 351 +3 888 1150 351 +3 578 1128 797 +3 144 227 416 +3 2299 701 2300 +3 1629 1624 1623 +3 484 772 2581 +3 1485 2671 139 +3 2674 138 884 +3 364 1950 1257 +3 1213 969 175 +3 370 230 135 +3 1009 1247 429 +3 1257 1259 1266 +3 886 1969 1177 +3 825 823 401 +3 741 739 740 +3 133 740 739 +3 2694 423 1681 +3 775 1546 1520 +3 2579 2582 1557 +3 806 495 463 +3 766 2462 2463 +3 1168 826 402 +3 2692 1417 2688 +3 423 2692 2688 +3 1200 1203 1201 +3 380 1179 598 +3 231 536 537 +3 1190 515 1191 +3 1426 1456 2612 +3 1456 183 2612 +3 1758 1774 2720 +3 1066 1062 642 +3 1689 2244 2243 +3 484 483 1 +3 1219 721 1218 +3 512 513 691 +3 610 606 544 +3 379 575 572 +3 2106 1172 682 +3 487 483 484 +3 602 1188 1189 +3 811 500 784 +3 286 2041 287 +3 208 335 85 +3 839 840 530 +3 840 839 528 +3 2744 1044 1113 +3 205 533 534 +3 119 465 117 +3 770 606 397 +3 1304 596 1305 +3 405 604 610 +3 1502 2715 514 +3 396 937 938 +3 941 2684 2680 +3 1643 1454 1642 +3 605 2462 1158 +3 2647 694 2645 +3 879 757 873 +3 1402 2597 1680 +3 2284 2285 414 +3 1332 1326 1325 +3 513 514 1339 +3 441 422 440 +3 1684 1685 1569 +3 1683 1684 1569 +3 1880 834 1881 +3 1243 1241 441 +3 387 1307 1627 +3 408 2228 1537 +3 2228 408 1508 +3 654 652 657 +3 1453 468 467 +3 1433 1643 1642 +3 608 896 396 +3 830 2656 818 +3 440 1611 439 +3 449 734 733 +3 453 1417 2692 +3 721 1005 719 +3 1200 510 1203 +3 826 940 402 +3 394 797 1128 +3 725 726 724 +3 435 432 433 +3 2706 522 2701 +3 562 1207 1205 +3 447 2691 185 +3 584 2640 2639 +3 1128 1130 575 +3 613 1376 1377 +3 555 170 691 +3 1374 1375 637 +3 1779 1502 233 +3 1073 592 612 +3 1756 1204 509 +3 448 447 185 +3 1489 547 546 +3 185 445 442 +3 687 567 690 +3 659 662 622 +3 1006 1333 466 +3 2697 170 2696 +3 448 171 447 +3 597 1342 1341 +3 611 610 544 +3 2300 1602 2299 +3 1611 1444 372 +3 2702 523 2701 +3 734 171 448 +3 466 719 1005 +3 967 1527 1529 +3 517 520 518 +3 764 597 1341 +3 2582 2579 2580 +3 1447 471 141 +3 553 551 552 +3 734 448 450 +3 398 802 820 +3 729 732 450 +3 552 520 553 +3 592 649 1788 +3 1750 1751 234 +3 820 821 398 +3 406 784 500 +3 1438 1643 1433 +3 2284 414 2287 +3 749 2106 577 +3 611 544 1497 +3 463 462 376 +3 803 463 376 +3 1510 1507 1512 +3 1546 1505 777 +3 537 46 538 +3 686 2645 2644 +3 483 487 504 +3 776 1546 1536 +3 1196 560 1198 +3 1572 1571 1555 +3 2711 835 234 +3 2019 2004 2018 +3 121 125 251 +3 125 121 949 +3 1706 1707 568 +3 536 46 537 +3 267 2717 64 +3 1759 1761 2730 +3 1761 1762 2730 +3 489 492 486 +3 695 1622 567 +3 1547 1573 1571 +3 491 484 501 +3 2216 2217 378 +3 793 2221 2219 +3 804 463 803 +3 1573 1549 493 +3 1716 318 1717 +3 1514 1515 1509 +3 858 1036 1035 +3 1780 2728 2727 +3 520 179 434 +3 589 1053 707 +3 2640 639 673 +3 1497 545 1496 +3 1762 506 557 +3 2451 1707 385 +3 2723 2725 2722 +3 233 1753 1779 +3 1753 1754 1779 +3 739 738 133 +3 1 483 837 +3 1054 613 1377 +3 1055 613 1054 +3 730 729 450 +3 789 383 792 +3 1070 1068 1069 +3 388 1070 1069 +3 1004 444 1005 +3 840 526 530 +3 526 519 530 +3 797 796 167 +3 715 548 549 +3 1335 548 715 +3 717 735 554 +3 735 732 554 +3 1322 550 1334 +3 1321 1322 1334 +3 441 1241 54 +3 1182 2464 412 +3 803 2222 804 +3 232 516 522 +3 235 1209 1200 +3 1566 485 922 +3 50 723 731 +3 721 710 1218 +3 526 525 519 +3 525 526 30 +3 887 1970 886 +3 216 527 841 +3 527 526 840 +3 701 1601 3 +3 205 534 536 +3 531 529 527 +3 216 531 527 +3 2434 2433 1661 +3 531 532 533 +3 216 532 531 +3 1147 108 2044 +3 205 531 533 +3 929 930 176 +3 535 534 533 +3 2723 2722 2724 +3 210 901 904 +3 166 908 909 +3 841 528 842 +3 841 840 528 +3 46 196 538 +3 1065 93 648 +3 166 528 539 +3 142 940 826 +3 1489 546 1491 +3 728 50 731 +3 2724 1690 2726 +3 547 548 438 +3 172 1493 1492 +3 1491 546 172 +3 2549 143 2226 +3 651 624 679 +3 557 1758 2729 +3 713 737 466 +3 691 170 2697 +3 871 868 751 +3 170 551 553 +3 388 1310 573 +3 542 1500 1493 +3 1671 1672 1197 +3 728 731 720 +3 711 1219 722 +3 1358 755 1359 +3 1345 755 1358 +3 1327 552 551 +3 437 1327 551 +3 693 1050 589 +3 693 618 1050 +3 1060 642 1062 +3 570 1624 1625 +3 691 2697 512 +3 1310 388 1069 +3 1132 1070 388 +3 584 638 2640 +3 2611 2610 563 +3 759 597 898 +3 597 759 758 +3 898 608 899 +3 1905 1904 743 +3 666 683 591 +3 649 632 631 +3 718 710 719 +3 819 476 817 +3 663 655 622 +3 604 603 1166 +3 603 604 405 +3 830 476 495 +3 683 666 621 +3 552 699 179 +3 1054 581 1055 +3 1805 105 57 +3 800 395 799 +3 622 658 659 +3 2327 2326 1187 +3 886 115 887 +3 1190 559 1189 +3 644 665 661 +3 2628 1801 582 +3 396 607 608 +3 2713 2712 1191 +3 635 1646 877 +3 606 0 607 +3 666 664 621 +3 660 644 661 +3 584 2639 2641 +3 1787 588 1786 +3 684 696 570 +3 696 684 1080 +3 381 784 814 +3 1349 1356 1348 +3 1355 1356 1349 +3 395 2457 813 +3 1305 596 595 +3 1135 602 1207 +3 2155 2154 1028 +3 0 899 607 +3 2639 2640 673 +3 2647 2646 566 +3 719 710 721 +3 2712 1195 2716 +3 1330 439 1329 +3 2329 1193 1188 +3 831 2651 819 +3 2301 701 1606 +3 1135 1134 602 +3 2330 2322 1185 +3 2251 2252 574 +3 601 1500 542 +3 543 1500 1499 +3 730 50 729 +3 1129 1128 575 +3 1165 1166 605 +3 1166 1165 604 +3 2521 2520 1607 +3 606 607 397 +3 1358 1359 756 +3 391 1340 1304 +3 1343 1340 391 +3 138 2122 2117 +3 1337 438 1336 +3 1453 2119 346 +3 132 367 1149 +3 770 544 606 +3 656 679 624 +3 654 657 658 +3 2728 1759 2729 +3 1053 708 707 +3 640 1171 1172 +3 623 664 666 +3 1668 1669 646 +3 799 376 802 +3 657 653 644 +3 653 665 644 +3 2328 1179 599 +3 593 632 649 +3 651 581 652 +3 624 652 654 +3 697 1080 1079 +3 755 1345 1342 +3 744 1904 1905 +3 583 1070 1071 +3 1969 886 1970 +3 1167 1168 402 +3 694 567 687 +3 1404 1391 2308 +3 623 666 671 +3 658 657 644 +3 655 656 624 +3 622 655 654 +3 655 624 654 +3 623 656 655 +3 1899 1901 586 +3 802 398 799 +3 679 614 651 +3 1066 1061 1062 +3 622 654 658 +3 652 581 653 +3 1622 1623 696 +3 870 634 867 +3 1669 693 646 +3 623 671 656 +3 138 350 2122 +3 1888 1887 881 +3 692 646 693 +3 1841 1231 1840 +3 717 554 720 +3 707 708 628 +3 592 1073 1065 +3 1336 438 1335 +3 2130 668 1488 +3 843 532 216 +3 703 1608 2520 +3 1760 1777 2725 +3 733 732 549 +3 867 680 868 +3 1117 625 1116 +3 475 815 2655 +3 1532 1521 1548 +3 949 948 245 +3 476 830 818 +3 1159 1160 1164 +3 1541 1543 779 +3 2522 2517 1609 +3 1706 1620 1989 +3 976 974 169 +3 845 215 844 +3 1648 215 845 +3 718 451 717 +3 451 716 717 +3 552 179 520 +3 348 2108 2107 +3 451 718 719 +3 1350 754 1352 +3 732 735 549 +3 717 720 718 +3 729 554 732 +3 554 729 728 +3 1563 502 1974 +3 864 2142 2143 +3 759 1160 758 +3 940 825 403 +3 50 728 729 +3 1217 722 1218 +3 737 719 466 +3 889 356 132 +3 451 719 737 +3 737 714 736 +3 451 737 736 +3 738 356 133 +3 1902 1903 744 +3 1373 2641 1376 +3 561 791 92 +3 867 748 680 +3 1426 2470 1118 +3 873 872 751 +3 392 762 1355 +3 938 403 939 +3 576 1306 1307 +3 2636 171 2634 +3 132 1149 1150 +3 759 1164 1160 +3 608 898 895 +3 425 453 1410 +3 768 577 767 +3 751 879 873 +3 399 821 820 +3 795 799 395 +3 791 809 383 +3 1340 763 1304 +3 1004 1220 1221 +3 779 1542 1541 +3 2661 2660 852 +3 949 121 948 +3 689 1080 1081 +3 2295 1003 2294 +3 1541 407 1543 +3 279 2157 225 +3 1657 2154 2155 +3 345 2111 343 +3 379 788 789 +3 393 792 464 +3 938 940 403 +3 763 2466 1304 +3 1196 1195 237 +3 2216 2555 2215 +3 799 795 376 +3 1168 1167 800 +3 821 142 826 +3 464 807 805 +3 378 2554 2555 +3 1111 2459 937 +3 805 807 806 +3 804 805 463 +3 804 464 805 +3 791 382 809 +3 805 806 463 +3 1195 559 2716 +3 383 809 464 +3 381 811 784 +3 2214 815 783 +3 817 378 473 +3 2656 475 2655 +3 784 815 814 +3 940 937 402 +3 937 940 938 +3 2106 681 577 +3 1168 800 398 +3 1923 2551 1106 +3 473 832 831 +3 1884 1883 835 +3 528 839 539 +3 16 2583 1577 +3 1032 2138 2137 +3 1570 2747 2748 +3 842 216 841 +3 962 853 1092 +3 2172 2167 2733 +3 232 522 2706 +3 2273 2274 851 +3 2148 2144 1030 +3 1122 1155 643 +3 859 1039 1019 +3 2026 2025 920 +3 2112 2123 135 +3 1151 44 351 +3 861 2274 2745 +3 2143 2142 2145 +3 1035 1036 1018 +3 898 899 759 +3 299 14 1127 +3 609 897 896 +3 2670 2669 294 +3 2331 2332 600 +3 680 748 1900 +3 1886 1887 1351 +3 1126 297 1127 +3 892 115 886 +3 742 115 892 +3 915 1747 1746 +3 740 742 892 +3 207 894 59 +3 895 896 608 +3 1113 856 1112 +3 75 330 1110 +3 901 210 900 +3 901 900 902 +3 985 982 935 +3 1376 1798 1377 +3 1719 1720 176 +3 1059 1108 1109 +3 1398 426 1396 +3 948 947 245 +3 1478 1480 1479 +3 2683 2637 2682 +3 1861 1862 2415 +3 382 2741 808 +3 809 382 808 +3 2686 401 2683 +3 403 2685 941 +3 992 459 989 +3 282 1057 944 +3 71 127 128 +3 2201 988 2200 +3 1606 701 1607 +3 2498 2311 2497 +3 2385 2175 2386 +3 2175 2385 2176 +3 1210 2312 932 +3 2653 2170 2202 +3 2411 2283 2280 +3 122 999 1000 +3 241 248 60 +3 459 987 989 +3 2169 987 459 +3 2326 599 1186 +3 2016 977 2015 +3 121 893 948 +3 893 121 999 +3 1191 2714 2713 +3 1226 1818 1819 +3 910 1662 1661 +3 1093 851 1094 +3 854 1093 1094 +3 2298 1602 2297 +3 1021 1022 1027 +3 2743 2742 1114 +3 1966 258 84 +3 1964 1966 84 +3 2085 1282 2086 +3 2355 2353 1255 +3 1364 2353 2355 +3 2173 2207 2192 +3 1278 1137 1273 +3 979 61 978 +3 1237 1836 1670 +3 2091 1283 222 +3 2401 875 2399 +3 1258 1257 1253 +3 364 1257 1258 +3 1594 1595 1138 +3 1594 457 1595 +3 2098 219 2099 +3 2510 1508 1510 +3 1359 880 756 +3 2050 197 2051 +3 2576 2579 2577 +3 2576 1559 2579 +3 965 964 963 +3 965 963 214 +3 906 411 904 +3 411 906 954 +3 2120 2123 2112 +3 2625 2123 2120 +3 954 906 213 +3 111 2040 2038 +3 2429 905 1976 +3 1976 210 2429 +3 210 904 2429 +3 57 1806 1805 +3 2146 2149 2147 +3 201 2059 207 +3 756 2236 586 +3 2236 756 869 +3 2063 959 958 +3 535 958 204 +3 328 1868 1867 +3 1318 2062 206 +3 960 534 204 +3 2057 2056 203 +3 1735 330 1734 +3 1316 206 1315 +3 855 1653 1650 +3 274 58 11 +3 58 274 1918 +3 1795 1796 212 +3 1796 963 212 +3 1792 1795 212 +3 982 1216 935 +3 1977 1976 1975 +3 2072 2074 2071 +3 2074 2072 214 +3 2076 962 955 +3 962 957 955 +3 2071 2074 955 +3 2074 2076 955 +3 2076 2074 2075 +3 1600 533 532 +3 1976 905 1975 +3 2074 214 2075 +3 1801 587 1800 +3 1749 1561 1748 +3 1565 1749 1748 +3 909 908 1977 +3 968 309 226 +3 296 2667 2046 +3 2667 293 2046 +3 2107 2108 2125 +3 1513 1509 778 +3 1514 1513 1507 +3 715 549 716 +3 2703 250 2704 +3 2648 685 2643 +3 685 2642 2643 +3 1525 1524 55 +3 1520 1524 1525 +3 1517 1515 1514 +3 340 1951 1978 +3 1507 1516 1514 +3 2228 2229 1537 +3 2229 2228 782 +3 662 643 1613 +3 1614 662 1613 +3 1511 408 967 +3 2226 143 2231 +3 2227 2226 2231 +3 2668 2664 2669 +3 2668 2666 2664 +3 22 291 292 +3 2631 683 621 +3 773 2631 621 +3 2574 1952 2572 +3 1952 1953 2572 +3 309 39 310 +3 309 968 39 +3 968 304 39 +3 1377 1798 587 +3 37 188 1709 +3 1104 2196 1929 +3 973 974 94 +3 974 973 975 +3 1665 9 1663 +3 982 985 61 +3 66 1667 1664 +3 974 914 169 +3 914 974 34 +3 914 917 169 +3 291 2037 288 +3 430 1444 1445 +3 430 2718 1444 +3 188 980 979 +3 2136 1033 2137 +3 1658 1657 1029 +3 969 173 973 +3 173 969 409 +3 326 87 1124 +3 326 1476 87 +3 681 1170 2455 +3 1170 167 2455 +3 2040 2039 2038 +3 975 34 974 +3 1679 1047 1650 +3 914 912 917 +3 33 339 338 +3 33 984 339 +3 1014 1016 846 +3 1014 2493 1016 +3 1866 2615 2624 +3 2615 1865 2624 +3 1145 2410 2263 +3 977 971 972 +3 971 94 972 +3 136 1475 1476 +3 1477 136 1476 +3 1477 327 329 +3 720 731 1217 +3 38 1318 336 +3 911 910 1666 +3 1847 1249 1844 +3 1660 4 195 +3 906 904 901 +3 188 37 980 +3 1711 1716 1712 +3 1737 322 1740 +3 342 34 983 +3 320 342 983 +3 760 1163 1353 +3 1217 731 722 +3 1475 986 325 +3 2540 86 2544 +3 316 190 97 +3 980 981 982 +3 983 975 173 +3 984 983 173 +3 984 320 983 +3 2118 347 2119 +3 1723 1722 317 +3 984 173 409 +3 339 984 409 +3 33 320 984 +3 971 985 935 +3 342 97 190 +3 1013 850 1014 +3 2748 1686 1986 +3 2580 2581 1558 +3 944 285 1101 +3 1057 285 944 +3 1939 1938 1098 +3 2250 1310 2252 +3 1982 242 241 +3 242 67 241 +3 2179 990 2181 +3 2178 2188 2189 +3 1919 1915 1916 +3 1919 110 1915 +3 1517 966 1518 +3 1522 1517 1518 +3 2184 2181 2182 +3 70 122 123 +3 998 122 70 +3 2008 978 2022 +3 2021 2008 2022 +3 2170 989 2164 +3 1942 1940 1943 +3 1945 341 1940 +3 2165 945 2166 +3 75 1379 254 +3 41 1980 1979 +3 998 893 999 +3 120 893 998 +3 70 120 998 +3 341 1098 2191 +3 2187 2178 2182 +3 2187 2182 990 +3 2643 686 2644 +3 134 2031 2034 +3 2299 2298 1601 +3 2299 1602 2298 +3 994 2191 2186 +3 2277 1305 1306 +3 391 1305 2277 +3 692 693 669 +3 2279 1141 1586 +3 817 476 2654 +3 476 818 2654 +3 280 996 995 +3 994 2184 2182 +3 997 2169 459 +3 2183 997 459 +3 2536 159 2535 +3 2179 2180 992 +3 2181 2180 2179 +3 2347 2346 2348 +3 1876 1877 1875 +3 100 40 105 +3 2372 1267 53 +3 1267 2372 2368 +3 969 2132 970 +3 2054 2050 2051 +3 2054 201 2050 +3 301 303 1002 +3 741 301 1002 +3 301 741 14 +3 1828 1829 1235 +3 2323 1184 2324 +3 723 726 1222 +3 726 723 724 +3 1004 1005 721 +3 724 723 50 +3 50 730 724 +3 440 1243 441 +3 1321 1334 715 +3 466 1005 1006 +3 724 730 727 +3 443 724 727 +3 1821 1820 186 +3 1820 1821 1226 +3 1674 1672 1503 +3 1009 428 181 +3 1241 1240 1008 +3 439 436 1243 +3 912 915 2002 +3 915 916 2002 +3 2033 2034 2031 +3 2034 2033 1479 +3 329 1481 1480 +3 2676 1659 1654 +3 1653 2676 1654 +3 422 441 1009 +3 181 422 1009 +3 445 453 425 +3 688 1107 1077 +3 1010 828 829 +3 1077 1107 827 +3 1925 2553 1923 +3 2659 2362 362 +3 2362 2659 2364 +3 1510 1508 1511 +3 2512 2513 1157 +3 2230 782 2213 +3 1060 1109 642 +3 677 2294 2293 +3 690 828 1010 +3 334 1727 1728 +3 1727 333 1728 +3 1147 313 108 +3 183 2614 2612 +3 2043 2042 2044 +3 2057 91 903 +3 2056 2055 2060 +3 2055 89 2060 +3 1215 1214 175 +3 1659 2156 1655 +3 1032 2146 2145 +3 1657 2155 2156 +3 2155 1028 2156 +3 2478 2486 1025 +3 183 2569 2570 +3 860 1017 1016 +3 1690 2243 2315 +3 2314 1690 2315 +3 2136 1041 2135 +3 1041 2141 2135 +3 1220 721 1219 +3 1795 1792 1794 +3 485 1562 489 +3 2293 2294 700 +3 1601 2293 700 +3 1017 859 1019 +3 1017 1018 859 +3 1222 711 723 +3 847 1014 846 +3 1020 847 846 +3 1019 1020 846 +3 1918 2468 58 +3 847 1013 1014 +3 1269 2695 1472 +3 1781 1270 1258 +3 358 1781 1258 +3 921 1993 2001 +3 1654 1655 1027 +3 1399 1414 2597 +3 1414 1403 2597 +3 2139 1041 2138 +3 1021 857 1022 +3 28 1583 1581 +3 1810 28 1581 +3 2005 2024 2023 +3 2139 2140 2141 +3 2151 2150 1034 +3 2150 2151 865 +3 1079 689 2480 +3 1153 590 1154 +3 1153 1049 590 +3 955 411 954 +3 644 660 659 +3 774 590 1049 +3 617 774 1049 +3 645 2131 1003 +3 2131 2296 1003 +3 411 955 957 +3 1043 2133 2745 +3 854 1089 1091 +3 1093 854 1091 +3 35 2008 2007 +3 2008 191 2007 +3 2110 347 2109 +3 324 1736 1737 +3 1994 2012 2011 +3 2012 1995 2011 +3 1031 2149 2146 +3 1030 2144 2143 +3 1032 1033 858 +3 1814 1739 255 +3 859 1037 1039 +3 1695 148 1694 +3 2487 2486 1024 +3 2706 2701 523 +3 1685 1684 1568 +3 602 2327 1187 +3 231 529 205 +3 1031 858 1035 +3 2149 2150 865 +3 1034 1035 1018 +3 1688 1687 558 +3 2068 2067 951 +3 1662 31 1661 +3 2491 1015 2492 +3 1015 2493 2492 +3 2486 2478 1045 +3 2478 2479 1045 +3 1017 860 1018 +3 1018 1036 859 +3 1036 1037 859 +3 1036 1040 1037 +3 1039 849 1019 +3 1016 1017 846 +3 1017 1019 846 +3 1038 849 1039 +3 1033 2273 866 +3 2273 1033 862 +3 1947 1428 2469 +3 1040 1036 858 +3 1686 494 2246 +3 1564 1686 2246 +3 1794 849 1038 +3 1768 1770 1769 +3 1040 866 1037 +3 1996 1997 2013 +3 1038 1037 866 +3 2172 995 2171 +3 2073 953 951 +3 2069 2070 954 +3 2069 953 2070 +3 2593 2591 2583 +3 2593 2582 2591 +3 2145 1030 2143 +3 2140 2139 864 +3 2619 2618 9 +3 2005 2018 2017 +3 1988 2235 2236 +3 869 1988 2236 +3 988 2163 2165 +3 659 658 644 +3 924 1959 1956 +3 192 1866 189 +3 2744 861 2745 +3 1090 850 1013 +3 907 1090 1013 +3 2484 2486 1045 +3 626 1155 1154 +3 1155 627 1154 +3 2202 2170 2201 +3 2745 2133 1044 +3 2133 856 1044 +3 233 514 513 +3 1502 514 233 +3 213 2066 2068 +3 2066 2067 2068 +3 2015 977 972 +3 2077 2063 958 +3 2539 1722 1725 +3 2143 2144 864 +3 1993 2026 920 +3 921 2026 1993 +3 1665 1667 66 +3 617 1049 1050 +3 1051 617 1050 +3 653 1051 618 +3 1051 1050 618 +3 581 1051 653 +3 1075 2446 2444 +3 1154 627 1153 +3 1050 1052 589 +3 1050 1049 1052 +3 1154 621 626 +3 590 621 1154 +3 1914 1912 1892 +3 1908 1907 744 +3 1051 581 1054 +3 1052 1049 1153 +3 457 1596 1595 +3 1596 218 1595 +3 1051 1054 617 +3 2377 264 2378 +3 651 650 1055 +3 650 651 614 +3 2103 2104 217 +3 100 101 40 +3 698 1059 2564 +3 2563 698 2564 +3 598 385 569 +3 385 598 1134 +3 1060 1062 1058 +3 659 643 662 +3 1068 583 1062 +3 1099 1745 1100 +3 284 1099 1100 +3 639 1067 1066 +3 673 639 1066 +3 642 1804 1803 +3 1061 1066 1067 +3 1059 1109 1060 +3 1078 1077 698 +3 697 696 1080 +3 2252 2251 2250 +3 1078 688 1077 +3 570 1991 684 +3 1991 570 1626 +3 1071 1064 583 +3 1064 1071 93 +3 579 1071 1070 +3 579 1072 1071 +3 1062 1061 1068 +3 1163 1158 392 +3 1891 1378 631 +3 1891 1906 1378 +3 676 2441 1086 +3 1060 1058 2564 +3 1802 1803 674 +3 166 1088 528 +3 1075 1074 2446 +3 1083 585 1075 +3 676 1083 1075 +3 1513 1512 1507 +3 580 1082 1083 +3 1061 1069 1068 +3 2545 318 1713 +3 583 1064 1063 +3 1943 1940 1096 +3 410 641 1072 +3 1063 1064 585 +3 1064 1065 585 +3 2401 2400 743 +3 2400 2401 2399 +3 390 2400 2399 +3 746 639 745 +3 746 1067 639 +3 48 307 268 +3 1133 1072 579 +3 2564 1059 1060 +3 2563 2564 1058 +3 1069 1061 1678 +3 1130 1132 388 +3 1130 578 1132 +3 1622 697 567 +3 697 2538 567 +3 577 768 1314 +3 1130 1131 575 +3 1131 388 573 +3 1071 1072 93 +3 1072 641 93 +3 641 648 93 +3 1800 587 1799 +3 2269 2259 2343 +3 2264 2269 2343 +3 1511 966 1578 +3 946 1108 1085 +3 1187 1188 602 +3 1077 827 1059 +3 1075 585 1074 +3 585 1073 1074 +3 2447 1074 2448 +3 1087 2439 1106 +3 2436 2439 1087 +3 385 2450 2451 +3 2450 385 1135 +3 2038 2039 26 +3 780 2215 2210 +3 585 1065 1073 +3 589 707 786 +3 707 706 786 +3 2095 2092 2093 +3 2444 2446 2445 +3 675 2444 2445 +3 2446 1074 2447 +3 2445 2446 2447 +3 612 2448 1073 +3 674 1076 675 +3 1800 675 1801 +3 1083 1063 585 +3 1110 325 331 +3 325 25 331 +3 692 672 1488 +3 669 672 692 +3 688 1078 1079 +3 946 1084 1076 +3 1062 1063 1082 +3 1063 1062 583 +3 2541 1727 334 +3 1058 1082 580 +3 1058 1062 1082 +3 580 1083 1086 +3 2537 2538 697 +3 827 1108 1059 +3 1082 1063 1083 +3 1444 1611 1445 +3 1740 322 1741 +3 242 1982 2738 +3 247 242 2738 +3 1609 1610 628 +3 1609 706 1610 +3 909 1088 166 +3 1803 1804 674 +3 1109 1108 946 +3 663 1614 1615 +3 1167 801 800 +3 1487 2260 2265 +3 2266 1487 2265 +3 2692 2693 1416 +3 842 528 1088 +3 844 842 1088 +3 844 843 842 +3 844 1088 909 +3 844 909 845 +3 580 2437 2438 +3 1086 1083 676 +3 2553 1010 2551 +3 1652 1023 856 +3 1091 1090 5 +3 1092 1091 5 +3 2255 2483 2479 +3 2255 2482 2483 +3 2483 1045 2479 +3 1653 1022 1679 +3 2345 361 1459 +3 1994 920 2012 +3 507 1771 1765 +3 1794 1038 852 +3 1795 1794 852 +3 1592 1591 456 +3 1591 1592 2662 +3 1138 2662 1592 +3 1092 853 1093 +3 1091 1092 1093 +3 1014 2492 2493 +3 1265 2240 1677 +3 2240 1265 2241 +3 1805 8 105 +3 1936 1935 1101 +3 2163 2162 281 +3 987 2162 2163 +3 2202 2203 2167 +3 2204 2202 2167 +3 86 2540 2541 +3 178 434 1867 +3 1158 766 392 +3 279 225 278 +3 1814 1733 1726 +3 114 2001 2003 +3 2001 1993 2003 +3 1934 1943 1096 +3 1813 1812 1810 +3 606 610 604 +3 2735 988 2166 +3 785 1508 2510 +3 2188 2178 2187 +3 1100 1103 284 +3 2394 1174 1173 +3 1505 2208 1509 +3 8 100 105 +3 1102 1933 1935 +3 1934 1933 1102 +3 991 2174 2173 +3 1100 461 1597 +3 1097 1936 1937 +3 1932 1931 1104 +3 1930 283 1095 +3 868 1987 751 +3 1935 1944 1102 +3 1429 1428 1946 +3 992 2180 459 +3 882 2674 2675 +3 669 693 786 +3 2220 2219 2221 +3 661 1668 667 +3 625 661 667 +3 1509 1513 1514 +3 2521 1607 3 +3 2439 827 1106 +3 896 897 1111 +3 896 1111 396 +3 937 396 1111 +3 796 813 167 +3 813 2454 167 +3 2459 2458 769 +3 2459 1111 2458 +3 831 832 2460 +3 2330 2331 2335 +3 1213 175 1212 +3 175 1214 1212 +3 1053 627 708 +3 627 1117 708 +3 2298 2297 677 +3 708 1116 1115 +3 1116 708 1117 +3 352 369 1151 +3 1882 377 1881 +3 417 140 418 +3 1213 174 409 +3 2294 2296 700 +3 2296 2294 1003 +3 1115 645 1003 +3 1115 1116 645 +3 2691 445 185 +3 1120 2 345 +3 447 2637 184 +3 522 2700 2701 +3 470 471 1446 +3 470 375 471 +3 957 2430 2428 +3 2430 905 2428 +3 2119 1871 346 +3 1424 1681 423 +3 1916 1915 13 +3 1393 2498 2497 +3 346 480 1437 +3 338 1740 1741 +3 322 1738 332 +3 1827 186 1825 +3 1826 1827 1825 +3 1836 1833 1670 +3 1231 1250 1840 +3 1379 1110 331 +3 146 357 927 +3 357 1251 927 +3 1778 511 1754 +3 2671 2665 2670 +3 354 2671 2670 +3 884 2670 294 +3 92 791 790 +3 1178 109 1126 +3 619 1785 1784 +3 1717 981 1716 +3 1501 1192 1502 +3 509 1501 1502 +3 701 2299 1601 +3 568 2452 2449 +3 568 2451 2452 +3 109 297 1126 +3 296 297 2667 +3 109 1178 891 +3 1482 2113 135 +3 2114 348 2115 +3 297 299 1127 +3 145 299 297 +3 394 796 797 +3 2454 2456 2453 +3 897 2454 2453 +3 579 1132 1133 +3 578 1133 1132 +3 794 394 2219 +3 1132 579 1070 +3 580 2438 1058 +3 2437 1087 2438 +3 1542 2209 1505 +3 796 394 795 +3 795 394 794 +3 2253 2248 2250 +3 872 871 751 +3 1133 578 798 +3 578 797 798 +3 2123 371 370 +3 135 2123 370 +3 1181 596 1182 +3 2495 1756 509 +3 2699 2698 250 +3 56 2245 1689 +3 457 2161 1596 +3 220 2090 2089 +3 1592 1593 1594 +3 456 1593 1592 +3 307 306 226 +3 306 305 226 +3 1294 1293 224 +3 269 1294 1281 +3 1276 2391 2393 +3 48 363 306 +3 457 1594 1593 +3 2365 2366 154 +3 2369 2365 154 +3 218 1587 1139 +3 314 2044 2042 +3 1147 2044 314 +3 2239 458 2238 +3 1590 1138 1139 +3 1587 1586 1139 +3 1067 1678 1061 +3 2241 1265 1271 +3 1265 221 1271 +3 1595 218 1139 +3 1294 224 1281 +3 1290 1283 2090 +3 1261 1272 1273 +3 1272 1278 1273 +3 1675 1676 1263 +3 1676 1675 1265 +3 629 647 1784 +3 1366 647 629 +3 1263 1259 1637 +3 1262 1635 1636 +3 1140 1641 1276 +3 1275 1633 1634 +3 1275 1261 1273 +3 221 1272 1271 +3 221 1277 1272 +3 1950 1259 1257 +3 2325 2326 2324 +3 2269 2410 2409 +3 2410 2269 2264 +3 1993 2344 2003 +3 357 146 305 +3 2350 357 305 +3 361 2346 2347 +3 458 2239 1103 +3 1931 2275 2196 +3 2195 2275 1930 +3 2275 2195 2196 +3 1349 1350 761 +3 1150 1151 351 +3 352 1151 1150 +3 2184 2185 993 +3 270 6 272 +3 270 1152 6 +3 430 1443 2718 +3 261 95 267 +3 807 809 808 +3 1442 1444 2718 +3 1444 1442 1441 +3 989 2205 2171 +3 2137 1041 2136 +3 1899 2236 2235 +3 2147 1030 2740 +3 706 707 1610 +3 643 1155 1613 +3 1608 2522 1609 +3 2444 2443 1075 +3 2444 1076 2443 +3 1507 1578 1516 +3 412 2463 1166 +3 603 412 1166 +3 1180 2334 1183 +3 2334 1180 1181 +3 1165 0 604 +3 0 606 604 +3 1164 605 1159 +3 727 185 443 +3 1234 1238 1228 +3 1160 760 1161 +3 759 899 1165 +3 1617 1389 1616 +3 605 1164 1165 +3 448 185 727 +3 632 1891 631 +3 1891 632 1892 +3 757 1351 874 +3 615 1371 1890 +3 1906 615 1890 +3 1355 761 392 +3 1163 392 761 +3 1353 1163 761 +3 1424 2567 1681 +3 2565 1421 1420 +3 698 1077 1059 +3 1160 1159 760 +3 2462 605 1166 +3 2463 2462 1166 +3 2464 2465 766 +3 765 766 2465 +3 766 765 392 +3 96 265 277 +3 265 2377 277 +3 410 1171 641 +3 38 2062 1318 +3 480 479 1434 +3 1176 640 1175 +3 785 2510 1506 +3 798 1169 410 +3 1133 798 410 +3 1788 649 631 +3 798 1170 1169 +3 798 167 1170 +3 797 167 798 +3 1388 1412 2499 +3 1647 1649 847 +3 1173 640 1172 +3 2395 1173 2397 +3 870 2401 634 +3 633 1893 2375 +3 641 1171 1176 +3 2404 876 2394 +3 640 1173 1174 +3 263 2380 2379 +3 1177 892 886 +3 264 2376 95 +3 2395 2394 1173 +3 2404 2394 2395 +3 1175 2375 593 +3 640 1174 1175 +3 298 892 1177 +3 892 298 740 +3 640 1176 1171 +3 1916 106 1919 +3 1176 648 641 +3 593 648 1176 +3 648 593 649 +3 2424 1011 2426 +3 1554 2562 1571 +3 2562 1547 1571 +3 633 1894 1893 +3 1126 1127 298 +3 1177 1126 298 +3 2570 2614 183 +3 1457 2614 2570 +3 315 891 1178 +3 1178 1126 1177 +3 1180 380 1181 +3 899 0 1165 +3 2651 472 2550 +3 601 542 386 +3 1190 1189 542 +3 515 1190 542 +3 1189 386 542 +3 2189 341 2191 +3 2189 1941 341 +3 563 2449 2450 +3 562 563 2450 +3 791 383 790 +3 1179 380 1180 +3 2464 2463 412 +3 897 609 2455 +3 2611 563 92 +3 1612 705 706 +3 705 1612 2514 +3 1179 1180 599 +3 1180 1183 599 +3 602 2328 2327 +3 602 1134 2328 +3 514 2715 1495 +3 1193 1208 1194 +3 1208 2336 1194 +3 2220 393 2222 +3 81 1691 1286 +3 1284 81 1286 +3 1707 1706 565 +3 1626 565 1991 +3 1500 543 1493 +3 1205 1206 562 +3 1206 92 562 +3 599 1183 1186 +3 163 1696 256 +3 1339 514 1495 +3 1194 386 1193 +3 2742 2743 810 +3 2199 2174 2731 +3 2174 2199 2198 +3 556 1201 1203 +3 1201 556 506 +3 2714 1191 515 +3 1203 1674 1204 +3 1203 510 1674 +3 200 894 147 +3 1196 1197 560 +3 2336 1208 2335 +3 1188 386 1189 +3 1188 1193 386 +3 599 2327 2328 +3 2329 1187 2325 +3 1187 2326 2325 +3 385 1707 569 +3 487 1768 1767 +3 1951 1953 1952 +3 382 561 1114 +3 561 1209 1114 +3 2330 2335 1208 +3 1620 1706 568 +3 506 1202 1201 +3 483 504 1772 +3 2326 1186 2324 +3 235 1201 1202 +3 1192 2714 2715 +3 2714 515 2715 +3 270 2717 1152 +3 505 1765 1766 +3 1752 508 1751 +3 1202 811 235 +3 811 1202 486 +3 2003 2344 919 +3 235 1200 1201 +3 768 1311 1314 +3 56 1768 1769 +3 2606 2608 2603 +3 2606 2609 2608 +3 226 305 968 +3 1766 1765 1771 +3 1773 1764 1774 +3 556 1204 1756 +3 1207 602 559 +3 602 1189 559 +3 1756 2495 1763 +3 560 1205 1198 +3 1183 2334 2332 +3 1198 1207 559 +3 1207 1198 1205 +3 1195 1198 559 +3 405 610 611 +3 1499 405 611 +3 1134 1179 2328 +3 2433 1666 1661 +3 2264 2340 1156 +3 1676 1677 366 +3 1203 1204 556 +3 2337 601 1194 +3 2336 2337 1194 +3 1493 543 1496 +3 1220 711 1221 +3 933 930 1210 +3 176 930 933 +3 36 1216 982 +3 981 36 982 +3 860 1021 1027 +3 1210 1211 933 +3 1210 174 1211 +3 1107 688 1923 +3 726 725 1224 +3 1816 726 1224 +3 345 2 1871 +3 1213 1211 174 +3 1213 1212 1211 +3 1889 755 1342 +3 758 1889 1342 +3 907 1013 1012 +3 2156 1028 1655 +3 1216 36 934 +3 845 909 211 +3 909 1977 211 +3 908 210 1976 +3 1797 933 1214 +3 929 177 931 +3 2024 2028 2029 +3 2028 2024 2006 +3 2709 523 231 +3 1816 2474 2475 +3 1220 1004 721 +3 18 2617 2619 +3 1824 1819 1823 +3 1819 1824 1820 +3 1219 711 1220 +3 1227 1826 725 +3 1235 186 1827 +3 1350 1349 874 +3 1826 1234 1827 +3 1006 1822 1007 +3 444 1818 1226 +3 1822 1226 1821 +3 725 443 1227 +3 723 711 722 +3 2361 2364 2363 +3 2360 2361 2363 +3 1825 186 1820 +3 1239 186 1235 +3 177 521 931 +3 931 521 49 +3 521 1868 49 +3 1221 1223 1004 +3 1819 1818 1817 +3 1227 1234 1826 +3 185 442 443 +3 444 1226 1822 +3 1235 1236 1008 +3 108 2043 2044 +3 434 88 328 +3 1822 1821 1007 +3 2597 1402 2596 +3 1252 1254 358 +3 1239 1821 186 +3 1231 1849 1848 +3 442 1238 443 +3 2527 60 2526 +3 1237 1238 442 +3 442 445 1233 +3 1233 425 1231 +3 1815 2474 1223 +3 2474 1815 2475 +3 1227 443 1238 +3 1480 1478 329 +3 2396 2397 749 +3 1261 1275 1634 +3 1889 1888 881 +3 1481 180 344 +3 2549 2208 2209 +3 1844 1845 1248 +3 1844 1249 1845 +3 426 2502 1396 +3 1238 1831 1228 +3 2286 2285 416 +3 1672 1673 1197 +3 1673 1199 1197 +3 1672 1671 1503 +3 436 1006 1242 +3 1889 1162 1888 +3 1247 1835 1246 +3 1008 1239 1235 +3 440 439 1243 +3 88 434 433 +3 434 179 433 +3 1240 1239 1008 +3 1239 1240 1007 +3 179 435 433 +3 1241 1244 54 +3 1007 1242 1006 +3 1007 1240 1242 +3 1240 1241 1242 +3 1242 1241 1243 +3 1229 1244 1236 +3 1472 2361 1269 +3 2361 1472 360 +3 1237 442 1842 +3 1841 1230 1842 +3 1351 754 1350 +3 1887 754 1351 +3 2739 1442 2718 +3 1443 2739 2718 +3 1247 1246 1846 +3 1503 1671 237 +3 1671 1196 237 +3 1441 372 1444 +3 1282 2088 2089 +3 1387 2305 2310 +3 2311 1387 2310 +3 2192 2197 2509 +3 2207 2197 2192 +3 2353 2358 2354 +3 506 556 557 +3 2573 243 2575 +3 1679 1022 1584 +3 1465 1463 360 +3 56 1769 2245 +3 1251 1254 1252 +3 1254 1251 357 +3 365 1251 1252 +3 419 1885 417 +3 988 2164 2163 +3 342 1473 34 +3 1256 1781 1782 +3 2357 223 2356 +3 223 2355 2356 +3 1266 2372 53 +3 362 2658 2659 +3 1280 2085 2086 +3 1639 1277 221 +3 1298 96 278 +3 366 1266 1259 +3 1263 366 1259 +3 455 454 130 +3 1001 455 302 +3 1002 1001 302 +3 2371 1001 1002 +3 2659 2658 53 +3 2708 2707 2709 +3 537 2709 231 +3 541 523 2702 +3 2085 1280 1279 +3 1142 2085 1279 +3 1143 1275 1274 +3 1275 1273 1274 +3 1257 1266 53 +3 1253 1257 53 +3 1276 1143 2391 +3 305 146 304 +3 2103 17 1695 +3 2097 2098 1288 +3 2379 264 289 +3 1272 1261 1271 +3 2100 2103 2102 +3 366 1263 1676 +3 1637 1638 1263 +3 1637 1262 1638 +3 364 1949 1950 +3 410 1169 1171 +3 702 1604 628 +3 1115 702 628 +3 281 2162 2159 +3 2162 2160 2159 +3 1344 764 1343 +3 360 2362 2361 +3 2008 35 978 +3 361 1284 1303 +3 151 2078 2079 +3 220 2096 1290 +3 814 475 2657 +3 52 153 1462 +3 1289 52 1462 +3 1020 2407 1647 +3 1254 2356 358 +3 2356 1254 2357 +3 2705 2710 519 +3 1255 2353 2354 +3 1782 1255 1783 +3 1255 2354 1783 +3 1136 1291 1293 +3 1291 224 1293 +3 308 307 226 +3 224 1291 1279 +3 2089 2092 220 +3 1782 1783 1256 +3 2535 159 2524 +3 1142 2082 2084 +3 1142 2081 2082 +3 1137 1274 1273 +3 968 305 304 +3 1690 1689 2243 +3 1293 1295 456 +3 1137 1278 1279 +3 282 1320 2099 +3 2362 2364 2361 +3 1320 290 2099 +3 1284 222 1283 +3 81 1284 1283 +3 1591 1293 456 +3 48 1281 1297 +3 2250 1309 2253 +3 1309 2250 2251 +3 1406 1407 1383 +3 1098 1099 284 +3 1587 2279 1586 +3 1589 1292 1136 +3 996 2189 2188 +3 362 2362 2369 +3 1100 1744 461 +3 1290 2090 220 +3 1264 1277 1639 +3 1587 218 1301 +3 1140 1587 1301 +3 461 1744 1743 +3 155 1460 1459 +3 2660 956 1796 +3 962 956 2660 +3 2092 2089 1285 +3 1299 1298 269 +3 1299 1281 268 +3 268 1281 48 +3 1299 269 1281 +3 2054 89 2055 +3 89 2054 2051 +3 2199 2735 2166 +3 1303 1286 1467 +3 360 1463 2365 +3 2362 360 2365 +3 153 52 152 +3 455 739 302 +3 1969 1971 315 +3 529 541 30 +3 541 2702 30 +3 182 1861 2415 +3 2374 1175 1174 +3 993 2181 2184 +3 2084 2085 1142 +3 2085 2084 1282 +3 1274 2388 2391 +3 358 1782 1781 +3 1137 1279 1292 +3 1292 1279 1291 +3 1292 1291 1136 +3 47 273 276 +3 363 48 1297 +3 223 2348 1364 +3 1594 1138 1592 +3 1295 1293 1294 +3 228 307 308 +3 276 266 228 +3 2088 1285 2089 +3 96 1298 1299 +3 1295 269 1296 +3 269 1295 1294 +3 1641 1264 1640 +3 1296 1298 278 +3 1298 1296 269 +3 1285 2094 2093 +3 2093 2101 1287 +3 2101 1743 1287 +3 994 2186 2184 +3 2388 2393 2391 +3 2626 2625 2120 +3 2390 2389 1137 +3 950 1139 1586 +3 1288 2098 2100 +3 1586 1141 1585 +3 2279 1276 2393 +3 1300 2387 2389 +3 2731 2174 2732 +3 633 2375 2374 +3 1341 763 1340 +3 1341 753 763 +3 895 764 609 +3 896 895 609 +3 597 895 898 +3 573 1631 1632 +3 791 561 382 +3 2456 769 2453 +3 936 2457 801 +3 391 1304 1305 +3 768 767 391 +3 2239 997 1103 +3 1344 609 764 +3 1100 458 1103 +3 1306 1305 595 +3 1026 1113 2476 +3 1026 2744 1113 +3 2350 2357 357 +3 2357 1254 357 +3 2062 903 206 +3 1992 2648 1705 +3 1307 1306 595 +3 768 2277 2278 +3 1048 1584 857 +3 2252 1678 574 +3 2483 2484 1045 +3 1308 573 2248 +3 2378 277 2377 +3 2380 277 2378 +3 2052 961 2051 +3 961 2052 196 +3 2248 2247 1308 +3 390 2395 2396 +3 2395 2397 2396 +3 2538 2537 828 +3 2374 2375 1175 +3 1799 1802 674 +3 1314 1311 1312 +3 747 1314 1312 +3 1781 2242 1270 +3 2351 1459 1460 +3 902 1315 903 +3 1315 902 209 +3 1712 1710 1711 +3 2193 1930 1095 +3 75 1110 1379 +3 1737 1740 324 +3 1740 1123 324 +3 317 316 1724 +3 289 1320 263 +3 290 1320 289 +3 1022 857 1584 +3 1522 1518 1523 +3 714 1322 1321 +3 1324 1322 714 +3 1322 1324 1323 +3 1323 550 1322 +3 1323 555 550 +3 555 1323 551 +3 1330 1328 712 +3 550 1335 1334 +3 1335 550 1336 +3 437 1323 1324 +3 1323 437 551 +3 2146 2147 2740 +3 1333 1332 713 +3 436 1330 712 +3 939 941 397 +3 494 2245 2246 +3 439 1330 436 +3 1325 1331 713 +3 435 179 699 +3 1329 435 699 +3 1331 737 713 +3 437 1326 1327 +3 1333 713 466 +3 1327 699 552 +3 1328 699 1327 +3 699 1328 1329 +3 732 733 450 +3 449 2635 734 +3 2692 1416 453 +3 1328 1327 1326 +3 1331 714 737 +3 2635 171 734 +3 2634 171 2635 +3 1324 714 1331 +3 1324 1331 1325 +3 372 1329 439 +3 1329 1328 1330 +3 712 1326 1332 +3 712 1332 1333 +3 712 1333 436 +3 727 450 448 +3 727 730 450 +3 436 1333 1006 +3 1334 1335 715 +3 438 1337 1338 +3 1337 513 1338 +3 767 1344 1343 +3 397 2680 770 +3 555 1336 550 +3 990 2179 2176 +3 483 1772 836 +3 873 874 389 +3 405 1500 601 +3 508 1752 512 +3 555 1337 1336 +3 438 1338 546 +3 547 438 546 +3 449 733 549 +3 762 392 765 +3 2421 1407 1406 +3 1363 871 872 +3 1346 1347 753 +3 1378 1890 630 +3 1890 1371 630 +3 1345 752 1346 +3 1560 1974 502 +3 576 1307 2249 +3 1341 1342 753 +3 1342 1345 753 +3 1391 1404 1384 +3 895 597 764 +3 597 758 1342 +3 1907 1902 744 +3 2309 1390 1386 +3 753 1345 1346 +3 874 1349 1348 +3 878 1347 1346 +3 1347 878 389 +3 1348 1347 389 +3 874 1348 389 +3 1161 758 1160 +3 752 878 1346 +3 760 1353 1354 +3 1161 760 1354 +3 1354 1352 754 +3 1162 1354 754 +3 1162 1161 1354 +3 1350 1352 761 +3 758 1161 1162 +3 2152 865 2151 +3 2152 2153 865 +3 2260 1145 2261 +3 2257 2260 1487 +3 1353 761 1352 +3 1354 1353 1352 +3 767 1343 391 +3 753 1347 1357 +3 695 694 2604 +3 1631 573 1308 +3 1627 594 1624 +3 1713 316 317 +3 1347 1348 1356 +3 2277 1306 2278 +3 753 1357 763 +3 1357 762 763 +3 1310 1678 2252 +3 1357 1347 1356 +3 1355 762 1356 +3 762 1357 1356 +3 1344 2455 609 +3 756 586 1360 +3 1358 756 1360 +3 1362 750 1363 +3 750 871 1363 +3 586 1361 1360 +3 1360 1361 752 +3 1218 710 1217 +3 1361 1362 752 +3 682 1170 681 +3 586 877 1361 +3 1012 1649 211 +3 540 210 908 +3 1362 1363 878 +3 752 1362 878 +3 1973 872 873 +3 1365 614 679 +3 656 1365 679 +3 1365 656 647 +3 1894 616 1895 +3 616 1896 1895 +3 1412 1401 1413 +3 1921 286 287 +3 1366 614 1365 +3 647 1366 1365 +3 2486 2487 1025 +3 2487 2490 1025 +3 964 212 963 +3 1789 212 964 +3 650 1372 1055 +3 637 1371 1374 +3 631 1368 588 +3 1056 1745 1099 +3 615 1374 1371 +3 615 1913 1374 +3 1850 1851 1249 +3 1854 1851 1850 +3 629 1784 1785 +3 2502 1394 2503 +3 630 1370 1369 +3 630 1371 1370 +3 614 1369 650 +3 630 1369 1367 +3 1367 1369 1366 +3 1369 614 1366 +3 1367 1366 629 +3 2501 1395 2311 +3 637 1372 1370 +3 1371 637 1370 +3 1914 1911 1912 +3 1911 636 1912 +3 2629 2628 582 +3 2629 2631 2628 +3 1741 33 338 +3 630 1367 1368 +3 1909 1908 1905 +3 1375 1909 638 +3 584 1375 638 +3 584 1373 1375 +3 1372 1373 613 +3 1055 1372 613 +3 587 1798 1799 +3 1377 774 617 +3 1377 587 774 +3 283 1930 2276 +3 1372 650 1370 +3 1890 1378 1906 +3 1372 637 1373 +3 1391 2307 2308 +3 615 1906 1892 +3 1906 1891 1892 +3 624 651 652 +3 1373 637 1375 +3 426 1386 1390 +3 1647 848 1648 +3 848 1647 2407 +3 2647 686 2646 +3 90 1600 965 +3 1376 613 1373 +3 1378 630 1368 +3 1903 748 867 +3 1650 1653 1679 +3 193 2616 192 +3 124 254 1379 +3 253 1734 1732 +3 2101 461 1743 +3 461 2101 2094 +3 1247 1846 1845 +3 1480 344 73 +3 1481 344 1480 +3 1896 1902 1907 +3 1416 1415 1410 +3 1460 2695 1269 +3 2695 1460 1461 +3 2119 347 1871 +3 1425 1426 1118 +3 824 823 1457 +3 299 145 300 +3 25 986 2031 +3 182 1858 1861 +3 2306 2307 1391 +3 1420 427 2598 +3 2108 2109 347 +3 1395 1387 2311 +3 369 370 44 +3 1024 2491 1089 +3 2427 1405 2506 +3 1394 2499 1412 +3 2499 1394 2498 +3 1791 848 1793 +3 1395 1390 1387 +3 1898 2237 1900 +3 616 1898 1900 +3 904 411 2428 +3 1423 2309 1386 +3 2309 1423 2422 +3 10 1397 2503 +3 1397 1396 2503 +3 1409 1408 446 +3 1848 1849 1232 +3 2305 1392 2500 +3 1398 1397 427 +3 1402 1420 2598 +3 2676 1653 855 +3 1616 1399 1617 +3 2377 2376 264 +3 1393 2499 2498 +3 1400 1401 1388 +3 2292 2286 2289 +3 2308 1385 1404 +3 140 416 2285 +3 140 417 416 +3 1388 1401 1412 +3 344 1120 343 +3 1149 352 1150 +3 2310 2305 1393 +3 230 370 369 +3 2309 1385 2308 +3 181 428 1398 +3 739 130 738 +3 130 1863 738 +3 1408 424 1389 +3 424 1408 1409 +3 2033 986 136 +3 2031 986 2033 +3 1859 2419 428 +3 565 569 1707 +3 2109 2108 2114 +3 1617 1399 1413 +3 1421 1425 1118 +3 1385 2421 1406 +3 425 1410 1411 +3 1410 1409 1411 +3 2238 2169 997 +3 2421 2422 2420 +3 1787 1788 588 +3 1415 424 1410 +3 1415 1414 424 +3 2692 423 2693 +3 2689 2688 1417 +3 355 356 1863 +3 2503 2507 10 +3 2503 1394 2507 +3 1858 1860 1380 +3 824 2570 1419 +3 1859 182 2417 +3 446 1408 1405 +3 1861 1857 1382 +3 1857 1861 1858 +3 1418 2688 2689 +3 347 2118 2108 +3 1860 429 1380 +3 1381 429 1860 +3 428 1009 1381 +3 453 1416 1410 +3 1383 1407 1855 +3 1847 1850 1249 +3 1850 1847 1848 +3 1411 1409 446 +3 1232 1856 1855 +3 430 1445 422 +3 1410 424 1409 +3 2502 2503 1396 +3 2508 1927 1926 +3 1927 2508 689 +3 1787 619 612 +3 2111 2110 137 +3 2382 279 2381 +3 106 1916 1917 +3 1403 1681 1680 +3 586 1901 877 +3 1680 1681 1119 +3 1401 1617 1413 +3 1390 2309 2308 +3 2595 2598 1397 +3 1893 1894 1895 +3 700 2268 2262 +3 2268 700 2296 +3 1683 2746 1682 +3 1389 1617 1401 +3 1400 1389 1401 +3 1899 1898 635 +3 2237 1898 1899 +3 2691 453 445 +3 66 342 190 +3 342 66 1473 +3 1422 421 181 +3 1443 421 1455 +3 427 1421 1422 +3 2627 44 371 +3 2422 1423 2420 +3 258 259 1486 +3 259 260 1486 +3 1484 2280 2283 +3 2418 2417 1386 +3 1421 427 1420 +3 1431 477 1435 +3 181 1398 1422 +3 1118 421 1422 +3 2568 1424 2569 +3 2179 992 2176 +3 2626 2114 349 +3 2627 2626 349 +3 2470 2469 420 +3 1957 1580 1581 +3 2612 2613 1426 +3 420 1458 1454 +3 1434 479 1432 +3 2 479 480 +3 1429 477 1431 +3 478 1429 1431 +3 2570 824 1457 +3 2614 2613 2612 +3 2614 1427 2613 +3 399 477 1430 +3 399 497 477 +3 1430 822 399 +3 399 822 821 +3 400 822 1430 +3 477 1429 1430 +3 1431 1432 478 +3 1432 1433 478 +3 431 1439 1121 +3 471 375 472 +3 910 1661 1666 +3 374 1431 1435 +3 2573 2575 246 +3 1456 2567 2568 +3 183 1456 2568 +3 479 1433 1432 +3 471 472 1882 +3 1432 374 1434 +3 1438 1439 1440 +3 1118 2470 1455 +3 1435 497 470 +3 497 1435 477 +3 497 375 470 +3 1431 374 1432 +3 468 1451 467 +3 1946 1428 1947 +3 1435 470 1436 +3 1438 1433 479 +3 374 1437 1434 +3 374 1436 1437 +3 2463 2464 766 +3 1440 373 1438 +3 1439 2 1121 +3 537 77 2709 +3 538 77 537 +3 1886 1351 757 +3 1440 1439 431 +3 1882 472 2461 +3 766 1158 2462 +3 1442 373 1440 +3 1441 1442 1440 +3 1443 430 421 +3 1436 1446 469 +3 1436 470 1446 +3 1441 431 432 +3 507 1765 1753 +3 1308 2247 2249 +3 2247 576 2249 +3 1455 1454 1443 +3 1118 1455 421 +3 1454 1455 420 +3 2741 812 808 +3 2719 1764 1775 +3 923 2721 2723 +3 1774 1764 2719 +3 1436 469 1437 +3 1446 1447 469 +3 1453 346 1452 +3 468 1453 1452 +3 471 1447 1446 +3 605 2558 1159 +3 1158 2558 605 +3 816 815 2214 +3 2655 815 816 +3 378 2555 2216 +3 1450 1451 468 +3 926 1964 2223 +3 2233 1429 478 +3 1545 2216 780 +3 1449 417 418 +3 419 417 1449 +3 1450 418 1451 +3 60 2527 1985 +3 2527 239 1985 +3 1449 1448 141 +3 1439 479 2 +3 248 1872 60 +3 401 823 824 +3 346 1437 469 +3 1452 346 469 +3 468 1452 1448 +3 2111 2120 2112 +3 462 820 802 +3 462 399 820 +3 462 496 399 +3 1268 2352 2345 +3 2146 2740 2145 +3 2740 1030 2145 +3 2119 467 2118 +3 1453 467 2119 +3 1645 875 750 +3 2664 294 2669 +3 479 1439 1438 +3 2613 2470 1426 +3 2470 2613 2469 +3 2469 2613 1427 +3 822 142 821 +3 400 823 822 +3 400 1457 823 +3 823 142 822 +3 1692 164 1693 +3 2376 1152 95 +3 1152 2376 265 +3 1289 1469 52 +3 2243 2244 2317 +3 1460 155 1461 +3 66 190 1665 +3 2346 1364 2348 +3 361 2345 2346 +3 1286 1468 1467 +3 1303 155 1459 +3 1459 361 1303 +3 1882 2461 377 +3 2373 1001 2371 +3 19 1878 1463 +3 2367 154 2366 +3 1462 1463 1465 +3 1462 153 1463 +3 2698 517 250 +3 2725 1777 56 +3 914 34 168 +3 34 1473 168 +3 2347 2348 363 +3 1466 1467 1468 +3 1466 155 1467 +3 1696 1694 148 +3 1697 1696 148 +3 1289 1468 1469 +3 1468 165 1469 +3 2705 2704 518 +3 2281 1485 139 +3 2281 2280 1485 +3 140 2285 2284 +3 1550 1528 498 +3 1485 1484 111 +3 213 2058 2066 +3 2701 2700 524 +3 2370 2373 2371 +3 1461 1464 1472 +3 165 1470 1469 +3 1470 165 1471 +3 1001 2367 455 +3 154 2367 1001 +3 1692 1471 165 +3 1471 1692 1693 +3 1464 1465 1472 +3 2702 524 30 +3 524 525 30 +3 2702 2701 524 +3 522 2699 2700 +3 2699 250 2700 +3 1477 1476 327 +3 1838 1230 1839 +3 1009 54 1247 +3 1477 329 1478 +3 136 1477 1478 +3 2284 2287 2283 +3 2287 1484 2283 +3 26 2036 2037 +3 1859 1858 182 +3 416 23 2286 +3 1482 1479 73 +3 88 1481 329 +3 227 144 838 +3 433 180 1481 +3 88 433 1481 +3 1009 441 54 +3 1479 1482 2034 +3 1482 134 2034 +3 2114 2108 348 +3 2286 2292 414 +3 2116 112 353 +3 757 874 873 +3 2272 2273 851 +3 2272 866 2273 +3 2300 2301 1603 +3 2661 851 1093 +3 449 549 548 +3 1490 1497 544 +3 1497 1490 545 +3 452 547 1489 +3 545 1489 1491 +3 1339 1495 172 +3 509 1204 1501 +3 2107 2126 112 +3 2679 2678 2633 +3 2680 2679 770 +3 2632 1490 2633 +3 1490 770 2633 +3 1424 2688 1418 +3 2569 1424 1418 +3 2635 452 2634 +3 542 1494 515 +3 1493 1494 542 +3 1493 172 1494 +3 1492 1496 545 +3 1493 1496 1492 +3 2678 452 2633 +3 2678 2634 452 +3 1706 1989 565 +3 565 1989 1990 +3 1206 560 561 +3 2682 404 2683 +3 2680 771 2679 +3 543 1498 1496 +3 2413 2412 833 +3 1766 487 1767 +3 1494 1495 515 +3 172 1495 1494 +3 516 2696 2698 +3 2696 517 2698 +3 522 516 2699 +3 716 735 717 +3 716 549 735 +3 611 1497 1498 +3 1498 1497 1496 +3 2107 2125 2126 +3 438 548 1335 +3 1191 2716 1190 +3 2229 406 1537 +3 288 2036 2035 +3 792 2221 793 +3 379 792 793 +3 262 261 2127 +3 472 375 2550 +3 375 495 2550 +3 1545 474 2216 +3 394 1129 2218 +3 394 1128 1129 +3 137 2110 2109 +3 773 1801 2628 +3 1429 2233 1428 +3 1538 1543 407 +3 778 1504 1506 +3 2683 1419 184 +3 1529 1526 55 +3 1526 1525 55 +3 2200 2731 2736 +3 1530 1525 1526 +3 1520 1525 1530 +3 2209 2208 1505 +3 2666 891 2664 +3 2493 1015 1016 +3 2303 1608 709 +3 1512 778 1506 +3 569 1626 1625 +3 1511 1508 408 +3 296 145 297 +3 2665 2669 2670 +3 2672 294 2663 +3 1148 1105 281 +3 2652 1105 1148 +3 1516 966 1517 +3 1514 1516 1517 +3 420 2469 1458 +3 2035 2036 287 +3 292 291 288 +3 777 1509 1515 +3 2516 1612 2517 +3 1539 1554 1572 +3 1556 1539 1572 +3 1979 246 2575 +3 407 1535 1534 +3 2560 2559 1552 +3 2559 2560 1551 +3 775 1520 1553 +3 690 1010 1925 +3 966 967 1518 +3 2037 2036 288 +3 2516 2515 1612 +3 2042 2035 314 +3 1515 1523 1519 +3 1523 1515 1522 +3 2035 2042 288 +3 1917 1922 106 +3 1390 2307 1387 +3 2307 2306 1387 +3 275 274 47 +3 1703 208 85 +3 1530 1532 1553 +3 1535 775 1533 +3 2645 1928 2644 +3 1546 777 1519 +3 1571 1573 1555 +3 1527 1528 499 +3 1536 1541 776 +3 1081 564 1927 +3 564 1081 1705 +3 1531 1532 1548 +3 1532 1531 1533 +3 1544 779 1543 +3 1603 2302 1604 +3 2302 709 1604 +3 484 1 1540 +3 1530 1521 1532 +3 663 664 623 +3 663 1615 664 +3 499 1521 1527 +3 1922 12 286 +3 286 12 275 +3 1524 1523 55 +3 1527 1526 1529 +3 1527 1521 1526 +3 1529 55 1518 +3 1523 1518 55 +3 784 406 783 +3 408 1528 967 +3 498 1537 406 +3 1541 1542 776 +3 1917 1918 12 +3 407 1536 1535 +3 128 129 131 +3 1528 1527 967 +3 1038 866 2272 +3 1518 967 1529 +3 1524 1519 1523 +3 1520 1519 1524 +3 829 828 2563 +3 1549 1548 499 +3 1521 1530 1526 +3 498 406 500 +3 1551 1549 1547 +3 1549 1551 1548 +3 1575 2585 16 +3 1540 1 1544 +3 484 1540 772 +3 1926 1928 687 +3 2301 2302 1603 +3 314 2041 107 +3 1536 407 1541 +3 1563 1564 502 +3 1553 1520 1530 +3 1146 23 76 +3 2562 2559 1547 +3 2562 1552 2559 +3 1535 1536 775 +3 1155 626 1613 +3 408 1537 1528 +3 1542 1505 776 +3 2232 781 2212 +3 1104 1931 2196 +3 498 1528 1537 +3 1533 775 1553 +3 2584 16 2585 +3 2259 2342 2343 +3 227 538 76 +3 1105 945 2165 +3 1538 1534 1539 +3 2438 2552 829 +3 485 2589 1562 +3 2589 485 1748 +3 480 1434 1437 +3 468 1448 1450 +3 780 2210 1542 +3 782 2230 2229 +3 779 780 1542 +3 490 2576 2577 +3 2588 490 2577 +3 474 2217 2216 +3 1885 144 417 +3 1 1545 1544 +3 1 837 1545 +3 1545 837 474 +3 2041 2035 287 +3 1536 1546 775 +3 776 1505 1546 +3 492 1575 1576 +3 1534 1535 2561 +3 2561 2560 1552 +3 1554 1552 2562 +3 1534 1552 1539 +3 1539 1558 772 +3 1553 1532 1533 +3 2578 2588 2577 +3 1558 2581 772 +3 773 774 1801 +3 1538 407 1534 +3 1549 1550 493 +3 1550 1549 499 +3 1528 1550 499 +3 829 2563 1058 +3 2561 1552 1534 +3 966 1516 1578 +3 274 12 1918 +3 1551 1547 2559 +3 1554 1539 1552 +3 2469 1428 1458 +3 1539 1556 1558 +3 960 204 959 +3 2579 1559 2580 +3 493 1575 1574 +3 46 960 196 +3 502 491 501 +3 1557 2593 2583 +3 1566 1565 485 +3 670 2267 2266 +3 935 1216 1215 +3 1559 501 2580 +3 1770 491 1769 +3 2297 2295 677 +3 2265 2260 2261 +3 1759 2728 1780 +3 558 1759 1780 +3 199 198 59 +3 1561 2587 2589 +3 1748 1561 2589 +3 2586 2576 490 +3 69 126 123 +3 1567 1566 922 +3 2717 270 64 +3 1564 491 502 +3 211 1975 907 +3 1565 1748 485 +3 1688 2319 1687 +3 2634 771 2636 +3 1752 233 512 +3 233 513 512 +3 2148 1029 2144 +3 1048 857 2483 +3 231 541 529 +3 1214 933 1212 +3 862 2136 2135 +3 1789 1790 215 +3 848 1789 215 +3 963 956 2075 +3 956 2076 2075 +3 956 962 2076 +3 1797 1719 176 +3 2265 2261 2262 +3 1034 2150 1035 +3 2142 2138 2145 +3 2138 1032 2145 +3 834 1880 1879 +3 2335 2331 600 +3 2320 2080 51 +3 2320 149 2080 +3 176 933 1797 +3 564 1928 1927 +3 1601 700 3 +3 432 2304 1441 +3 2646 2649 566 +3 1689 2722 56 +3 1105 2652 1104 +3 503 1564 1563 +3 1569 2747 2746 +3 1284 1286 1303 +3 1687 1567 558 +3 1769 491 2246 +3 1761 1567 922 +3 529 531 205 +3 1184 1208 1193 +3 1547 1549 1573 +3 493 1550 1576 +3 1574 1573 493 +3 1555 1573 1574 +3 772 1538 1539 +3 493 1576 1575 +3 1538 772 1540 +3 590 774 773 +3 1538 1540 1543 +3 1540 1544 1543 +3 1572 1555 1577 +3 1574 1577 1555 +3 1574 16 1577 +3 2195 2194 1929 +3 1511 1578 1510 +3 1578 1507 1510 +3 2378 2379 2380 +3 2302 2301 2303 +3 1116 625 2128 +3 1958 1582 924 +3 1582 1959 924 +3 1960 1959 1582 +3 910 1664 1662 +3 1818 444 1004 +3 1140 1276 2279 +3 924 1956 1955 +3 1582 1583 27 +3 855 1650 1651 +3 2572 1579 2574 +3 2618 31 1663 +3 1808 1805 1806 +3 1809 28 1810 +3 1097 1937 1938 +3 1943 1934 1102 +3 2534 42 1811 +3 1583 1582 1581 +3 99 2525 2524 +3 2242 1271 1270 +3 1781 1256 2242 +3 1261 1270 1271 +3 1278 1142 1279 +3 1595 1139 1138 +3 2172 2205 2204 +3 199 58 198 +3 58 2468 198 +3 950 1589 1590 +3 950 1590 1139 +3 2065 2064 952 +3 2064 958 952 +3 2062 2061 903 +3 304 146 300 +3 942 457 1593 +3 225 942 1593 +3 997 2185 1103 +3 1588 950 1585 +3 950 1586 1585 +3 2205 989 2170 +3 1591 1136 1293 +3 1136 1591 1589 +3 1590 1589 1591 +3 136 986 1475 +3 1593 1296 225 +3 456 1296 1593 +3 1295 1296 456 +3 997 2239 2238 +3 1988 869 1987 +3 489 2585 492 +3 123 1598 69 +3 1598 123 1599 +3 1744 1056 1743 +3 680 1988 868 +3 2235 1988 680 +3 1995 2013 2011 +3 2192 2509 2194 +3 2509 1929 2194 +3 126 69 127 +3 71 126 127 +3 1982 241 1983 +3 2644 1928 564 +3 2643 2644 564 +3 210 540 900 +3 311 314 107 +3 134 1483 2032 +3 2509 2197 2206 +3 945 2509 2206 +3 2262 2261 3 +3 675 1076 2444 +3 2443 676 1075 +3 1615 1614 626 +3 663 662 1614 +3 662 663 622 +3 1613 626 1614 +3 458 1596 2238 +3 2519 2520 2521 +3 2341 2519 2521 +3 709 1609 628 +3 707 628 1610 +3 1611 372 439 +3 1605 1604 702 +3 1086 2441 2440 +3 2436 1086 2440 +3 1157 2518 2341 +3 946 1085 1084 +3 1085 2440 1084 +3 947 68 247 +3 708 1115 628 +3 1604 709 628 +3 1087 2437 2436 +3 2437 1086 2436 +3 1445 1611 440 +3 2554 816 2214 +3 2045 292 2043 +3 2048 2046 108 +3 2046 2048 296 +3 2045 2043 108 +3 2666 293 2667 +3 2424 45 2423 +3 145 2048 313 +3 313 2048 108 +3 109 2666 2667 +3 2340 2341 1156 +3 664 1615 626 +3 1602 1603 1604 +3 2161 2238 1596 +3 2235 2237 1899 +3 2235 680 2237 +3 424 1616 1389 +3 2642 2646 686 +3 1900 2237 680 +3 1397 1398 1396 +3 1616 424 1414 +3 1419 1418 2689 +3 1308 1307 387 +3 1631 1308 387 +3 1129 379 793 +3 697 1622 696 +3 1275 1143 1633 +3 488 922 485 +3 387 1627 1629 +3 1630 387 1629 +3 1628 594 1627 +3 2534 62 160 +3 2609 788 2601 +3 1628 1627 1307 +3 1629 1627 1624 +3 594 598 569 +3 1625 594 569 +3 1623 1624 570 +3 571 2609 2601 +3 2602 2604 2607 +3 571 2602 2607 +3 572 1630 2601 +3 788 572 2601 +3 1628 380 598 +3 598 594 1628 +3 380 1628 595 +3 2467 1020 1019 +3 599 2326 2327 +3 595 1628 1307 +3 387 1630 1631 +3 1635 1637 1260 +3 1630 572 1632 +3 1630 1632 1631 +3 2539 1715 1722 +3 2386 995 2385 +3 1261 1634 1270 +3 1259 1260 1637 +3 1143 1635 1633 +3 1633 1635 1260 +3 150 465 118 +3 152 150 118 +3 465 119 118 +3 2079 80 151 +3 1277 1278 1272 +3 1641 1640 1262 +3 1879 482 1750 +3 1635 1262 1637 +3 1636 1641 1262 +3 1950 1949 1259 +3 1313 574 746 +3 2078 152 2079 +3 152 52 2079 +3 1470 80 2079 +3 2095 220 2092 +3 1278 2081 1142 +3 1643 1438 373 +3 1458 1642 1454 +3 2102 1288 2100 +3 1641 1636 1276 +3 1454 1643 373 +3 1644 1362 1361 +3 1362 1644 750 +3 2403 2400 745 +3 2403 743 2400 +3 1645 877 1646 +3 877 1645 1644 +3 1645 750 1644 +3 2399 2395 390 +3 875 870 750 +3 2395 2399 2404 +3 1648 1649 1647 +3 1649 1648 845 +3 1794 1792 849 +3 1647 847 1020 +3 2661 1093 853 +3 1013 847 1012 +3 1649 845 211 +3 1355 1349 761 +3 847 1649 1012 +3 1658 2153 2152 +3 2154 1658 2152 +3 1651 1650 1023 +3 1028 1656 1655 +3 1656 1027 1655 +3 942 225 2157 +3 46 536 960 +3 1656 1034 1018 +3 1825 1225 1826 +3 2140 1652 856 +3 858 1033 1040 +3 1652 1651 1023 +3 2273 1043 2274 +3 1043 2273 862 +3 1079 2480 688 +3 1702 1701 147 +3 860 1656 1018 +3 2152 2151 1028 +3 2154 2152 1028 +3 1106 1107 1923 +3 1021 860 1016 +3 1029 1651 1652 +3 860 1027 1656 +3 1814 255 1733 +3 1651 1657 855 +3 1651 1029 1657 +3 2313 930 931 +3 930 929 931 +3 194 4 1660 +3 1654 1659 1655 +3 1998 114 2003 +3 505 1754 2677 +3 648 649 592 +3 2639 678 2641 +3 1870 88 327 +3 1668 646 667 +3 1709 190 316 +3 2543 2542 335 +3 373 1442 2739 +3 2618 1663 9 +3 193 192 194 +3 2321 193 194 +3 117 116 120 +3 243 925 83 +3 243 1956 925 +3 1979 1978 246 +3 667 646 668 +3 2622 188 2623 +3 1988 1987 868 +3 168 1664 910 +3 911 168 910 +3 1667 1665 1663 +3 32 2015 2014 +3 32 2016 2015 +3 1579 2573 2574 +3 1664 1667 1662 +3 1846 1246 1853 +3 1246 1838 1853 +3 1997 2003 919 +3 1828 1234 1228 +3 1384 2505 1392 +3 1903 867 634 +3 665 618 1669 +3 665 653 618 +3 665 1669 1668 +3 661 665 1668 +3 589 1052 1053 +3 1669 618 693 +3 1832 1236 1830 +3 1862 2420 2415 +3 1841 1840 1230 +3 1674 1503 1501 +3 1503 1192 1501 +3 1204 1674 1501 +3 510 1672 1674 +3 1752 1751 507 +3 922 1762 1761 +3 1677 1302 366 +3 1638 1675 1263 +3 1638 221 1675 +3 1639 221 1638 +3 1265 1675 221 +3 1677 1676 1265 +3 1043 862 2134 +3 1310 1069 1678 +3 1080 689 1079 +3 1686 1685 494 +3 1284 361 2347 +3 1420 1680 1119 +3 1680 1420 1402 +3 1566 1682 1570 +3 1565 1566 1570 +3 1987 879 751 +3 869 879 1987 +3 1402 2598 2595 +3 936 801 1167 +3 1797 934 1719 +3 2247 2253 1309 +3 2253 2247 2248 +3 1660 195 2433 +3 1770 1768 487 +3 1567 1683 1682 +3 2713 237 2712 +3 1691 165 1468 +3 1286 1691 1468 +3 812 2105 808 +3 2468 7 198 +3 2708 2709 77 +3 2452 2451 2450 +3 2449 2452 2450 +3 819 2550 476 +3 819 2651 2550 +3 1198 1195 1196 +3 835 2711 838 +3 2704 517 518 +3 2319 1568 1684 +3 1687 2319 1684 +3 2244 1568 2317 +3 2319 2318 1568 +3 2258 2408 2271 +3 149 2078 2080 +3 2078 151 2080 +3 164 81 217 +3 164 1691 81 +3 236 808 2105 +3 807 808 236 +3 165 1691 1692 +3 80 1470 1471 +3 1712 981 980 +3 1701 1699 147 +3 1693 164 1694 +3 1699 64 147 +3 164 1692 1691 +3 1460 1269 2359 +3 687 2645 694 +3 80 163 162 +3 265 96 266 +3 17 262 1695 +3 809 807 464 +3 148 1700 1697 +3 2426 1011 2053 +3 2425 2424 2426 +3 1697 256 1696 +3 256 1697 1698 +3 1699 1698 257 +3 1699 24 1698 +3 64 1699 257 +3 24 256 1698 +3 2053 7 2426 +3 2425 2426 7 +3 202 2061 2062 +3 38 202 2062 +3 259 1701 1703 +3 1701 259 24 +3 259 1703 85 +3 2620 2619 9 +3 1702 207 208 +3 1701 1702 1703 +3 1738 1739 332 +3 1694 1704 1693 +3 1704 1694 1696 +3 1696 163 1704 +3 1081 684 1705 +3 2650 1618 1619 +3 1618 1620 568 +3 562 1135 1207 +3 562 2450 1135 +3 978 2016 2022 +3 1990 1620 685 +3 1990 1989 1620 +3 1620 1621 685 +3 1562 2578 489 +3 2148 1658 1029 +3 2150 2149 1031 +3 2018 2004 2017 +3 254 252 1732 +3 806 236 830 +3 1709 1710 37 +3 316 1710 1709 +3 318 1317 321 +3 1317 318 1714 +3 1716 1711 318 +3 1713 1711 316 +3 1724 316 97 +3 2208 2549 1504 +3 778 2208 1504 +3 2539 2540 2548 +3 2540 2539 337 +3 318 1718 1717 +3 1723 319 332 +3 91 901 902 +3 253 333 1734 +3 1723 317 1724 +3 36 1718 1719 +3 1710 1712 37 +3 37 1712 980 +3 38 336 208 +3 318 321 1718 +3 1713 317 1715 +3 1110 330 325 +3 2548 2540 2544 +3 1721 1315 209 +3 1025 2490 861 +3 206 1317 1318 +3 36 981 1717 +3 332 1725 1722 +3 337 1725 1726 +3 1721 1316 1315 +3 2721 2725 2723 +3 2725 2721 1760 +3 1717 1718 36 +3 1054 1377 617 +3 1376 678 1798 +3 1871 2 480 +3 1869 328 1870 +3 346 1871 480 +3 36 1719 934 +3 1721 321 1316 +3 1056 219 1743 +3 1719 1718 321 +3 1720 1719 321 +3 1721 1720 321 +3 900 209 902 +3 209 1720 1721 +3 2120 137 2626 +3 1722 1723 332 +3 319 1723 1724 +3 97 319 1724 +3 320 319 97 +3 1734 330 75 +3 1714 318 2545 +3 2544 86 2546 +3 2545 2544 2546 +3 1730 335 2542 +3 334 1730 2542 +3 446 1405 1383 +3 1731 252 65 +3 253 1729 1728 +3 334 1728 1729 +3 1729 65 1730 +3 1730 334 1729 +3 2409 2408 2269 +3 320 97 342 +3 75 254 1732 +3 253 1732 1731 +3 333 1733 1734 +3 1733 1735 1734 +3 339 323 338 +3 1738 322 1737 +3 324 1125 1474 +3 1736 324 1474 +3 1125 87 1474 +3 1475 1474 87 +3 1476 1475 87 +3 1125 1124 87 +3 1733 255 1735 +3 932 323 174 +3 932 1124 323 +3 1830 1829 1228 +3 1830 1236 1829 +3 2000 2010 2009 +3 2010 1999 2009 +3 1998 2003 1997 +3 255 1739 1738 +3 255 1738 1737 +3 932 326 1124 +3 33 1742 320 +3 1742 319 320 +3 1742 33 1741 +3 322 1742 1741 +3 1597 461 2094 +3 1056 1057 219 +3 458 1100 1597 +3 40 101 102 +3 1099 285 1056 +3 4 915 1746 +3 1745 1056 1744 +3 1596 458 1597 +3 4 1746 195 +3 911 1666 195 +3 1746 911 195 +3 126 70 123 +3 915 4 916 +3 913 1747 912 +3 119 70 126 +3 1757 557 556 +3 535 90 951 +3 503 1749 1565 +3 1570 503 1565 +3 1749 503 1563 +3 1756 1757 556 +3 2633 770 2679 +3 2637 171 2682 +3 235 2743 1114 +3 482 507 1750 +3 1311 576 2247 +3 1337 555 513 +3 1753 1752 507 +3 1752 1753 233 +3 156 1874 19 +3 1754 511 1755 +3 1690 2722 1689 +3 516 232 512 +3 1766 504 487 +3 1192 1503 2713 +3 557 1757 1758 +3 2726 1690 2314 +3 1767 1768 1778 +3 2727 2724 2726 +3 1780 2727 2726 +3 557 2729 2730 +3 596 380 595 +3 488 486 1202 +3 922 488 1762 +3 1311 2247 1309 +3 2632 2633 452 +3 1756 1763 1757 +3 1489 2632 452 +3 1502 1192 2715 +3 1755 2495 509 +3 509 1779 1755 +3 1195 2712 237 +3 1754 1755 1779 +3 1766 1767 505 +3 1769 2246 2245 +3 2314 2315 1688 +3 491 1770 484 +3 1564 2246 491 +3 487 484 1770 +3 488 506 1762 +3 507 482 1771 +3 1685 1686 2748 +3 1771 1772 504 +3 1771 482 1772 +3 2311 2498 2501 +3 2495 1755 2494 +3 2495 2494 1763 +3 2497 2310 1393 +3 2713 1503 237 +3 306 2349 2350 +3 2244 1689 2245 +3 1760 1775 1776 +3 2501 1394 2502 +3 1773 1774 1758 +3 1757 1773 1758 +3 1778 1754 505 +3 1767 1778 505 +3 1775 1764 1776 +3 56 1777 1768 +3 512 232 508 +3 511 1777 1776 +3 1776 1777 1760 +3 2727 2728 923 +3 1768 1777 1778 +3 511 1778 1777 +3 306 363 2349 +3 2240 2241 1256 +3 1256 1783 2240 +3 1258 1253 358 +3 363 2348 2349 +3 647 591 1784 +3 647 671 591 +3 2397 1172 749 +3 2586 1560 2576 +3 1784 591 619 +3 591 620 619 +3 619 1786 1785 +3 629 1785 1786 +3 629 1786 588 +3 1368 629 588 +3 674 946 1076 +3 1804 946 674 +3 1367 629 1368 +3 592 1788 1787 +3 1109 1804 642 +3 1789 848 1791 +3 694 2647 2605 +3 638 745 2640 +3 638 1905 743 +3 685 1621 2642 +3 964 1600 1790 +3 1790 1600 532 +3 102 2320 51 +3 211 907 1012 +3 212 1791 1792 +3 1796 956 963 +3 1038 1039 1037 +3 2305 2306 1391 +3 460 2160 2168 +3 1214 934 1797 +3 2267 1487 2266 +3 1492 545 1491 +3 1066 1803 673 +3 42 8 1805 +3 1064 93 1065 +3 675 1800 674 +3 1799 674 1800 +3 92 563 562 +3 620 591 683 +3 2631 620 683 +3 620 2631 2629 +3 650 1369 1370 +3 587 1801 774 +3 946 1804 1109 +3 1935 1932 1101 +3 1807 78 1583 +3 1959 925 1956 +3 78 57 40 +3 1807 57 78 +3 1811 1809 1812 +3 1811 62 2534 +3 1725 1814 1726 +3 1806 1807 28 +3 1807 1583 28 +3 285 1099 1937 +3 1807 1806 57 +3 1812 62 1811 +3 42 1808 1809 +3 1808 28 1809 +3 1808 1806 28 +3 1399 2596 1413 +3 2597 2596 1399 +3 1739 1725 332 +3 1725 1739 1814 +3 1868 1869 49 +3 1579 1955 1956 +3 57 105 40 +3 42 1809 1811 +3 98 2536 2535 +3 8 2536 98 +3 2525 98 2535 +3 100 29 101 +3 1812 1813 43 +3 76 196 1011 +3 2313 49 932 +3 2312 2313 932 +3 930 2313 2312 +3 1818 1004 1223 +3 1817 1818 1223 +3 521 1867 1868 +3 724 443 725 +3 1819 1820 1226 +3 444 1822 1006 +3 1824 1225 1825 +3 1824 1823 1225 +3 1821 1239 1007 +3 1213 409 969 +3 2472 1224 2471 +3 1224 1823 2471 +3 1816 1224 2472 +3 2472 2471 1817 +3 1829 1828 1228 +3 1827 1828 1235 +3 1229 1835 1244 +3 1231 1411 1849 +3 1824 1825 1820 +3 1823 1224 725 +3 1225 1823 725 +3 725 1826 1225 +3 1229 1236 1832 +3 76 538 196 +3 2000 2002 916 +3 339 409 174 +3 2117 2124 353 +3 2124 2116 353 +3 1829 1236 1235 +3 1831 1830 1228 +3 1831 1670 1830 +3 1238 1237 1831 +3 1237 1670 1831 +3 1827 1234 1828 +3 1244 1835 54 +3 1229 1833 1834 +3 1833 1229 1832 +3 1835 1229 1834 +3 1849 1856 1232 +3 326 327 1476 +3 1123 1124 1125 +3 323 1124 1123 +3 1237 1842 1245 +3 1842 1230 1245 +3 1837 1834 1833 +3 1836 1837 1833 +3 1832 1670 1833 +3 1245 1837 1836 +3 1230 1838 1245 +3 1838 1837 1245 +3 1250 1231 1848 +3 1237 1245 1836 +3 1844 1248 1843 +3 755 1889 881 +3 1838 1839 1853 +3 25 2031 2030 +3 1839 1230 1840 +3 1233 1842 442 +3 1233 1841 1842 +3 881 1887 1886 +3 422 1445 440 +3 1250 1848 1847 +3 1843 1839 1840 +3 1250 1843 1840 +3 1844 1843 1847 +3 1250 1847 1843 +3 1846 1248 1845 +3 1839 1843 1248 +3 1848 1232 1850 +3 1852 1380 429 +3 1852 1845 1249 +3 1845 1852 429 +3 1852 1249 1851 +3 1851 1380 1852 +3 1248 1846 1853 +3 1853 1839 1248 +3 1838 1246 1837 +3 1855 1856 1383 +3 1232 1854 1850 +3 1856 446 1383 +3 446 1856 1849 +3 2418 2419 1859 +3 1854 1857 1851 +3 1382 1857 1854 +3 1857 1380 1851 +3 311 1147 314 +3 1479 2033 136 +3 1382 1854 1855 +3 1854 1232 1855 +3 1859 2417 2418 +3 1855 1407 1862 +3 1382 1855 1862 +3 1859 1381 1860 +3 1858 1859 1860 +3 1849 1411 446 +3 428 1381 1859 +3 1858 1380 1857 +3 45 2425 1915 +3 2416 182 2415 +3 1861 1382 1862 +3 1863 356 738 +3 130 1864 1863 +3 1864 355 1863 +3 131 355 1864 +3 191 2023 2029 +3 2476 2477 1026 +3 1112 863 2476 +3 863 2477 2476 +3 944 2652 1148 +3 2616 2615 1866 +3 1865 187 35 +3 2007 191 2028 +3 2020 2004 2019 +3 207 1702 894 +3 525 2705 519 +3 843 216 842 +3 1867 434 328 +3 932 49 1869 +3 326 932 1869 +3 328 1869 1868 +3 1870 326 1869 +3 327 326 1870 +3 328 88 1870 +3 1875 1877 19 +3 99 2524 2523 +3 518 2710 2705 +3 990 2182 2181 +3 157 71 158 +3 119 71 157 +3 117 70 119 +3 119 126 71 +3 465 20 117 +3 131 1864 1876 +3 1864 454 1876 +3 454 1864 130 +3 19 1874 1875 +3 1407 2420 1862 +3 1407 2421 2420 +3 170 517 2696 +3 517 170 553 +3 153 19 1463 +3 131 129 355 +3 1472 1465 360 +3 1750 834 1879 +3 836 481 837 +3 1883 234 835 +3 234 1883 834 +3 1881 834 1883 +3 1880 1881 377 +3 1882 1884 419 +3 1882 1881 1884 +3 84 1965 2223 +3 84 1967 1965 +3 141 471 1882 +3 483 836 837 +3 481 474 837 +3 2623 2621 2622 +3 1883 1884 1881 +3 1884 1885 419 +3 779 1545 780 +3 835 1885 1884 +3 835 144 1885 +3 835 838 144 +3 1121 180 431 +3 869 880 879 +3 879 880 757 +3 880 1886 757 +3 755 881 1359 +3 880 881 1886 +3 1359 881 880 +3 1162 754 1888 +3 1888 754 1887 +3 1233 1231 1841 +3 1889 758 1162 +3 1472 2695 1461 +3 184 2691 447 +3 1909 636 1908 +3 1913 636 1909 +3 1378 1368 631 +3 2402 749 577 +3 2319 1688 2318 +3 635 616 1894 +3 616 635 1898 +3 744 1905 1908 +3 657 652 653 +3 2238 460 2169 +3 635 877 1901 +3 1904 1903 634 +3 616 1900 1897 +3 1901 1899 635 +3 460 2168 2169 +3 2240 1302 1677 +3 750 870 871 +3 870 867 868 +3 871 870 868 +3 748 1897 1900 +3 918 1998 1997 +3 1010 2552 2551 +3 1896 1897 1902 +3 1897 748 1902 +3 616 1897 1896 +3 800 801 395 +3 1172 1171 682 +3 1903 1902 748 +3 1999 114 1998 +3 1680 2597 1403 +3 1903 1904 744 +3 1893 1914 1892 +3 1896 1907 1910 +3 1907 1908 1910 +3 1911 1910 636 +3 1910 1908 636 +3 1374 1913 1375 +3 1896 1910 1911 +3 1895 1896 1911 +3 1391 1384 1392 +3 2506 2505 1384 +3 1913 1909 1375 +3 581 651 1055 +3 1911 1914 1895 +3 1912 1913 615 +3 1912 615 1892 +3 1893 1892 632 +3 110 45 1915 +3 1912 636 1913 +3 2596 1402 2595 +3 1893 1895 1914 +3 1916 13 1917 +3 1917 13 1918 +3 1947 2469 1427 +3 1457 1947 1427 +3 106 1921 1920 +3 1922 286 1921 +3 106 1922 1921 +3 1920 1919 106 +3 2225 2224 1965 +3 2256 1048 2481 +3 1511 967 966 +3 1924 1923 688 +3 1924 1925 1923 +3 2645 687 1928 +3 2481 2254 2256 +3 1319 282 943 +3 943 282 944 +3 2200 2736 2203 +3 1606 2303 2301 +3 689 1081 1927 +3 1926 1927 1928 +3 2551 2552 1106 +3 1046 2489 1112 +3 1924 1926 1925 +3 1926 690 1925 +3 1156 2341 2521 +3 621 664 626 +3 687 690 1926 +3 435 2304 432 +3 1935 1933 1932 +3 1148 943 944 +3 1104 1929 1105 +3 1929 945 1105 +3 1101 1932 1104 +3 1099 1098 1938 +3 285 1936 1101 +3 2164 988 2201 +3 2175 989 2171 +3 996 2177 995 +3 1097 1944 1936 +3 2199 2166 2198 +3 1095 283 1934 +3 1933 1934 283 +3 2122 350 349 +3 350 2627 349 +3 1098 341 1939 +3 1095 1934 1096 +3 1942 1945 1940 +3 1945 1942 1939 +3 1936 285 1937 +3 2204 2205 2653 +3 1944 1097 1942 +3 1944 1942 1943 +3 1936 1944 1935 +3 1945 1939 341 +3 42 15 8 +3 1939 1097 1938 +3 1096 1940 1941 +3 2536 15 2533 +3 1940 341 1941 +3 159 2533 2532 +3 2536 2533 159 +3 8 15 2536 +3 1943 1102 1944 +3 374 1435 1436 +3 400 1430 1946 +3 1429 1946 1430 +3 1633 1260 1948 +3 1634 1633 1948 +3 1185 1183 2331 +3 1185 1186 1183 +3 1949 1260 1259 +3 364 1634 1949 +3 1634 364 1270 +3 1634 1948 1949 +3 1948 1260 1949 +3 2532 2529 2528 +3 1270 364 1258 +3 340 63 2531 +3 1951 340 2531 +3 31 193 2321 +3 2435 31 2321 +3 2571 1579 2572 +3 62 1812 43 +3 667 2128 625 +3 1957 924 1955 +3 1957 1954 1580 +3 1957 1955 1954 +3 1580 43 1813 +3 2615 2616 18 +3 1580 1954 1953 +3 1955 1579 1954 +3 1580 1953 43 +3 1960 925 1959 +3 1962 1961 926 +3 1961 1962 1960 +3 1958 924 1957 +3 1581 1958 1957 +3 1813 1581 1580 +3 1810 1581 1813 +3 2225 83 2224 +3 926 2224 1962 +3 2223 2224 926 +3 2623 188 979 +3 18 1865 2615 +3 1865 18 2620 +3 162 1966 1964 +3 1963 162 1964 +3 406 2229 2230 +3 671 666 591 +3 1971 890 315 +3 1178 1177 315 +3 1177 1969 315 +3 78 79 1961 +3 78 1961 27 +3 1961 1960 27 +3 1962 925 1960 +3 2225 125 949 +3 83 925 1962 +3 1968 65 251 +3 2672 2673 294 +3 883 2673 2672 +3 1968 251 125 +3 1961 1963 926 +3 1961 79 1963 +3 949 83 2225 +3 1964 926 1963 +3 2211 781 2232 +3 162 79 161 +3 79 162 1963 +3 258 1486 84 +3 1486 1967 84 +3 162 163 1966 +3 1968 125 1967 +3 190 1708 1665 +3 1730 65 1968 +3 260 1730 1968 +3 85 1730 260 +3 260 1968 1967 +3 782 2228 2227 +3 785 2227 2228 +3 1972 1363 872 +3 574 1313 2251 +3 2248 573 1310 +3 1557 2583 2584 +3 1312 1311 1309 +3 1972 878 1363 +3 2586 2590 1974 +3 873 389 1973 +3 878 1972 389 +3 1972 1973 389 +3 2276 2594 283 +3 2594 2276 1931 +3 211 1977 1975 +3 1090 2431 5 +3 1976 1977 908 +3 1746 1747 911 +3 2432 1199 1673 +3 2432 1200 1209 +3 1199 2432 1209 +3 510 2432 1673 +3 2432 510 1200 +3 947 244 245 +3 948 893 947 +3 340 1978 1980 +3 240 340 1981 +3 63 340 240 +3 340 1980 1981 +3 1981 1980 41 +3 1981 1983 240 +3 1600 90 533 +3 1986 503 1570 +3 1985 1984 60 +3 240 1984 1985 +3 1984 241 60 +3 120 70 117 +3 241 1984 1983 +3 503 1986 1686 +3 2747 1569 2748 +3 2013 1997 919 +3 1351 1350 874 +3 2506 1400 2505 +3 1999 1998 918 +3 236 806 807 +3 1787 1786 619 +3 2323 2324 1186 +3 2606 2603 1619 +3 1996 2013 2014 +3 863 2478 2477 +3 907 2431 1090 +3 1024 2486 2484 +3 189 2007 2028 +3 1865 2007 189 +3 2028 191 2029 +3 2006 113 189 +3 35 2007 1865 +3 2024 2025 2006 +3 2025 2024 2005 +3 192 2027 194 +3 1996 918 1997 +3 2014 2013 1995 +3 2023 2018 2005 +3 2023 2019 2018 +3 94 971 970 +3 94 976 972 +3 1065 648 592 +3 917 1999 918 +3 2001 916 921 +3 2000 114 2010 +3 114 1999 2010 +3 2021 191 2008 +3 1660 2321 194 +3 1660 2435 2321 +3 2020 2019 2021 +3 61 977 978 +3 2022 2016 32 +3 195 1666 2433 +3 1679 2256 1047 +3 1978 1951 1952 +3 2024 2029 2023 +3 2021 2019 191 +3 1026 2478 1025 +3 2028 2006 189 +3 2009 2002 2000 +3 2002 2009 917 +3 2009 1999 917 +3 1487 1488 672 +3 2257 1487 672 +3 917 912 2002 +3 1994 2011 919 +3 2011 2013 919 +3 2015 1996 2014 +3 2015 972 1996 +3 2491 2485 1015 +3 2139 2138 2142 +3 1993 920 1994 +3 972 976 1996 +3 2489 863 1112 +3 1094 2274 861 +3 2490 1094 861 +3 2020 2022 32 +3 1995 2012 2004 +3 2012 2017 2004 +3 2012 920 2017 +3 2480 1924 688 +3 1926 1924 2508 +3 2429 904 2428 +3 978 977 2016 +3 1995 2020 32 +3 32 2014 1995 +3 2020 1995 2004 +3 977 61 985 +3 2017 920 2005 +3 2026 113 2025 +3 191 2019 2023 +3 854 1094 2490 +3 2022 2020 2021 +3 920 2025 2005 +3 1023 1047 1046 +3 1023 1046 856 +3 1650 1047 1023 +3 1585 1141 2387 +3 1029 1652 2144 +3 4 194 2027 +3 921 2027 2026 +3 2026 2027 113 +3 280 2733 2734 +3 864 2139 2142 +3 192 113 2027 +3 916 2027 921 +3 4 2027 916 +3 2287 2291 1484 +3 414 2291 2287 +3 2288 1484 2291 +3 26 1920 2036 +3 1920 287 2036 +3 2286 23 2289 +3 777 1515 1519 +3 111 2038 291 +3 2038 26 2037 +3 26 2039 1920 +3 1920 2039 1919 +3 2039 110 1919 +3 2040 110 2039 +3 413 110 2040 +3 110 413 45 +3 111 1484 2288 +3 2288 2040 111 +3 300 145 313 +3 2047 22 292 +3 292 288 2043 +3 2046 2047 2045 +3 2047 292 2045 +3 2046 2045 108 +3 335 208 336 +3 959 89 961 +3 2063 89 959 +3 198 197 2049 +3 465 150 20 +3 59 201 207 +3 201 59 2049 +3 22 1485 291 +3 1485 111 291 +3 145 296 2048 +3 2060 203 2056 +3 203 2060 2064 +3 2061 2057 903 +3 196 2052 1011 +3 197 2052 2051 +3 2053 2052 197 +3 1011 2052 2053 +3 2424 2423 1146 +3 2049 59 198 +3 2053 197 198 +3 7 2053 198 +3 24 1699 1701 +3 1406 1405 2427 +3 1405 1406 1383 +3 2058 2057 203 +3 207 2059 38 +3 535 204 534 +3 2059 202 38 +3 213 906 2058 +3 2056 2057 2061 +3 201 2055 2059 +3 2054 2055 201 +3 213 2069 954 +3 2056 2061 202 +3 2055 2056 202 +3 196 960 961 +3 150 149 20 +3 149 150 2078 +3 197 2050 2049 +3 2063 2060 89 +3 1301 1264 1140 +3 203 2064 2065 +3 2065 2066 2058 +3 2066 2065 952 +3 2065 2058 203 +3 535 951 2067 +3 952 535 2067 +3 952 2067 2066 +3 953 2068 951 +3 953 2069 2068 +3 2069 213 2068 +3 954 2071 955 +3 2050 201 2049 +3 199 59 200 +3 2073 90 965 +3 2075 214 963 +3 951 90 2073 +3 953 2072 2070 +3 11 58 199 +3 2073 965 214 +3 964 965 1600 +3 214 2072 2073 +3 953 2073 2072 +3 2661 2272 851 +3 2063 2077 2060 +3 2064 2077 958 +3 2060 2077 2064 +3 1301 218 2083 +3 1277 2081 1278 +3 2080 151 51 +3 2081 1277 1264 +3 2082 2081 1264 +3 1264 1301 2082 +3 1301 2083 2082 +3 1280 224 1279 +3 1281 2087 1297 +3 2086 222 2087 +3 1280 2086 2087 +3 2091 2090 1283 +3 2102 2103 217 +3 2088 1282 2084 +3 2083 2088 2084 +3 2086 2091 222 +3 1282 2090 2091 +3 2089 2090 1282 +3 1281 1280 2087 +3 224 1280 1281 +3 2084 2082 2083 +3 2083 1285 2088 +3 2101 2093 2094 +3 225 1296 278 +3 1282 2091 2086 +3 2102 2096 1288 +3 2096 2102 1290 +3 82 51 161 +3 220 2095 2096 +3 1285 2093 2092 +3 219 1057 2099 +3 1287 2097 2095 +3 2097 2096 2095 +3 2097 1288 2096 +3 1140 1264 1641 +3 1287 219 2097 +3 1287 1743 219 +3 2083 218 2094 +3 2083 2094 1285 +3 218 1597 2094 +3 1057 282 2099 +3 1320 282 1319 +3 2095 2093 1287 +3 290 2098 2099 +3 290 2100 2098 +3 2104 1695 164 +3 217 1290 2102 +3 80 162 161 +3 2103 1695 2104 +3 1694 164 1695 +3 164 217 2104 +3 2657 475 2656 +3 814 2657 812 +3 381 814 812 +3 812 2657 2105 +3 473 831 819 +3 1451 2126 467 +3 2126 2125 467 +3 2121 2117 353 +3 2113 2112 135 +3 773 2628 2631 +3 2480 2508 1924 +3 2480 689 2508 +3 295 350 882 +3 2675 295 882 +3 2512 1157 2340 +3 1871 2110 345 +3 1871 347 2110 +3 343 2112 2113 +3 345 2110 2111 +3 1492 1491 172 +3 2625 2626 371 +3 2111 2112 343 +3 2502 1395 2501 +3 2298 677 2293 +3 348 2107 2116 +3 1483 1482 135 +3 140 2284 415 +3 344 343 2113 +3 348 2116 2115 +3 2107 112 2116 +3 884 138 354 +3 2125 2108 2118 +3 148 2127 1700 +3 2127 261 1700 +3 293 2666 2668 +3 2127 148 1695 +3 2120 2111 137 +3 371 44 370 +3 2663 890 2672 +3 397 607 939 +3 2121 354 2117 +3 354 138 2117 +3 112 787 353 +3 235 811 2743 +3 2121 2282 139 +3 612 592 1787 +3 2664 891 2663 +3 294 2664 2663 +3 1512 1513 778 +3 2118 467 2125 +3 1695 262 2127 +3 261 262 95 +3 1116 2128 2129 +3 2128 667 2129 +3 645 1116 2129 +3 2130 1488 670 +3 2131 2130 670 +3 677 2295 2294 +3 2129 667 668 +3 2130 2129 668 +3 2261 2263 3 +3 1145 2263 2261 +3 700 2262 3 +3 645 2130 2131 +3 645 2129 2130 +3 1602 1604 1605 +3 1003 702 1115 +3 969 973 2132 +3 94 2132 973 +3 175 969 970 +3 2135 2134 862 +3 1044 856 1113 +3 286 107 2041 +3 1042 856 2133 +3 853 2660 2661 +3 2193 2194 2195 +3 280 995 2172 +3 1043 2134 2133 +3 864 1652 2140 +3 2136 862 1033 +3 2144 1652 864 +3 858 1031 1032 +3 2138 1041 2137 +3 1094 851 2274 +3 2140 856 1042 +3 2147 2149 865 +3 2146 1032 1031 +3 2153 2147 865 +3 2153 2148 2147 +3 2154 1657 1658 +3 2148 1030 2147 +3 2257 2271 2260 +3 2271 1145 2260 +3 1028 2151 1656 +3 2151 1034 1656 +3 1185 2323 1186 +3 1188 1187 2329 +3 1185 2322 2323 +3 1302 2240 1783 +3 1659 1657 2156 +3 1657 1659 855 +3 2157 279 943 +3 279 1319 943 +3 2159 942 2158 +3 2158 942 2157 +3 943 2158 2157 +3 2200 988 2735 +3 1878 19 1877 +3 2198 2166 2206 +3 2734 1941 280 +3 2244 2245 494 +3 2159 2160 942 +3 942 2161 457 +3 942 2160 2161 +3 2160 460 2161 +3 2673 884 294 +3 1404 2427 1384 +3 2427 2506 1384 +3 880 869 756 +3 2164 989 987 +3 2163 2164 987 +3 2180 993 2183 +3 950 1588 1589 +3 992 989 2175 +3 2166 988 2165 +3 2162 2168 2160 +3 697 1078 2537 +3 697 1079 1078 +3 2159 2158 281 +3 2165 2163 281 +3 2173 2198 2207 +3 2176 992 2175 +3 2208 778 1509 +3 2385 2384 2176 +3 1096 2734 991 +3 2554 817 2654 +3 816 2554 2654 +3 993 997 2183 +3 2186 2185 2184 +3 2189 2191 2190 +3 2191 1098 2186 +3 2525 2535 2524 +3 2178 2190 2182 +3 2178 2189 2190 +3 2523 2524 238 +3 1300 2392 1588 +3 2390 1137 1292 +3 2524 159 238 +3 284 1103 2185 +3 2394 2405 1174 +3 997 993 2185 +3 284 2186 1098 +3 2186 284 2185 +3 1636 1143 1276 +3 1982 1983 1981 +3 1635 1143 1636 +3 2188 2187 2177 +3 996 2188 2177 +3 994 2182 2190 +3 2191 994 2190 +3 8 98 100 +3 996 1941 2189 +3 2276 2275 1931 +3 2276 1930 2275 +3 2193 2195 1930 +3 829 2552 1010 +3 289 263 2379 +3 1095 2173 2192 +3 2172 2171 2205 +3 1095 2192 2193 +3 2161 460 2238 +3 344 2113 73 +3 2732 2733 2167 +3 1095 1096 991 +3 2173 1095 991 +3 2192 2194 2193 +3 1320 1319 263 +3 2196 2195 1929 +3 1810 1812 1809 +3 2616 1866 192 +3 2210 2209 1542 +3 2200 2203 2201 +3 95 262 264 +3 18 2616 2617 +3 1319 279 2382 +3 945 2206 2166 +3 1504 785 1506 +3 2558 1163 760 +3 2210 2211 143 +3 781 2557 2212 +3 2556 2557 781 +3 2231 2232 2212 +3 1449 418 1450 +3 1449 1450 1448 +3 2221 792 393 +3 2558 1158 1163 +3 2654 2655 816 +3 141 1882 419 +3 2215 781 2211 +3 2211 2232 143 +3 2212 2213 782 +3 2227 2212 782 +3 1159 2558 760 +3 379 1129 575 +3 2445 2447 582 +3 2554 2556 2555 +3 2554 2214 2556 +3 1457 400 1947 +3 141 419 1449 +3 2556 781 2555 +3 378 2217 473 +3 814 815 475 +3 2217 474 481 +3 473 2217 481 +3 832 473 481 +3 2219 2220 794 +3 803 794 2220 +3 2221 393 2220 +3 2218 793 2219 +3 2219 394 2218 +3 2220 2222 803 +3 793 2218 1129 +3 783 2230 2213 +3 259 85 260 +3 2223 1964 84 +3 1508 785 2228 +3 2623 979 35 +3 187 2623 35 +3 2223 1965 2224 +3 1504 2226 785 +3 116 117 20 +3 2232 2231 143 +3 143 2209 2210 +3 1801 2445 582 +3 2554 378 817 +3 2551 1923 2553 +3 2215 2211 2210 +3 783 406 2230 +3 2227 2231 2212 +3 2233 1458 1428 +3 478 1458 2233 +3 2198 2206 2234 +3 2207 2198 2234 +3 2197 2234 2206 +3 2207 2234 2197 +3 2133 2134 1042 +3 2135 1042 2134 +3 265 6 1152 +3 278 96 2381 +3 2380 2382 2381 +3 2382 2380 263 +3 2176 2384 2383 +3 990 2176 2383 +3 2510 1510 1506 +3 277 2380 2381 +3 2141 1042 2135 +3 1256 2241 2242 +3 2241 1271 2242 +3 558 1567 1761 +3 2318 2317 1568 +3 2318 2316 2317 +3 1688 2316 2318 +3 1568 2244 1685 +3 2244 494 1685 +3 519 2710 521 +3 2710 1867 521 +3 1973 1972 872 +3 2248 1310 2250 +3 391 2277 768 +3 690 2538 828 +3 2251 1312 1309 +3 1313 1312 2251 +3 747 1312 1313 +3 1047 2254 1046 +3 2485 1024 2484 +3 2485 2491 1024 +3 2478 863 2479 +3 2255 863 2489 +3 2488 2255 2489 +3 2481 1048 2482 +3 2343 704 2264 +3 2256 1584 1048 +3 2256 1679 1584 +3 704 2340 2264 +3 2344 1994 919 +3 2300 701 2301 +3 2262 2266 2265 +3 670 2268 2131 +3 1387 2306 2305 +3 2268 2266 2262 +3 1488 2267 670 +3 705 1144 672 +3 670 2266 2268 +3 1488 1487 2267 +3 1138 1590 2662 +3 1590 1591 2662 +3 2297 1602 1605 +3 2293 1601 2298 +3 2258 1144 2270 +3 2257 1144 2258 +3 672 1144 2257 +3 2257 2258 2271 +3 1991 565 1990 +3 1992 1991 1990 +3 2646 1621 2649 +3 1705 684 1992 +3 684 1991 1992 +3 684 1081 1080 +3 486 500 811 +3 2269 2270 2259 +3 2270 1144 2259 +3 2408 2409 2271 +3 2409 1145 2271 +3 2278 1311 768 +3 2278 576 1311 +3 2389 2388 1274 +3 2389 2387 2388 +3 1274 2391 1143 +3 1587 1140 2279 +3 1505 1509 777 +3 787 2281 2282 +3 787 415 2281 +3 139 2282 2281 +3 2282 2121 353 +3 787 2282 353 +3 2412 482 2414 +3 2040 2288 413 +3 2292 2288 2291 +3 2292 413 2288 +3 1484 1485 2280 +3 2289 23 2290 +3 413 2289 2290 +3 415 2284 2283 +3 414 2285 2286 +3 414 2292 2291 +3 2289 413 2292 +3 1480 73 1479 +3 45 413 2290 +3 2424 2425 45 +3 1011 2424 1146 +3 2427 1404 1406 +3 1404 1385 1406 +3 2507 1394 1412 +3 856 1046 1112 +3 2295 702 1003 +3 1605 702 2295 +3 2300 1603 1602 +3 2296 2131 2268 +3 2297 1605 2295 +3 1394 2501 2498 +3 1562 2588 2578 +3 499 1548 1521 +3 1157 2341 2340 +3 372 1441 2304 +3 1982 1981 41 +3 2738 1982 41 +3 2344 1993 1994 +3 2516 2517 703 +3 2519 2516 703 +3 2412 1772 482 +3 836 1772 2412 +3 2281 415 2411 +3 612 619 2630 +3 2302 2303 709 +3 1606 1608 2303 +3 2305 1391 1392 +3 372 435 1329 +3 372 2304 435 +3 2307 1390 2308 +3 2423 2290 1146 +3 2290 2423 45 +3 1816 2472 2473 +3 2474 1816 2473 +3 1210 930 2312 +3 2474 2473 1223 +3 558 2314 1688 +3 2313 931 49 +3 492 1576 500 +3 500 486 492 +3 2173 2174 2198 +3 2322 1184 2323 +3 558 1780 2314 +3 280 2172 2733 +3 517 2704 250 +3 2725 56 2722 +3 2315 2316 1688 +3 2315 2243 2316 +3 2700 2703 524 +3 433 432 180 +3 1648 848 215 +3 149 2320 103 +3 51 82 102 +3 2582 2580 1556 +3 2320 102 103 +3 2440 2441 1084 +3 1951 43 1953 +3 2616 193 2617 +3 2727 923 2724 +3 1775 2721 2720 +3 2720 2719 1775 +3 2322 1208 1184 +3 2322 2330 1208 +3 1193 2325 1184 +3 2325 2324 1184 +3 601 386 1194 +3 2325 1193 2329 +3 2720 2721 923 +3 1758 2720 923 +3 2520 1606 1607 +3 2330 1185 2331 +3 603 601 2337 +3 603 405 601 +3 2334 2333 2332 +3 412 2333 2334 +3 2332 2331 1183 +3 763 765 2466 +3 765 763 762 +3 412 603 2333 +3 1181 412 2334 +3 412 1181 1182 +3 2333 603 2337 +3 2337 2336 600 +3 2335 600 2336 +3 2333 2337 600 +3 2332 2333 600 +3 704 2342 2511 +3 2512 704 2511 +3 2338 2514 2513 +3 2338 705 2514 +3 2338 2513 2512 +3 2511 2338 2512 +3 704 2512 2340 +3 703 2520 2519 +3 705 2338 2339 +3 705 2339 1144 +3 2342 2259 1144 +3 2339 2342 1144 +3 1297 2347 363 +3 2087 222 1297 +3 222 2347 1297 +3 1284 2347 222 +3 308 309 229 +3 2348 223 2349 +3 2345 1459 2351 +3 305 306 2350 +3 1268 2345 2351 +3 308 226 309 +3 2359 2351 1460 +3 2360 1269 2361 +3 2352 2353 1364 +3 1268 2353 2352 +3 2356 1782 358 +3 2356 1255 1782 +3 2359 2358 1268 +3 1268 2351 2359 +3 1783 2354 1302 +3 2357 2350 223 +3 2349 223 2350 +3 2353 1268 2358 +3 303 1251 365 +3 2370 303 365 +3 2367 454 455 +3 454 2367 1878 +3 2356 2355 1255 +3 2358 359 2354 +3 1463 2366 2365 +3 2358 2360 359 +3 2359 2360 2358 +3 1267 2363 2364 +3 155 1464 1461 +3 2366 1878 2367 +3 2359 1269 2360 +3 2360 2363 359 +3 2362 2365 2369 +3 19 153 156 +3 156 153 152 +3 1462 1465 1464 +3 2370 2369 2373 +3 303 2370 2371 +3 359 2368 1302 +3 2354 359 1302 +3 2368 359 2363 +3 2363 1267 2368 +3 1464 155 1466 +3 1462 1464 1466 +3 1467 155 1303 +3 1267 2659 53 +3 2375 632 593 +3 632 2375 1893 +3 366 2368 2372 +3 366 1302 2368 +3 362 2369 2370 +3 303 2371 1002 +3 366 2372 1266 +3 2369 154 2373 +3 77 2711 2708 +3 1905 638 1909 +3 1646 876 2404 +3 2377 265 2376 +3 96 277 2381 +3 264 2379 2378 +3 2383 2177 2187 +3 990 2383 2187 +3 2381 279 278 +3 995 2384 2385 +3 2384 995 2177 +3 2384 2177 2383 +3 2171 995 2386 +3 2386 2175 2171 +3 1137 2389 1274 +3 1292 1589 2392 +3 1292 2392 2390 +3 2390 2392 1300 +3 1589 1588 2392 +3 993 2180 2181 +3 1300 1585 2387 +3 1588 1585 1300 +3 1141 2388 2387 +3 2389 2390 1300 +3 1141 2393 2388 +3 2393 1141 2279 +3 2405 2374 1174 +3 2404 2399 1646 +3 2399 875 1646 +3 2400 390 745 +3 2402 577 1314 +3 1646 875 1645 +3 747 2398 2402 +3 2398 2396 2402 +3 747 1313 2398 +3 638 2403 745 +3 638 743 2403 +3 1173 1172 2397 +3 2396 2398 390 +3 746 745 2398 +3 745 390 2398 +3 746 574 1067 +3 1313 746 2398 +3 2402 1314 747 +3 1894 2406 635 +3 2401 870 875 +3 2396 749 2402 +3 876 2405 2394 +3 2405 2406 2374 +3 2405 876 2406 +3 2406 633 2374 +3 1894 633 2406 +3 1904 2401 743 +3 876 635 2406 +3 634 2401 1904 +3 848 2407 1793 +3 2269 2408 2270 +3 415 2283 2411 +3 2411 2280 2281 +3 2417 1423 1386 +3 2413 833 481 +3 833 832 481 +3 836 2413 481 +3 2460 2461 831 +3 472 831 2461 +3 2414 1880 833 +3 2412 2414 833 +3 1114 2742 382 +3 2742 2741 382 +3 836 2412 2413 +3 1879 1880 2414 +3 482 1879 2414 +3 377 2461 2460 +3 426 2418 1386 +3 426 2419 2418 +3 426 1398 2419 +3 182 2416 2417 +3 2416 1423 2417 +3 1398 428 2419 +3 1385 2422 2421 +3 1423 2416 2420 +3 2416 2415 2420 +3 2425 7 13 +3 1915 2425 13 +3 2541 334 2542 +3 411 957 2428 +3 980 61 979 +3 905 2429 2428 +3 2431 907 1975 +3 2431 1975 905 +3 2430 2431 905 +3 2430 5 2431 +3 957 5 2430 +3 962 5 957 +3 1087 1106 2552 +3 1952 246 1978 +3 2434 2435 1660 +3 2434 31 2435 +3 2433 2434 1660 +3 243 83 245 +3 893 68 947 +3 1010 2553 1925 +3 829 1058 2438 +3 2517 706 1609 +3 2439 1085 827 +3 1085 1108 827 +3 1084 2441 2442 +3 676 2442 2441 +3 2436 1085 2439 +3 2436 2440 1085 +3 2442 1076 1084 +3 2448 2629 582 +3 2447 2448 582 +3 612 2630 2448 +3 676 2443 2442 +3 2443 1076 2442 +3 1801 675 2445 +3 1206 561 92 +3 2448 1074 1073 +3 785 2226 2227 +3 2339 2511 2342 +3 2449 1618 568 +3 1111 897 2453 +3 936 1167 402 +3 2454 897 2455 +3 1041 2139 2141 +3 936 402 937 +3 2459 936 937 +3 506 488 1202 +3 1618 1621 1620 +3 563 1618 2449 +3 1619 1618 563 +3 1707 2451 568 +3 2455 167 2454 +3 796 395 813 +3 2515 2737 1157 +3 2513 2515 1157 +3 1157 2737 2518 +3 2737 2516 2518 +3 1761 1759 558 +3 936 2459 769 +3 795 395 796 +3 801 2457 395 +3 1344 681 2455 +3 681 1344 767 +3 2456 2454 813 +3 2457 2456 813 +3 2456 2457 769 +3 2742 810 2741 +3 2458 1111 2453 +3 833 377 2460 +3 1880 377 833 +3 2460 832 833 +3 1304 2466 596 +3 2685 404 2684 +3 941 2685 2684 +3 771 2687 2681 +3 2687 2684 2681 +3 2684 2687 2680 +3 596 2466 1182 +3 1793 2407 2467 +3 1019 849 2467 +3 1182 2465 2464 +3 849 1793 2467 +3 1793 849 1792 +3 2466 2465 1182 +3 2466 765 2465 +3 2407 1020 2467 +3 2584 2583 16 +3 7 2468 13 +3 13 2468 1918 +3 2471 1819 1817 +3 1954 1579 2571 +3 245 83 949 +3 2571 1953 1954 +3 2471 1823 1819 +3 2473 2472 1817 +3 1221 1815 1223 +3 932 174 1210 +3 2473 1817 1223 +3 2475 1222 726 +3 2621 2620 9 +3 2475 726 1816 +3 1112 2476 1113 +3 2745 2274 1043 +3 2744 2745 1044 +3 863 2255 2479 +3 2482 1048 2483 +3 854 2490 2487 +3 2477 2478 1026 +3 1089 850 1090 +3 2484 2483 857 +3 2485 857 1021 +3 2484 857 2485 +3 1015 2485 1021 +3 1089 2487 1024 +3 2487 1089 854 +3 2254 1047 2256 +3 2488 2254 2481 +3 2482 2488 2481 +3 2482 2255 2488 +3 861 1026 1025 +3 2254 2488 1046 +3 850 2491 2492 +3 2491 850 1089 +3 850 2492 1014 +3 1755 1873 2494 +3 2713 2714 1192 +3 1758 2728 2729 +3 2496 1873 1764 +3 2496 2494 1873 +3 1773 2496 1764 +3 1773 1763 2496 +3 1763 2494 2496 +3 1151 369 44 +3 1970 295 885 +3 887 295 1970 +3 351 295 887 +3 1393 2500 2499 +3 2499 2500 1388 +3 1969 1970 885 +3 2305 2500 1393 +3 426 1395 2502 +3 1408 1389 2506 +3 2506 1389 1400 +3 1405 1408 2506 +3 2500 1392 2504 +3 2500 2504 1388 +3 2504 1400 1388 +3 2504 2505 1400 +3 2504 1392 2505 +3 1659 2676 855 +3 158 128 131 +3 263 1319 2382 +3 2527 2526 238 +3 2338 2511 2339 +3 706 2517 1612 +3 244 247 2738 +3 827 1107 1106 +3 244 2738 41 +3 41 1979 244 +3 1612 2515 2514 +3 2515 2513 2514 +3 947 247 244 +3 2516 2519 2518 +3 2518 2519 2341 +3 2522 1608 703 +3 709 1608 1609 +3 1608 1606 2520 +3 1156 2521 3 +3 705 669 706 +3 2517 2522 703 +3 1872 99 2523 +3 29 98 2525 +3 98 29 100 +3 337 2539 1725 +3 249 2525 99 +3 249 29 2525 +3 60 1872 2526 +3 238 2528 2527 +3 2528 239 2527 +3 238 2526 2523 +3 2526 1872 2523 +3 160 2532 2533 +3 160 2529 2532 +3 67 248 241 +3 2531 63 2530 +3 2529 239 2528 +3 160 62 2530 +3 160 2530 2529 +3 2530 63 2529 +3 248 249 99 +3 67 249 248 +3 2532 2528 238 +3 159 2532 238 +3 2531 62 43 +3 1951 2531 43 +3 1661 31 2434 +3 62 2531 2530 +3 2533 2534 160 +3 2534 2533 15 +3 15 42 2534 +3 2537 1078 698 +3 828 2537 698 +3 2549 2209 143 +3 573 1632 1131 +3 2538 690 567 +3 2540 337 1727 +3 1715 317 1722 +3 2545 2546 1714 +3 2543 2546 86 +3 2546 2543 2547 +3 1715 2539 2548 +3 333 1727 1726 +3 86 2542 2543 +3 335 336 2543 +3 2544 1715 2548 +3 2544 2545 1715 +3 1714 2546 2547 +3 1317 206 1316 +3 418 140 787 +3 1711 1713 318 +3 1317 1714 2547 +3 2547 1318 1317 +3 1318 2547 336 +3 336 2547 2543 +3 418 787 112 +3 418 112 1451 +3 1451 112 2126 +3 2550 495 476 +3 1448 1447 141 +3 2213 2557 2214 +3 1087 2552 2438 +3 236 2657 2656 +3 830 236 2656 +3 2557 2213 2212 +3 2214 783 2213 +3 2215 2555 781 +3 2222 393 804 +3 1922 1917 12 +3 1533 1531 2561 +3 2561 1531 2560 +3 2560 1531 1551 +3 1531 1548 1551 +3 2561 1535 1533 +3 2563 828 698 +3 2565 1420 1119 +3 2565 2566 1425 +3 1456 1425 2566 +3 1456 1426 1425 +3 2568 2567 1424 +3 2565 1119 2566 +3 1681 2567 1119 +3 2566 1119 2567 +3 1421 2565 1425 +3 1456 2566 2567 +3 301 299 300 +3 2570 1418 1419 +3 2470 420 1455 +3 2570 2569 1418 +3 2575 244 1979 +3 2572 1953 2571 +3 2573 1579 1956 +3 244 243 245 +3 2575 243 244 +3 2573 1956 243 +3 1952 2574 246 +3 2574 2573 246 +3 536 534 960 +3 2592 1572 1577 +3 1575 492 2585 +3 2577 2579 1557 +3 958 535 952 +3 1556 2580 1558 +3 2577 1557 2578 +3 2587 2588 2589 +3 2588 1562 2589 +3 77 538 227 +3 838 77 227 +3 2580 501 2581 +3 2584 2578 1557 +3 2584 2585 2578 +3 501 484 2581 +3 2578 2585 489 +3 2591 1577 2583 +3 2587 2586 490 +3 2587 2590 2586 +3 1932 2594 1931 +3 2582 1556 2591 +3 1560 501 1559 +3 1560 1559 2576 +3 2588 2587 490 +3 2587 1561 2590 +3 1561 1974 2590 +3 1561 1563 1974 +3 1749 1563 1561 +3 1557 2582 2593 +3 2594 1933 283 +3 2591 2592 1577 +3 1556 2592 2591 +3 2592 1556 1572 +3 2595 1397 10 +3 2596 2595 10 +3 1413 2596 10 +3 10 2507 1413 +3 2507 1412 1413 +3 427 1397 2598 +3 571 2601 2600 +3 1623 1622 2599 +3 1629 1623 2599 +3 571 2600 2602 +3 594 1625 1624 +3 2600 1630 1629 +3 694 695 567 +3 384 2609 2606 +3 2610 2606 1619 +3 2604 2602 695 +3 2605 2603 2604 +3 2602 2599 695 +3 2602 2600 2599 +3 1629 2599 2600 +3 2604 694 2605 +3 2610 1619 563 +3 2603 2605 566 +3 384 789 788 +3 2608 2609 571 +3 2608 571 2607 +3 384 2606 2610 +3 2607 2604 2603 +3 2608 2607 2603 +3 384 788 2609 +3 1135 385 1134 +3 1179 1134 598 +3 2611 92 790 +3 831 472 2651 +3 2614 1457 1427 +3 208 1703 1702 +3 2618 2619 2617 +3 2123 2625 371 +3 193 31 2618 +3 193 2618 2617 +3 2620 18 2619 +3 1866 2624 189 +3 2622 2621 9 +3 1665 1708 2622 +3 1708 188 2622 +3 2620 187 1865 +3 1665 2622 9 +3 979 978 35 +3 2621 2623 187 +3 2620 2621 187 +3 1708 1709 188 +3 2624 1865 189 +3 2114 2115 349 +3 2626 2627 371 +3 137 2114 2626 +3 350 44 2627 +3 351 44 350 +3 590 773 621 +3 2630 2629 2448 +3 2630 620 2629 +3 2630 619 620 +3 1510 1512 1506 +3 771 2678 2679 +3 771 2634 2678 +3 545 2632 1489 +3 1490 2632 545 +3 2682 2681 404 +3 1417 453 2690 +3 2681 2636 771 +3 452 2635 547 +3 547 2635 548 +3 544 770 1490 +3 1815 1221 2638 +3 2638 1221 711 +3 711 1222 2638 +3 1815 1222 2475 +3 1815 2638 1222 +3 2639 673 1802 +3 673 1803 1802 +3 678 1799 1798 +3 678 1376 2641 +3 1373 584 2641 +3 2605 2647 566 +3 1175 593 1176 +3 639 2640 745 +3 498 1576 1550 +3 783 815 784 +3 1576 498 500 +3 383 789 790 +3 1992 1990 685 +3 2643 564 2648 +3 1621 2646 2642 +3 1992 685 2648 +3 564 1705 2648 +3 2735 2731 2200 +3 1619 2603 2650 +3 2650 2603 566 +3 566 2649 2650 +3 384 2611 790 +3 384 2610 2611 +3 1618 2650 2649 +3 2649 1621 1618 +3 1626 569 565 +3 1104 2652 1101 +3 2731 2735 2199 +3 1937 1099 1938 +3 1101 2652 944 +3 2657 236 2105 +3 818 2655 2654 +3 2370 365 2658 +3 362 2370 2658 +3 53 2658 1253 +3 358 1253 1252 +3 1253 365 1252 +3 365 1253 2658 +3 853 962 2660 +3 1038 2661 852 +3 1038 2272 2661 +3 891 890 2663 +3 891 315 890 +3 139 2671 354 +3 2666 109 891 +3 2665 2668 2669 +3 882 138 2674 +3 2665 293 2668 +3 2665 22 293 +3 354 2670 884 +3 2665 2671 22 +3 2667 297 109 +3 2674 884 2673 +3 2673 883 2674 +3 1485 22 2671 +3 350 138 882 +3 2675 2674 883 +3 885 2675 883 +3 295 2675 885 +3 2677 1754 1753 +3 1765 2677 1753 +3 2677 1765 505 +3 421 430 422 +3 2688 1424 423 +3 507 1751 1750 +3 513 1339 1338 +3 2690 453 2691 +3 2685 825 2686 +3 1780 2726 2314 +3 941 2680 397 +3 2682 2636 2681 +3 403 941 939 +3 2680 2687 771 +3 2683 401 1419 +3 401 824 1419 +3 1775 1760 2721 +3 2686 2683 404 +3 2685 2686 404 +3 478 1433 1642 +3 825 401 2686 +3 184 1419 2690 +3 2690 1419 2689 +3 1415 2694 1414 +3 1414 2694 1403 +3 1415 2693 2694 +3 2693 1415 1416 +3 2693 423 2694 +3 1681 1403 2694 +3 739 741 302 +3 14 299 301 +3 1001 2373 154 +3 301 300 146 +3 525 2704 2705 +3 2707 2706 523 +3 232 2706 2707 +3 2710 178 1867 +3 518 178 2710 +3 2708 508 232 +3 2708 232 2707 +3 95 2717 267 +3 2717 95 1152 +3 2716 559 1190 +3 1191 2712 2716 +3 923 2723 2724 +3 2728 1758 923 +3 2724 2722 1690 +3 1762 557 2730 +3 1759 2730 2729 +3 2516 2737 2515 +3 2174 2733 2732 +3 991 2733 2174 +3 2733 991 2734 +3 2734 1096 1941 +3 2203 2736 2732 +3 2731 2732 2736 +3 373 2739 1454 +3 2741 810 812 +3 811 810 2743 +3 1683 1569 2746 +3 1026 861 2744 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data/w_horizontal_hole.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/w_horizontal_hole.off new file mode 100644 index 00000000000..3de92a15ff0 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/w_horizontal_hole.off @@ -0,0 +1,110 @@ +OFF +54 54 0 +519 0 100 +734 -817 0 +734 -817 100 +775 -636 0 +775 -636 100 +944 0 0 +944 0 100 +1131 0 0 +1131 0 100 +1463 -1062 0 +1463 -1062 100 +1288 -1062 0 +1288 -1062 100 +1106 -448 0 +1106 -448 100 +1045 -243 0 +1045 -243 100 +992 -446 0 +992 -446 100 +833 -1062 0 +833 -1062 100 +648 -1062 0 +648 -1062 100 +479 -440 0 +479 -440 100 +468 -400 0 +468 -400 100 +459 -366 0 +459 -366 100 +451 -334 0 +451 -334 100 +445 -307 0 +445 -307 100 +439 -284 0 +439 -284 100 +434 -263 0 +434 -263 100 +430 -247 0 +430 -247 100 +426 -234 0 +426 -234 100 +424 -225 0 +424 -225 100 +424 -221 0 +424 -221 100 +361 -449 0 +361 -449 100 +192 -1062 0 +192 -1062 100 +6 -1062 0 +6 -1062 100 +331 0 0 +331 0 100 +519 0 0 +3 2 1 0 +3 53 0 1 +3 4 3 2 +3 1 2 3 +3 6 5 4 +3 3 4 5 +3 8 7 6 +3 5 6 7 +3 10 9 8 +3 7 8 9 +3 12 11 10 +3 9 10 11 +3 14 13 12 +3 11 12 13 +3 16 15 14 +3 13 14 15 +3 18 17 16 +3 15 16 17 +3 20 19 18 +3 17 18 19 +3 22 21 20 +3 19 20 21 +3 24 23 22 +3 21 22 23 +3 26 25 24 +3 23 24 25 +3 28 27 26 +3 25 26 27 +3 30 29 28 +3 27 28 29 +3 32 31 30 +3 29 30 31 +3 34 33 32 +3 31 32 33 +3 36 35 34 +3 33 34 35 +3 38 37 36 +3 35 36 37 +3 40 39 38 +3 37 38 39 +3 42 41 40 +3 39 40 41 +3 44 43 42 +3 41 42 43 +3 46 45 44 +3 43 44 45 +3 48 47 46 +3 45 46 47 +3 50 49 48 +3 47 48 49 +3 52 51 50 +3 49 50 51 +3 0 53 52 +3 51 52 53 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data/w_orthogonal_hole.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/w_orthogonal_hole.off new file mode 100644 index 00000000000..e96ace9a51a --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/w_orthogonal_hole.off @@ -0,0 +1,156 @@ +OFF +54 100 0 +519 0 100 +734 -817 0 +734 -817 100 +775 -636 0 +775 -636 100 +944 0 0 +944 0 100 +1131 0 0 +1131 0 100 +1463 -1062 0 +1463 -1062 100 +1288 -1062 0 +1288 -1062 100 +1106 -448 0 +1106 -448 100 +1045 -243 0 +1045 -243 100 +992 -446 0 +992 -446 100 +833 -1062 0 +833 -1062 100 +648 -1062 0 +648 -1062 100 +479 -440 0 +479 -440 100 +468 -400 0 +468 -400 100 +459 -366 0 +459 -366 100 +451 -334 0 +451 -334 100 +445 -307 0 +445 -307 100 +439 -284 0 +439 -284 100 +434 -263 0 +434 -263 100 +430 -247 0 +430 -247 100 +426 -234 0 +426 -234 100 +424 -225 0 +424 -225 100 +424 -221 0 +424 -221 100 +361 -449 0 +361 -449 100 +192 -1062 0 +192 -1062 100 +6 -1062 0 +6 -1062 100 +331 0 0 +331 0 100 +519 0 0 +3 2 1 0 +3 53 0 1 +3 4 3 2 +3 1 2 3 +3 6 5 4 +3 3 4 5 +3 8 7 6 +3 5 6 7 +3 12 11 10 +3 9 10 11 +3 16 15 14 +3 13 14 15 +3 18 17 16 +3 15 16 17 +3 20 19 18 +3 17 18 19 +3 22 21 20 +3 19 20 21 +3 24 23 22 +3 21 22 23 +3 26 25 24 +3 23 24 25 +3 28 27 26 +3 25 26 27 +3 30 29 28 +3 27 28 29 +3 32 31 30 +3 29 30 31 +3 34 33 32 +3 31 32 33 +3 36 35 34 +3 33 34 35 +3 38 37 36 +3 35 36 37 +3 40 39 38 +3 37 38 39 +3 42 41 40 +3 39 40 41 +3 44 43 42 +3 41 42 43 +3 46 45 44 +3 43 44 45 +3 48 47 46 +3 45 46 47 +3 50 49 48 +3 47 48 49 +3 52 51 50 +3 49 50 51 +3 0 53 52 +3 51 52 53 +3 50 48 46 +3 36 34 0 +3 52 44 0 +3 52 50 46 +3 38 36 0 +3 52 46 44 +3 44 42 40 +3 44 40 38 +3 44 38 0 +3 24 2 0 +3 26 24 0 +3 28 26 0 +3 30 28 0 +3 18 4 20 +3 32 30 0 +3 2 22 20 +3 14 10 8 +3 12 10 14 +3 14 8 16 +3 16 8 6 +3 24 22 2 +3 4 2 20 +3 16 6 18 +3 18 6 4 +3 34 32 0 +3 21 23 1 +3 11 13 9 +3 19 21 1 +3 17 5 15 +3 13 7 9 +3 5 7 15 +3 15 7 13 +3 3 5 17 +3 3 17 19 +3 1 3 19 +3 37 53 35 +3 35 53 33 +3 39 41 43 +3 39 43 37 +3 51 53 43 +3 43 53 37 +3 49 51 45 +3 49 45 47 +3 51 43 45 +3 33 53 31 +3 31 53 29 +3 29 53 27 +3 27 53 25 +3 25 53 23 +3 23 53 1 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_stitching/folded_cycle.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_stitching/folded_cycle.off new file mode 100644 index 00000000000..f2a40878de9 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_stitching/folded_cycle.off @@ -0,0 +1,59 @@ +# Output of a CGAL tool +#CBP +# polyhedral_surface 0 +# halfedges 0 +# triangulated 0 +# non_empty_facets 0 +# terrain 0 +# normalized_to_sphere 0 +# radius 0 +# rounded 0 +# rounded_bits 0 +# ENDCBP + +NOFF +16 16 0 + +# 16 vertices +# ------------------------------------------ + + +-21.8983 -6.38823 63.7562 0.521628 -0.428916 0.73752 +-21.9152 -6.40483 63.7541 0.42945 -0.529738 0.731403 +-21.9057 -6.32693 63.7553 0.99181 0.00120314 0.127719 +-21.8832 -6.80033 63.7582 0.126127 6.70899e-05 -0.992014 +-21.9216 -6.40893 63.551 0.67402 -0.738711 -0.00201436 +-21.9075 -6.25023 63.7552 -0.995002 -0.0234773 -0.0970594 +-21.8983 -6.38823 63.7562 0.117647 -0.000135467 -0.993055 +-21.9021 -6.75613 63.7558 0.117647 -0.000135467 -0.993055 +-21.9057 -6.32693 63.7553 -0.0977085 -0.99516 -0.010509 +-21.8752 -6.32923 63.7592 -0.126943 -0.00144678 0.991909 +-21.9611 -6.89043 63.7501 0.0910592 0.000407086 -0.995845 +-21.9418 -6.23043 63.7515 -0.109893 -0.00197042 0.993942 +-21.927 -6.32803 63.7529 -0.111856 -0.00218345 0.993722 +-21.9001 -6.39073 63.5534 0.765209 -0.643781 0.00114436 +-21.8874 -6.29763 63.7577 0.341741 -0.938826 0.0426494 +-21.882 -6.36043 63.7583 0.551822 -0.379642 0.742539 + +# 16 facets +# ------------------------------------------ + +3 0 4 13 +3 15 0 13 +3 8 10 5 +3 8 1 0 +3 6 2 14 +3 9 14 2 +3 6 7 10 +3 1 4 0 +3 7 6 14 +3 1 8 12 +3 0 15 2 +3 15 9 2 +3 5 11 8 +3 3 7 14 +3 6 10 8 +3 8 11 12 + + +# End of OFF # diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/pmp_compute_normals_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/pmp_compute_normals_test.cpp index a243df48db2..311b483fd38 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/pmp_compute_normals_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/pmp_compute_normals_test.cpp @@ -93,7 +93,7 @@ void test(const Mesh& mesh, #endif // Check sanity of output - for(const face_descriptor f : faces(mesh)) + for(face_descriptor f : faces(mesh)) { // tests on non triangular meshes are @todo if(CGAL::is_triangle(halfedge(f, mesh), mesh)) @@ -105,7 +105,7 @@ void test(const Mesh& mesh, } } - for(const vertex_descriptor v : vertices(mesh)) + for(vertex_descriptor v : vertices(mesh)) { if(get(vnormals, v) == CGAL::NULL_VECTOR) { diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_autorefinement.cmd b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_autorefinement.cmd index 1b1ab1b4a1d..45c370f1f49 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_autorefinement.cmd +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_autorefinement.cmd @@ -6,11 +6,11 @@ data-autoref/test_05.off 1 5 17 1 0 0 data-autoref/test_06.off 3 55 141 1 76 0 data-autoref/test_07.off 1 4 10 1 4 0 data-autoref/test_08.off 1 31 87 1 52 0 -data-autoref/test_09.off 1 4 5 1 5 0 +data-autoref/test_09.off 1 4 5 1 4 0 data-autoref/test_10.off 1 3 13 0 13 0 data-autoref/test_11.off 1 3 12 1 5 0 data-autoref/test_12.off 2 2 11 1 11 0 -data-autoref/test_13.off 1 5 16 0 16 0 +data-autoref/test_13.off 1 5 16 1 8 0 data-autoref/test_14.off 1 5 16 1 12 0 data-autoref/test_15.off 3 8 16 1 12 0 data-autoref/test_16.off 1 2 6 1 4 0 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_is_polygon_soup_a_polygon_mesh.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_is_polygon_soup_a_polygon_mesh.cpp index 7fca90f43ec..c6e889e008f 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_is_polygon_soup_a_polygon_mesh.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_is_polygon_soup_a_polygon_mesh.cpp @@ -75,7 +75,7 @@ void test_polygon_soup(std::string fname, bool expected) assert(!CGAL::is_empty(p) && CGAL::is_valid_polygon_mesh(p)); std::set ppts; - for(const vertex_descriptor v : vertices(p)) + for( vertex_descriptor v : vertices(p)) ppts.insert(get(vpm, v)); assert(ppts.size() == num_vertices(p)); diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_stitching.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_stitching.cpp index 7ae4b674f9a..049ad81c971 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_stitching.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_stitching.cpp @@ -73,6 +73,7 @@ void test_stitch_boundary_cycles() test_stitch_boundary_cycles("data_stitching/boundary_cycle.off", 4); test_stitch_boundary_cycles("data_stitching/boundary_cycle_2.off", 2); test_stitch_boundary_cycles("data_stitching/complex_hole.off", 3); + test_stitch_boundary_cycles("data_stitching/folded_cycle.off", 2); } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -119,9 +120,9 @@ void test_stitch_borders(const char* fname, typedef PMP::internal::Halfedges_keeper_with_marked_edge_priority Keeper; Marked_edges marks = get(Edge_property_tag(), mesh); - int id = 0; + int eid = 0; for(edge_descriptor e : edges(mesh)) - put(marks, e, (unconstrained_edge_ids.count(id++) == 0)); + put(marks, e, (unconstrained_edge_ids.count(eid++) == 0)); Keeper kpr(marks, mesh); @@ -208,7 +209,6 @@ void test_degenerate() CGAL::make_triangle(Point(0,0,0), Point(1,0,0), Point(0,1,0), tm); std::size_t res = CGAL::Polygon_mesh_processing::stitch_borders(tm); - std::cout << "Stitched: " << res << std::endl; assert(res == 0); } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_Polyhedron_3_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_Polyhedron_3_test.cpp index bc730a339fb..fd8e8448a7b 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_Polyhedron_3_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_Polyhedron_3_test.cpp @@ -95,7 +95,7 @@ CGAL::internal::Weight_min_max_dihedral_and_area } -void test_triangulate_hole_weight(const char* file_name, bool use_DT, std::size_t nb_remaining_holes) { +void test_triangulate_hole_weight(const char* file_name, bool use_DT, std::size_t nb_remaining_holes) { //don't test with cdt as we are testing the weights and there is no weight in the cdt version typedef CGAL::internal::Weight_min_max_dihedral_and_area Weight; std::cout << "test_triangulate_hole_weight + useDT: " << use_DT << std::endl; @@ -107,7 +107,7 @@ void test_triangulate_hole_weight(const char* file_name, bool use_DT, std::size_ for(std::vector::iterator it = border_reps.begin(); it != border_reps.end(); ++it) { std::vector patch; Weight w_algo = CGAL::Polygon_mesh_processing::internal::triangulate_hole_polygon_mesh( - poly, *it, back_inserter(patch), get(CGAL::vertex_point, poly), use_DT, Kernel()).second; + poly, *it, back_inserter(patch), get(CGAL::vertex_point, poly), use_DT, Kernel(), false, 0).second; if(patch.empty()) { continue; } Weight w_test = calculate_weight_for_patch(poly, patch.begin(), patch.end()); @@ -127,7 +127,7 @@ void test_triangulate_hole_weight(const char* file_name, bool use_DT, std::size_ } /******************************************************************/ -void test_triangulate_hole(const char* file_name) { +void test_triangulate_hole(const char* file_name, bool use_cdt) { std::cout << "test_triangulate_hole:" << std::endl; std::cout << " File: "<< file_name << std::endl; Polyhedron poly; @@ -136,7 +136,8 @@ void test_triangulate_hole(const char* file_name) { for(std::vector::iterator it = border_reps.begin(); it != border_reps.end(); ++it) { std::vector patch; - CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it, back_inserter(patch)); + CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it, back_inserter(patch), + CGAL::parameters::use_2d_constrained_delaunay_triangulation(use_cdt)); if(patch.empty()) { std::cerr << " Error: empty patch created." << std::endl; assert(false); @@ -151,7 +152,7 @@ void test_triangulate_hole(const char* file_name) { std::cout << " Done!" << std::endl; } -void test_triangulate_hole_should_be_no_output(const char* file_name) { +void test_triangulate_hole_should_be_no_output(const char* file_name, bool use_cdt) { std::cout << "test_triangulate_hole_should_be_no_output:" << std::endl; std::cout << " File: "<< file_name << std::endl; Polyhedron poly; @@ -161,7 +162,8 @@ void test_triangulate_hole_should_be_no_output(const char* file_name) { for(std::vector::iterator it = border_reps.begin(); it != border_reps.end(); ++it) { std::vector patch; CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it, back_inserter(patch), - CGAL::Polygon_mesh_processing::parameters::use_delaunay_triangulation(false)); + CGAL::Polygon_mesh_processing::parameters::use_delaunay_triangulation(false) + .use_2d_constrained_delaunay_triangulation(use_cdt)); if(!patch.empty()) { std::cerr << " Error: patch should be empty" << std::endl; assert(false); @@ -178,7 +180,7 @@ void test_triangulate_hole_should_be_no_output(const char* file_name) { std::cout << " Done!" << std::endl; } -void test_triangulate_and_refine_hole(const char* file_name) { +void test_triangulate_and_refine_hole(const char* file_name, bool use_cdt) { std::cout << "test_triangulate_and_refine_hole:" << std::endl; std::cout << " File: "<< file_name << std::endl; Polyhedron poly; @@ -189,7 +191,8 @@ void test_triangulate_and_refine_hole(const char* file_name) { std::vector patch_facets; std::vector patch_vertices; CGAL::Polygon_mesh_processing::triangulate_and_refine_hole(poly, *it, - back_inserter(patch_facets), back_inserter(patch_vertices)); + back_inserter(patch_facets), back_inserter(patch_vertices), + CGAL::parameters::use_2d_constrained_delaunay_triangulation(use_cdt)); if(patch_facets.empty()) { std::cerr << " Error: empty patch created." << std::endl; @@ -205,7 +208,7 @@ void test_triangulate_and_refine_hole(const char* file_name) { std::cout << " Done!" << std::endl; } -void test_triangulate_refine_and_fair_hole(const char* file_name) { +void test_triangulate_refine_and_fair_hole(const char* file_name, bool use_cdt) { std::cout << "test_triangulate_refine_and_fair_hole:" << std::endl; std::cout << " File: "<< file_name << std::endl; Polyhedron poly; @@ -216,7 +219,8 @@ void test_triangulate_refine_and_fair_hole(const char* file_name) { std::vector patch_facets; std::vector patch_vertices; CGAL::Polygon_mesh_processing::triangulate_refine_and_fair_hole(poly, - *it, back_inserter(patch_facets), back_inserter(patch_vertices)); + *it, back_inserter(patch_facets), back_inserter(patch_vertices), + CGAL::parameters::use_2d_constrained_delaunay_triangulation(use_cdt)); if(patch_facets.empty()) { std::cerr << " Error: empty patch created." << std::endl; @@ -232,7 +236,7 @@ void test_triangulate_refine_and_fair_hole(const char* file_name) { std::cout << " Done!" << std::endl; } -void test_ouput_iterators_triangulate_hole(const char* file_name) { +void test_ouput_iterators_triangulate_hole(const char* file_name, bool use_cdt) { std::cout << "test_ouput_iterators_triangulate_hole:" << std::endl; std::cout << " File: "<< file_name << std::endl; @@ -245,7 +249,8 @@ void test_ouput_iterators_triangulate_hole(const char* file_name) { std::vector::iterator it_2 = border_reps_2.begin(); for(std::vector::iterator it = border_reps.begin(); it != border_reps.end(); ++it, ++it_2) { std::vector patch; - CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it, back_inserter(patch)); + CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it, back_inserter(patch), + CGAL::parameters::use_2d_constrained_delaunay_triangulation(use_cdt)); std::vector patch_2 = patch; Facet_handle* output_it = @@ -254,13 +259,14 @@ void test_ouput_iterators_triangulate_hole(const char* file_name) { if(patch.size() != (std::size_t)(output_it - &*patch_2.begin())) { std::cerr << " Error: returned facet output iterator is not valid!" << std::endl; std::cerr << " " << patch.size() << " vs " << (output_it - &*patch_2.begin()) << std::endl; + assert(false); } } std::cout << " Done!" << std::endl; } -void test_ouput_iterators_triangulate_and_refine_hole(const char* file_name) { +void test_ouput_iterators_triangulate_and_refine_hole(const char* file_name, bool use_cdt) { std::cout << "test_ouput_iterators_triangulate_and_refine_hole:" << std::endl; std::cout << " File: "<< file_name << std::endl; @@ -275,7 +281,8 @@ void test_ouput_iterators_triangulate_and_refine_hole(const char* file_name) { std::vector patch_facets; std::vector patch_vertices; CGAL::Polygon_mesh_processing::triangulate_and_refine_hole(poly, - *it, back_inserter(patch_facets), back_inserter(patch_vertices)); + *it, back_inserter(patch_facets), back_inserter(patch_vertices), + CGAL::parameters::use_2d_constrained_delaunay_triangulation(use_cdt)); // create enough space to hold outputs std::vector patch_facets_2 = patch_facets; std::vector patch_vertices_2 = patch_vertices; @@ -283,7 +290,8 @@ void test_ouput_iterators_triangulate_and_refine_hole(const char* file_name) { std::pair output_its = CGAL::Polygon_mesh_processing::triangulate_and_refine_hole(poly_2, - *it_2, &*patch_facets_2.begin(), &*patch_vertices_2.begin()); + *it_2, &*patch_facets_2.begin(), &*patch_vertices_2.begin(), + CGAL::parameters::use_2d_constrained_delaunay_triangulation(use_cdt)); if(patch_facets.size() != (std::size_t) (output_its.first - &*patch_facets_2.begin())) { std::cout << " Error: returned facet output iterator is not valid!" << std::endl; @@ -320,7 +328,7 @@ void test_triangulate_refine_and_fair_hole_compile() { (poly, border_reps[0], back_inserter(patch_facets), back_inserter(patch_vertices), CGAL::Polygon_mesh_processing::parameters::weight_calculator( CGAL::internal::Uniform_weight_fairing(poly)). - sparse_linear_solver(Default_solver())); + sparse_linear_solver(Default_solver()).use_2d_constrained_delaunay_triangulation(false)); // default solver read_poly_with_borders("elephant_quad_hole.off", poly, border_reps); @@ -361,26 +369,30 @@ int main() std::cerr.precision(17); generate_elephant_with_hole(); - std::vector input_files; input_files.push_back("elephant_triangle_hole.off"); input_files.push_back("elephant_quad_hole.off"); input_files.push_back("data/mech-holes-shark.off"); - - for(std::vector::iterator it = input_files.begin(); it != input_files.end(); ++it) - { - test_triangulate_hole(it->c_str()); - test_triangulate_and_refine_hole(it->c_str()); - test_triangulate_refine_and_fair_hole(it->c_str()); - test_ouput_iterators_triangulate_and_refine_hole(it->c_str()); - test_ouput_iterators_triangulate_hole(it->c_str()); + // std::cerr.precision(15); + for(std::vector::iterator it = input_files.begin(); it != input_files.end(); ++it) { + test_triangulate_hole(it->c_str(), true); + test_triangulate_hole(it->c_str(), false); + test_triangulate_and_refine_hole(it->c_str(), true); + test_triangulate_and_refine_hole(it->c_str(), false); + test_triangulate_refine_and_fair_hole(it->c_str(), true); + test_triangulate_refine_and_fair_hole(it->c_str(), false); + test_ouput_iterators_triangulate_and_refine_hole(it->c_str(), true); + test_ouput_iterators_triangulate_and_refine_hole(it->c_str(), false); + test_ouput_iterators_triangulate_hole(it->c_str(), true); + test_ouput_iterators_triangulate_hole(it->c_str(), false); test_triangulate_hole_weight(it->c_str(), true, 0); test_triangulate_hole_weight(it->c_str(), false, 0); std::cout << "------------------------------------------------" << std::endl; } - - test_triangulate_hole_should_be_no_output("data/non_manifold_vertex.off"); - test_triangulate_hole_should_be_no_output("data/two_tris_collinear.off"); + test_triangulate_hole_should_be_no_output("data/non_manifold_vertex.off", true); + test_triangulate_hole_should_be_no_output("data/non_manifold_vertex.off", false); + test_triangulate_hole_should_be_no_output("data/two_tris_collinear.off", true); + test_triangulate_hole_should_be_no_output("data/two_tris_collinear.off", false); test_triangulate_refine_and_fair_hole_compile(); std::cout << "All Done!" << std::endl; diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_polyline_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_polyline_test.cpp index 85af1d83e5c..a3243deb085 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_polyline_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_polyline_test.cpp @@ -150,7 +150,8 @@ void test_1(const char* file_name, bool use_DT, bool save_output) { std::vector > tris; CGAL::Polygon_mesh_processing::triangulate_hole_polyline( points, std::back_inserter(tris), - CGAL::Polygon_mesh_processing::parameters::use_delaunay_triangulation(use_DT)); + CGAL::Polygon_mesh_processing::parameters::use_delaunay_triangulation(use_DT) + .use_2d_constrained_delaunay_triangulation(true)); check_triangles(points, tris); check_constructed_polyhedron(file_name, &tris, &points, save_output); @@ -168,7 +169,8 @@ void test_2(const char* file_name, bool use_DT, bool save_output) { std::vector > tris; CGAL::Polygon_mesh_processing::triangulate_hole_polyline( points, extras, std::back_inserter(tris), - CGAL::Polygon_mesh_processing::parameters::use_delaunay_triangulation(use_DT)); + CGAL::Polygon_mesh_processing::parameters::use_delaunay_triangulation(use_DT) + .use_2d_constrained_delaunay_triangulation(true)); check_triangles(points, tris); check_constructed_polyhedron(file_name, &tris, &points, save_output); @@ -185,7 +187,8 @@ void test_should_be_no_output(const char* file_name, bool use_DT) { std::vector > tris; CGAL::Polygon_mesh_processing::triangulate_hole_polyline( points, std::back_inserter(tris), - CGAL::Polygon_mesh_processing::parameters::use_delaunay_triangulation(use_DT)); + CGAL::Polygon_mesh_processing::parameters::use_delaunay_triangulation(use_DT) + .use_2d_constrained_delaunay_triangulation(true)); if(!tris.empty()) { std::cerr << " Error: patch should be empty" << std::endl; diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_with_cdt_2_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_with_cdt_2_test.cpp new file mode 100644 index 00000000000..3a22ddec348 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_hole_with_cdt_2_test.cpp @@ -0,0 +1,175 @@ +#include +#include +#include +#include +#include + +#define CGAL_NO_CDT_2_WARNING + +#include +#include +#include +#include +#include +#include + +template< +class PolygonMesh, +class Halfedge_handle> +void detect_borders( + PolygonMesh& pmesh, + std::vector& borders) { + + typedef CGAL::Halfedge_around_face_circulator + Halfedge_around_facet_circulator; + + borders.clear(); + std::set border_map; + for (Halfedge_handle h : halfedges(pmesh)) { + if ( + face(h, pmesh) == boost::graph_traits::null_face() && + border_map.find(h) == border_map.end()) { + + borders.push_back(h); + Halfedge_around_facet_circulator hf_around_facet(h, pmesh); + Halfedge_around_facet_circulator done(hf_around_facet); + + do { + assert(border_map.insert(*hf_around_facet).second); // is insertion ok? + } while (++hf_around_facet != done); + } + } +} + +// This test is inspired by the issue: https://github.com/CGAL/cgal/issues/4464. +template< +typename PolygonMesh, +typename GeomTraits> +void test_triangulate_hole_with_cdt_2( + const std::string kernel_name, + int argc, char **argv, + const std::string file_name, + const std::size_t num_borders, + const std::size_t num_patch_faces, + const bool verbose) { + + typedef typename boost::graph_traits::face_descriptor Face_handle; + typedef typename boost::graph_traits::halfedge_descriptor Halfedge_handle; + + // Reading the file. + if (verbose) { + std::cout << "test with the " << kernel_name << " kernel:" << std::endl; + } + PolygonMesh pmesh; + std::string path = "data/" + file_name + ".off"; + std::ifstream in(path.c_str(), std::ios_base::in); + CGAL::set_ascii_mode(in); + CGAL::read_OFF(in, pmesh); + in.close(); + if (verbose) { + std::cout << "* finished reading the file" << std::endl; + } + + // Detecting the hole borders. + std::vector borders; + detect_borders(pmesh, borders); + if (verbose) { + std::cout << "* number of detected borders: " << + borders.size() << std::endl; + } + assert(borders.size() == num_borders); + + // Triangulating the holes. + std::vector patch_faces; + for (const Halfedge_handle& h : borders) { + patch_faces.clear(); + CGAL::Polygon_mesh_processing::triangulate_hole( + pmesh, + h, + std::back_inserter(patch_faces), + CGAL::Polygon_mesh_processing::parameters::vertex_point_map( + get(CGAL::vertex_point, pmesh)). + use_2d_constrained_delaunay_triangulation(true). + geom_traits(GeomTraits())); + + if (verbose) { + std::cout << "* number of faces in the constructed patch: " << + patch_faces.size() << std::endl; + } + assert(patch_faces.size() == num_patch_faces); + } + assert(pmesh.is_valid() && is_closed(pmesh)); + assert(CGAL::Polygon_mesh_processing::is_outward_oriented(pmesh, + CGAL::parameters::all_default())); + + // Writing the file. + if (verbose) { + path = ""; + if (argc > 1) path = std::string(argv[1]); + path += "4464_" + file_name + ".off"; + std::ofstream out(path.c_str(), std::ios_base::out); + CGAL::set_ascii_mode(out); + CGAL::write_OFF(out, pmesh); + out.close(); + std::cout << "* finished writing the file" << std::endl; + } +} + +int main(int argc, char **argv) { + + typedef CGAL::Exact_predicates_inexact_constructions_kernel EI; + typedef CGAL::Exact_predicates_exact_constructions_kernel EE; + + typedef CGAL::Surface_mesh Surface_mesh_EI; + typedef CGAL::Polyhedron_3 Polyhedron_3_EE; + + // Checking on a data file with two planar, simple, and horizontal holes. + test_triangulate_hole_with_cdt_2( + "exact_inexact", argc, argv, "w_horizontal_hole", 2, 25, false); + test_triangulate_hole_with_cdt_2( + "exact_exact", argc, argv, "w_horizontal_hole", 2, 25, false); + std::cout << + "test_triangulate_hole_with_cdt_2: horizontal planar hole SUCCESS" << std::endl; + + // Checking on a data file with two planar, simple, and orthogonal holes. + test_triangulate_hole_with_cdt_2( + "exact_inexact", argc, argv, "w_orthogonal_hole", 2, 2, false); + test_triangulate_hole_with_cdt_2( + "exact_exact", argc, argv, "w_orthogonal_hole", 2, 2, false); + std::cout << + "test_triangulate_hole_with_cdt_2: orthogonal planar hole SUCCESS" << std::endl; + + // Checking on a data file with two planar, simple, and horizontal holes. + test_triangulate_hole_with_cdt_2( + "exact_inexact", argc, argv, "elephant_flat_hole", 1, 17, false); + test_triangulate_hole_with_cdt_2( + "exact_exact", argc, argv, "elephant_flat_hole", 1, 17, false); + std::cout << + "test_triangulate_hole_with_cdt_2: near flat hole SUCCESS" << std::endl; + + // Checking on a data file with two planar, simple, and horizontal holes. + test_triangulate_hole_with_cdt_2( + "exact_inexact", argc, argv, "elephant_concave_hole", 1, 24, false); + test_triangulate_hole_with_cdt_2( + "exact_exact", argc, argv, "elephant_concave_hole", 1, 24, false); + std::cout << + "test_triangulate_hole_with_cdt_2: concave hole SUCCESS" << std::endl; + + // Checking on a data file with one simple but not a planar hole. + test_triangulate_hole_with_cdt_2( + "exact_inexact", argc, argv, "elephant_curved_hole", 1, 19, false); + test_triangulate_hole_with_cdt_2( + "exact_exact", argc, argv, "elephant_curved_hole", 1, 19, false); + std::cout << + "test_triangulate_hole_with_cdt_2: curved hole SUCCESS" << std::endl; + + // Checking on a data file with one hole that is neither simple nor planar. + test_triangulate_hole_with_cdt_2( + "exact_inexact", argc, argv, "elephant_complex_hole", 1, 29, false); + test_triangulate_hole_with_cdt_2( + "exact_exact", argc, argv, "elephant_complex_hole", 1, 29, false); + std::cout << + "test_triangulate_hole_with_cdt_2: complex hole SUCCESS" << std::endl; + + return EXIT_SUCCESS; +} diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/CMakeLists.txt b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/CMakeLists.txt index 4a09e98674b..5fab527d439 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/CMakeLists.txt +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/CMakeLists.txt @@ -31,8 +31,8 @@ endif() include(CGAL_CreateSingleSourceCGALProgram) find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "NOTICE: This project requires Eigen 3.1 (or greater) and will not be compiled." @@ -63,7 +63,7 @@ foreach( target polyfit_example_without_input_planes polyfit_example_user_provided_planes polyfit_example_model_complexty_control polyfit_example_with_region_growing) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) if(TARGET CGAL::SCIP_support) target_link_libraries(${target} PUBLIC CGAL::SCIP_support) else() diff --git a/Polygonal_surface_reconstruction/include/CGAL/internal/hypothesis.h b/Polygonal_surface_reconstruction/include/CGAL/internal/hypothesis.h index af6a1cac0e5..ca4c3e6dca3 100644 --- a/Polygonal_surface_reconstruction/include/CGAL/internal/hypothesis.h +++ b/Polygonal_surface_reconstruction/include/CGAL/internal/hypothesis.h @@ -680,7 +680,7 @@ namespace CGAL { template void Hypothesis::compute_triplet_intersections() { triplet_intersections_.clear(); - if (supporting_planes_.size() < 4) // no closed surface will be constructed from less than 4 planes + if (supporting_planes_.size() < 4) // no closed surface will be constructed from fewer than 4 planes return; for (std::size_t i = 0; i < supporting_planes_.size(); ++i) { diff --git a/Polygonal_surface_reconstruction/test/Polygonal_surface_reconstruction/CMakeLists.txt b/Polygonal_surface_reconstruction/test/Polygonal_surface_reconstruction/CMakeLists.txt index a45c4ded258..ada1d07084c 100644 --- a/Polygonal_surface_reconstruction/test/Polygonal_surface_reconstruction/CMakeLists.txt +++ b/Polygonal_surface_reconstruction/test/Polygonal_surface_reconstruction/CMakeLists.txt @@ -31,8 +31,8 @@ endif() include(CGAL_CreateSingleSourceCGALProgram) find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "NOTICE: This project requires Eigen 3.1 (or greater) and will not be compiled." @@ -56,7 +56,7 @@ endif() create_single_source_cgal_program("polygonal_surface_reconstruction_test.cpp") target_link_libraries(polygonal_surface_reconstruction_test - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) if(TARGET CGAL::SCIP_support) target_link_libraries(polygonal_surface_reconstruction_test PUBLIC CGAL::SCIP_support) diff --git a/Polyhedron/demo/Polyhedron/CMakeLists.txt b/Polyhedron/demo/Polyhedron/CMakeLists.txt index d57be49c9e1..0bb7d129c9e 100644 --- a/Polyhedron/demo/Polyhedron/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/CMakeLists.txt @@ -1,22 +1,5 @@ -cmake_minimum_required(VERSION 3.1...3.15) -project(Polyhedron_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() -if(POLICY CMP0072) - # About the use of OpenGL - cmake_policy(SET CMP0072 NEW) -endif() - -if(POLICY CMP0074) - cmake_policy(SET CMP0074 NEW) -endif() - +cmake_minimum_required(VERSION 3.1...3.20) +project( Polyhedron_Demo ) include(FeatureSummary) # Find includes in corresponding build directories @@ -33,10 +16,6 @@ if(has_cpp11 LESS 0) return() endif() -# Use C++11 for this directory and its sub-directories. -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED TRUE) - #Defines flags to emulate windows behavior for linking error generation if(CMAKE_CXX_COMPILER_ID EQUAL Clang OR CMAKE_COMPILER_IS_GNUCC @@ -93,7 +72,7 @@ set_package_properties( PURPOSE "Requiered for the Polyhedron Edit, Parameterization, Jet fitting, Classification plugin, Surface reconstruction, Normal estimation, Smoothing, Average spacing, Feature detection, Hole Filling and Fairing plugins ." ) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) find_package(METIS) set_package_properties( @@ -234,7 +213,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) Polyhedron_demo_plugin_helper.cpp CGAL_double_edit.cpp) target_link_libraries(demo_framework PUBLIC Qt5::OpenGL Qt5::Widgets Qt5::Gui - Qt5::Script) + Qt5::Script CGAL::CGAL_Qt5) if(TARGET Qt5::WebSockets) target_link_libraries(demo_framework PUBLIC Qt5::WebSockets) message( @@ -247,9 +226,7 @@ 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) - if(CGAL_HEADER_ONLY) - target_compile_definitions(demo_framework PRIVATE -DCGAL_USE_Qt5_RESOURCES) - endif() + target_compile_definitions(demo_framework PRIVATE -DCGAL_USE_Qt5_RESOURCES) add_library(scene_basic_objects SHARED Scene_plane_item.cpp Scene_spheres_item.cpp) @@ -330,19 +307,19 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) add_item(scene_movable_sm_item Plugins/AABB_tree/Scene_movable_sm_item.cpp) - if(TARGET CGAL::Eigen_support) + if(TARGET CGAL::Eigen3_support) add_item(scene_textured_item Scene_textured_surface_mesh_item.cpp texture.cpp) - target_link_libraries(scene_textured_item PUBLIC CGAL::Eigen_support) + target_link_libraries(scene_textured_item PUBLIC CGAL::Eigen3_support) qt5_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::Eigen_support scene_surface_mesh_item + 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::Eigen_support) + target_link_libraries(scene_mcf_item PUBLIC CGAL::Eigen3_support) endif() add_item(scene_implicit_function_item Scene_implicit_function_item.cpp) @@ -356,9 +333,9 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) PUBLIC scene_surface_mesh_item) add_item(scene_points_with_normal_item Scene_points_with_normal_item.cpp) - if(TARGET CGAL::Eigen_support) + if(TARGET CGAL::Eigen3_support) target_link_libraries(scene_points_with_normal_item - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) endif() find_package(LASLIB) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 579e108004c..8fb6f0a81a0 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -1,3 +1,4 @@ + #ifdef CGAL_USE_SSH # include "CGAL/Use_ssh.h" #endif @@ -1794,13 +1795,16 @@ void MainWindow::updateInfo() { QString item_filename = item->property("source filename").toString(); CGAL::Bbox_3 bbox = item->bbox(); if(bbox !=CGAL::Bbox_3()) - item_text += QString("

    Bounding box: min (%1,%2,%3), max (%4,%5,%6)
    ") + item_text += QString("
    Bounding box: min (%1,%2,%3), max (%4,%5,%6), dimensions (%7, %8, %9)
    ") .arg(bbox.xmin(),0, 'g', 17) .arg(bbox.ymin(),0, 'g', 17) .arg(bbox.zmin(),0, 'g', 17) .arg(bbox.xmax(),0, 'g', 17) .arg(bbox.ymax(),0, 'g', 17) - .arg(bbox.zmax(),0, 'g', 17); + .arg(bbox.zmax(),0, 'g', 17) + .arg(bbox.xmax() - bbox.xmin(), 0, 'g', 17) + .arg(bbox.ymax() - bbox.ymin(), 0, 'g', 17) + .arg(bbox.zmax() - bbox.zmin(), 0, 'g', 17); if(!item_filename.isEmpty()) { item_text += QString("
    File: %1
    ").arg(item_filename); } @@ -2957,16 +2961,19 @@ void MainWindow::on_actionSa_ve_Scene_as_Script_triggered() last_saved_dir, "Qt Script files (*.js)"); } + if(!filename.endsWith(".js")) + filename.append(".js"); std::ofstream os(filename.toUtf8(), std::ofstream::binary); if(!os) return; - CGAL::Three::Three::CursorScopeGuard cs(Qt::WaitCursor); + QApplication::setOverrideCursor(Qt::WaitCursor); std::vector > names; std::vector > loaders; std::vector colors; std::vector rendering_modes; QStringList not_saved; Polyhedron_demo_io_plugin_interface* camera_plugin = nullptr; + QMap > group_children_map; for(int i = 0; i < scene->numberOfEntries(); ++i) { Scene_item* item = scene->item(i); @@ -2985,6 +2992,12 @@ void MainWindow::on_actionSa_ve_Scene_as_Script_triggered() if(!rem.hasMatch()) continue; ext = rem.captured(1); + //check if it is in a group + if(item->parentGroup()) + { + group_children_map[item->parentGroup()->name()].append(item->name()); + ; + } QListto_save; to_save.append(item); QString savename(tr("%1.%2").arg(item->name()).arg(ext)); @@ -2998,9 +3011,12 @@ void MainWindow::on_actionSa_ve_Scene_as_Script_triggered() } if(loader.isEmpty()) { + QApplication::restoreOverrideCursor(); QMessageBox::warning(this, "", tr("No plugin found for %1. Not saved.").arg(item->name())); + QApplication::setOverrideCursor(Qt::WaitCursor); continue; } + loaders.push_back(std::make_pair(loader, ext)); colors.push_back(item->color()); rendering_modes.push_back(item->renderingMode()); @@ -3047,6 +3063,28 @@ void MainWindow::on_actionSa_ve_Scene_as_Script_triggered() //delete temp file QFile tmp_file(fullpath); tmp_file.remove(); + //group relations + if(!group_children_map.empty()) + { + os << "var groups = ["; + for(int i = 0; i< group_children_map.size() -1; ++i) + { + QString group_name = group_children_map.keys()[i]; + os << "[\'" << group_name.toStdString().c_str()<<"\', ["; + for(int j = 0; jsetStateFileName(QString()); viewer->textRenderer()->setScene(scene); viewer->setScene(scene); connect(scene, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex & )), @@ -3634,7 +3700,6 @@ void MainWindow::on_actionLoad_a_Scene_from_a_Script_File_triggered() { bool do_download = false; QString filename; - #ifdef CGAL_USE_SSH QString user = settings.value("ssh_user", QString()).toString(); @@ -3701,12 +3766,13 @@ void MainWindow::on_actionLoad_a_Scene_from_a_Script_File_triggered() "Could not find remote directory."); } QString path; + bool ok; path = QInputDialog::getItem(this, "Choose a file", tr("Choose the scene file."), - names); + names,0,true, &ok); filename = QString("%1/load_scene.js").arg(QDir::tempPath()); - if(path.isEmpty()) + if(path.isEmpty() || !ok) { ssh_free(session); return; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt index ed1d4c80cdc..04aff587cb9 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt @@ -1,26 +1,15 @@ include(polyhedron_demo_macros) -if(TARGET CGAL::Eigen_support) - - set(Classification_dependencies_met TRUE) +if(TARGET CGAL::Eigen3_support) find_package(Boost OPTIONAL_COMPONENTS serialization iostreams) include(CGAL_Boost_serialization_support) include(CGAL_Boost_iostreams_support) - if(NOT TARGET CGAL::Boost_serialization_support) + if(NOT TARGET CGAL::Boost_serialization_support OR NOT TARGET CGAL::Boost_iostreams_support) message( STATUS - "NOTICE: Boost Serialization not found. Classification plugin won't be available." + "NOTICE: Boost IO Streams and/or Serialization not found, reading deprecated Classification config files won't be possible." ) - set(Classification_dependencies_met FALSE) - endif() - - if(NOT TARGET CGAL::Boost_iostreams_support) - message( - STATUS - "NOTICE: Boost IOStreams not found. Classification plugin won't be available." - ) - set(Classification_dependencies_met FALSE) endif() find_package(OpenCV QUIET COMPONENTS core ml) # Need core + machine learning @@ -35,7 +24,6 @@ if(TARGET CGAL::Eigen_support) STATUS "NOTICE: OpenCV was not found. OpenCV random forest predicate for classification won't be available." ) - endif() find_package(TensorFlow QUIET) @@ -53,45 +41,48 @@ if(TARGET CGAL::Eigen_support) ) endif() - if(Classification_dependencies_met) - qt5_wrap_ui(classificationUI_FILES Classification_widget.ui - Classification_advanced_widget.ui) - polyhedron_demo_plugin( - classification_plugin - Classification_plugin - Point_set_item_classification.cpp - Cluster_classification.cpp - Surface_mesh_item_classification.cpp - ${classificationUI_FILES} - KEYWORDS - Classification) - target_link_libraries( - classification_plugin - PUBLIC scene_points_with_normal_item - scene_polylines_item - scene_polygon_soup_item - scene_surface_mesh_item - scene_selection_item - scene_color_ramp - CGAL::Eigen_support - CGAL::Boost_serialization_support - CGAL::Boost_iostreams_support) + qt5_wrap_ui(classificationUI_FILES Classification_widget.ui + Classification_advanced_widget.ui) + polyhedron_demo_plugin( + classification_plugin + Classification_plugin + Point_set_item_classification.cpp + Cluster_classification.cpp + Surface_mesh_item_classification.cpp + ${classificationUI_FILES} + KEYWORDS + Classification) + target_link_libraries( + classification_plugin + PUBLIC scene_points_with_normal_item + scene_polylines_item + scene_polygon_soup_item + scene_surface_mesh_item + scene_selection_item + scene_color_ramp + CGAL::Eigen3_support) - if(OpenCV_FOUND) - target_link_libraries(classification_plugin PUBLIC CGAL::OpenCV_support) - endif() - if(TensorFlow_FOUND) - target_link_libraries(classification_plugin - PUBLIC CGAL::TensorFlow_support) - endif() - if(TBB_FOUND) - target_link_libraries(classification_plugin PUBLIC CGAL::TBB_support) - endif() - - add_dependencies(classification_plugin point_set_selection_plugin - selection_plugin) + if(TARGET CGAL::Boost_serialization_support AND TARGET CGAL::Boost_iostreams_support) + target_link_libraries(classification_plugin PUBLIC + CGAL::Boost_serialization_support + CGAL::Boost_iostreams_support) endif() + if(TARGET CGAL::OpenCV_support) + target_link_libraries(classification_plugin PUBLIC CGAL::OpenCV_support) + endif() + + if(TARGET CGAL::TensorFlow_support) + target_link_libraries(classification_plugin PUBLIC CGAL::TensorFlow_support) + endif() + + if(TARGET CGAL::TBB_support) + target_link_libraries(classification_plugin PUBLIC CGAL::TBB_support) + endif() + + add_dependencies(classification_plugin point_set_selection_plugin + selection_plugin) + else() message( STATUS diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp index 75cc2aed755..209ced92bfe 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp @@ -708,7 +708,12 @@ public Q_SLOTS: filename = QFileDialog::getOpenFileName(mw, tr("Open ETHZ random forest configuration"), ".", +#if defined(CGAL_LINKED_WITH_BOOST_IOSTREAMS) && defined(CGAL_LINKED_WITH_BOOST_SERIALIZATION) "ETHZ random forest configuration (*.bin);Deprecated compressed ETHZ random forest configuration (*.gz);All Files (*)"); +#else + "ETHZ random forest configuration (*.bin);All Files (*)"); +#endif + #ifdef CGAL_LINKED_WITH_OPENCV else if (classifier == CGAL_CLASSIFICATION_OPENCV_NUMBER) // Random Forest (OpenCV) filename = QFileDialog::getOpenFileName(mw, diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Item_classification_base.h b/Polyhedron/demo/Polyhedron/Plugins/Classification/Item_classification_base.h index 5d763d90b2f..25fe070004d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Item_classification_base.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Item_classification_base.h @@ -235,10 +235,12 @@ public: m_ethz = new ETHZ_random_forest (m_labels, m_features); std::ifstream f (filename, std::ios_base::in | std::ios_base::binary); +#if defined(CGAL_LINKED_WITH_BOOST_IOSTREAMS) && defined(CGAL_LINKED_WITH_BOOST_SERIALIZATION) // Handle deprecated files if (std::string(filename).find(".gz") != std::string::npos) m_ethz->load_deprecated_configuration(f); else +#endif m_ethz->load_configuration (f); } else if (classifier == CGAL_CLASSIFICATION_OPENCV_NUMBER) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt index b3263913909..6e1c9990917 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt @@ -1,5 +1,5 @@ include(polyhedron_demo_macros) -if(TARGET CGAL::Eigen_support) +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 @@ -7,5 +7,5 @@ if(TARGET CGAL::Eigen_support) scene_surface_mesh_item scene_points_with_normal_item scene_color_ramp - CGAL::Eigen_support) + CGAL::Eigen3_support) endif() diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp index a6ed020b18e..91eafc44707 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include #include @@ -44,10 +46,16 @@ public: actionSplit_polylines->setProperty("subMenuName", "Operations on Polylines"); actionSplit_polylines->setObjectName("actionSplitPolylines"); + actionSplit_polylines_graph= new QAction(tr("Split Graph into Polylines"), mainWindow); + actionSplit_polylines_graph->setProperty("subMenuName", "Operations on Polylines"); + actionSplit_polylines_graph->setObjectName("actionSplitPolylinesGraph"); + actionSimplify_polylines = new QAction(tr("Simplify Selected Polyline"), mainWindow); actionSimplify_polylines->setProperty("subMenuName", "Operations on Polylines"); actionSimplify_polylines->setObjectName("actionSimplifyPolylines"); + connect(actionSplit_polylines, &QAction::triggered, this, &Polyhedron_demo_polylines_io_plugin::split); + connect(actionSplit_polylines_graph, &QAction::triggered, this, &Polyhedron_demo_polylines_io_plugin::split_graph); connect(actionJoin_polylines, &QAction::triggered, this, &Polyhedron_demo_polylines_io_plugin::join); connect(actionSimplify_polylines, &QAction::triggered, this, &Polyhedron_demo_polylines_io_plugin::simplify); @@ -61,7 +69,7 @@ public: bool canSave(const CGAL::Three::Scene_item*) override; bool save(QFileInfo fileinfo,QList&) override; bool applicable(QAction* a) const override{ - if( a == actionSimplify_polylines) + if( a == actionSimplify_polylines || a == actionSplit_polylines_graph) return qobject_cast(scene->item( scene->mainSelectionIndex())); bool all_polylines_selected = true; @@ -86,7 +94,8 @@ public: return QList()< +void +polylines_to_split(std::vector >& polylines, + PolylineInputIterator existing_polylines_begin, + PolylineInputIterator existing_polylines_end) +{ + typedef P Point_3; + typedef typename CGAL::Kernel_traits

    ::Kernel K; + using CGAL::internal::polylines_to_protect_namespace::Vertex_info; + typedef boost::adjacency_list > Graph; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename std::iterator_traits::value_type Polyline; + + Graph graph; + typedef CGAL::Mesh_3::internal::Returns_midpoint Midpoint_fct; + CGAL::Mesh_3::internal::Graph_manipulations g_manip(graph); + + for (PolylineInputIterator poly_it = existing_polylines_begin; + poly_it != existing_polylines_end; ++poly_it) + { + Polyline polyline = *poly_it; + if (polyline.size() < 2) + continue; + + typename Polyline::iterator pit = polyline.begin(); + while (boost::next(pit) != polyline.end()) + { + vertex_descriptor v = g_manip.get_vertex(*pit, false); + vertex_descriptor w = g_manip.get_vertex(*boost::next(pit), false); + g_manip.try_add_edge(v, w); + ++pit; + } + } + + CGAL::Mesh_3::Polyline_visitor visitor(polylines, graph); + const Graph& const_graph = graph; + typedef typename CGAL::Kernel_traits

    ::Kernel K; + CGAL::split_graph_into_polylines(const_graph, visitor); +} + +void Polyhedron_demo_polylines_io_plugin::split_graph() +{ + Scene_item* main_item = scene->item(scene->mainSelectionIndex()); + Scene_polylines_item* polylines_item = + qobject_cast(main_item); + if(polylines_item == 0) return; + std::vector new_polylines; + polylines_to_split(new_polylines, polylines_item->polylines.begin(), polylines_item->polylines.end()); + Scene_polylines_item* new_item = new Scene_polylines_item; + new_item->polylines = + Scene_polylines_item::Polylines_container{new_polylines.begin(), new_polylines.end()}; + new_item->setName(tr("%1 (split)").arg(polylines_item->name())); + scene->addItem(new_item); +} + void Polyhedron_demo_polylines_io_plugin::simplify() { Scene_polylines_item* item = qobject_cast(scene->item(scene->mainSelectionIndex())); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt index 438f591f419..4c54343a0f3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt @@ -96,10 +96,10 @@ target_link_libraries( # Use Eigen find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) -if(TARGET CGAL::Eigen_support) - target_link_libraries(mesh_3_optimization_plugin PUBLIC CGAL::Eigen_support) +if(TARGET CGAL::Eigen3_support) + target_link_libraries(mesh_3_optimization_plugin PUBLIC CGAL::Eigen3_support) else() #eigen message( STATUS 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 3b20b5c4148..c3ae7c84b46 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -100,8 +100,7 @@ public: connect(actionMesh_3_surface, SIGNAL(triggered()), this, SLOT(mesh_3_surface())); } - - actionSplitPolylines = new QAction("Split polylines in a graph", mw); + actionSplitPolylines = new QAction("Build Features Graph for Mesh_3", mw); actionSplitPolylines->setProperty("subMenuName", "Tetrahedral Mesh Generation"); connect(actionSplitPolylines, &QAction::triggered, diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h index 43b1bbadf12..2763f615c05 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h @@ -35,23 +35,11 @@ #include #include -#include namespace CGAL { class Image_3; } -namespace internal{ -//general case for polyhedron -template -struct Get_facet_patch_id_selector { - typedef CGAL::Default type; -}; -//specialization for surface_mesh -template<> -struct Get_facet_patch_id_selector { - typedef CGAL::Mesh_3::Get_facet_patch_id_sm type; -}; -}//end internal + struct Mesh_parameters { double facet_angle; @@ -264,14 +252,7 @@ edge_criteria(double edge_size, Mesh_fnt::Polyhedral_domain_tag) { if(p_.use_sizing_field_with_aabb_tree) { typedef typename Domain::Surface_patch_index_set Set_of_patch_ids; - typedef Sizing_field_with_aabb_tree - < - Kernel - , Domain - , typename Domain::AABB_tree - , CGAL::Default - , typename internal::Get_facet_patch_id_selector::type - > Mesh_sizing_field; // type of sizing field for 0D and 1D features + typedef Sizing_field_with_aabb_tree Mesh_sizing_field; // type of sizing field for 0D and 1D features typedef std::vector Patches_ids_vector; typedef typename Domain::Curve_index Curve_index; const Curve_index max_index = domain_->maximal_curve_index(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Diff_between_meshes_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Diff_between_meshes_plugin.cpp index 37c8a08a7e6..3147fca83cf 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Diff_between_meshes_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Diff_between_meshes_plugin.cpp @@ -175,11 +175,11 @@ void Polyhedron_demo_diff_between_meshes_plugin::diff() Scene_surface_mesh_item* m1_over_m2_item = new Scene_surface_mesh_item(m1_over_m2); m1_over_m2_item->setColor(QColor(Qt::blue)); - m1_over_m2_item->setName(QString("%1 - %2").arg(m1_item->name()).arg(m2_item->name())); + m1_over_m2_item->setName(QString("%2 - %1").arg(m1_item->name()).arg(m2_item->name())); CGAL::Three::Three::scene()->addItem(m1_over_m2_item); Scene_surface_mesh_item* m2_over_m1_item = new Scene_surface_mesh_item(m2_over_m1); m2_over_m1_item->setColor(QColor(Qt::red)); - m2_over_m1_item->setName(QString("%2 - %1").arg(m1_item->name()).arg(m2_item->name())); + m2_over_m1_item->setName(QString("%1 - %2").arg(m1_item->name()).arg(m2_item->name())); CGAL::Three::Three::scene()->addItem(m2_over_m1_item); Scene_surface_mesh_item* common_item = new Scene_surface_mesh_item(common); common_item->setColor(QColor(Qt::green)); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp index 49cb1b2f15f..1772a029a42 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp @@ -501,6 +501,8 @@ void Polyhedron_demo_affine_transform_plugin::start(FaceGraph *facegraph, const lastMatrix.data()[13] = y; lastMatrix.data()[14] = z; transform_item = new Scene_facegraph_transform_item(CGAL::qglviewer::Vec(x,y,z),facegraph, name); + connect(transform_item, &Scene_item::aboutToBeDestroyed, + [](){ QApplication::restoreOverrideCursor(); }); transform_item->setManipulatable(true); transform_item->setColor(Qt::green); transform_item->setRenderingMode(Wireframe); @@ -534,6 +536,8 @@ void Polyhedron_demo_affine_transform_plugin::start(Scene_points_with_normal_ite lastMatrix.data()[14] = z; transform_points_item = new Scene_transform_point_set_item(points_item,CGAL::qglviewer::Vec(x,y,z)); + connect(transform_points_item, &Scene_item::aboutToBeDestroyed, + [](){ QApplication::restoreOverrideCursor(); }); transform_points_item->setRenderingMode(Points); transform_points_item->setName(tr("Affine Transformation")); connect(transform_points_item, SIGNAL(stop()),this, SLOT(go())); 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 cada4c95506..0cb165c03f6 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp @@ -809,12 +809,14 @@ bool Scene_edit_box_item::eventFilter(QObject *obj, QEvent *event) d->selected_vertices.push_back(d->faces[picked].vertices[i]); Kernel::Point_3 a1(d->faces[picked].vertices[1]->position()), a0(d->faces[picked].vertices[0]->position()) ,a3(d->faces[picked].vertices[3]->position()); - QVector3D a(a1.x()-a0.x(), a1.y()-a0.y(),a1.z()-a0.z()),b(a3.x()-a0.x(), a3.y()-a0.y(),a3.z()-a0.z()); - QVector3D n = QVector3D::crossProduct(a,b); + Kernel::Vector_3 a = a1 - a0, + b = a3 - a0; + Kernel::Vector_3 n = CGAL::cross_product(a,b); d->remodel_frame->setConstraint(&d->constraint); d->constraint.setTranslationConstraintType(CGAL::qglviewer::AxisPlaneConstraint::AXIS); d->constraint.setTranslationConstraintDirection(CGAL::qglviewer::Vec(n.x(), n.y(), n.z())); + } viewer->setManipulatedFrame(d->remodel_frame); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt index ffc3c610b28..0d3dea93625 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt @@ -1,10 +1,10 @@ include(polyhedron_demo_macros) -if(TARGET CGAL::Eigen_support) +if(TARGET CGAL::Eigen3_support) polyhedron_demo_plugin(jet_fitting_plugin Jet_fitting_plugin) target_link_libraries( jet_fitting_plugin PUBLIC scene_surface_mesh_item scene_polylines_item - CGAL::Eigen_support) + CGAL::Eigen3_support) else() message( @@ -17,15 +17,15 @@ polyhedron_demo_plugin(extrude_plugin Extrude_plugin KEYWORDS PMP) target_link_libraries(extrude_plugin PUBLIC scene_surface_mesh_item scene_selection_item) -if(TARGET CGAL::Eigen_support) +if(TARGET CGAL::Eigen3_support) if("${EIGEN3_VERSION}" VERSION_GREATER "3.1.90") qt5_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::Eigen_support) + 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) polyhedron_demo_plugin(fairing_plugin Fairing_plugin ${fairingUI_FILES} KEYWORDS PMP) - target_link_libraries(fairing_plugin PUBLIC scene_selection_item CGAL::Eigen_support) + 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) polyhedron_demo_plugin(mean_curvature_flow_skeleton_plugin Mean_curvature_flow_skeleton_plugin ${Mean_curvature_flow_skeleton_pluginUI_FILES}) @@ -36,11 +36,11 @@ if(TARGET CGAL::Eigen_support) scene_polylines_item scene_mcf_item demo_framework - CGAL::Eigen_support) + 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) polyhedron_demo_plugin(smoothing_plugin Smoothing_plugin ${smoothingUI_FILES}) - target_link_libraries(smoothing_plugin PUBLIC scene_surface_mesh_item scene_selection_item CGAL::Eigen_support) + target_link_libraries(smoothing_plugin PUBLIC scene_surface_mesh_item scene_selection_item CGAL::Eigen3_support) find_package(Ceres QUIET) if(TARGET ceres) target_compile_definitions( smoothing_plugin PRIVATE CGAL_PMP_USE_CERES_SOLVER ) @@ -51,7 +51,7 @@ if(TARGET CGAL::Eigen_support) Ceres PROPERTIES DESCRIPTION "A large scale non-linear optimization library." PURPOSE "Can be used as a solver in the smoothing plugin.") - target_link_libraries(extrude_plugin PUBLIC CGAL::Eigen_support) + target_link_libraries(extrude_plugin PUBLIC CGAL::Eigen3_support) else() message( STATUS diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp index ec1181416fb..d0b22bb4fb3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp @@ -43,7 +43,7 @@ #include "Kernel_type.h" #include -#include +#include #include #include #include @@ -939,7 +939,7 @@ void Polyhedron_demo_hole_filling_plugin::hole_filling_polyline_action() { continue; } if(it->size() < 4) { // no triangle, skip it (needs at least 3 + 1 repeat) - print_message("Warning: skipping polyline which has less than 4 points!"); + print_message("Warning: skipping polyline which has fewer than 4 points!"); continue; } @@ -961,7 +961,9 @@ void Polyhedron_demo_hole_filling_plugin::hole_filling_polyline_action() { } } SMesh* poly = new SMesh; - CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(*it, + std::vector ps(it->begin(), it->end()); + ps.pop_back(); + CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(ps, patch, *poly); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index d1a13d435d6..5bcf30de208 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -342,7 +342,7 @@ public Q_SLOTS: if (poly_item || selection_item) { - if(selection_item && selection_item->selected_edges.empty()) + if(selection_item && selection_item->selected_edges.empty() && selection_item->selected_facets.empty()) { QMessageBox::warning(mw, "Empty Edges", "There are no selected edges. Aborting."); return; 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 794cc757228..2c9683fbe7d 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 @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include "Color_map.h" diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt index 39d5e3f1124..0c562c8a6f2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt @@ -1,5 +1,5 @@ include(polyhedron_demo_macros) -if(TARGET CGAL::Eigen_support) +if(TARGET CGAL::Eigen3_support) find_package(SCIP QUIET) @@ -43,7 +43,7 @@ if(TARGET CGAL::Eigen_support) target_link_libraries( surface_reconstruction_plugin PUBLIC scene_polygon_soup_item scene_surface_mesh_item - scene_points_with_normal_item CGAL::Eigen_support) + scene_points_with_normal_item CGAL::Eigen3_support) if(TARGET CGAL::SCIP_support) target_link_libraries(surface_reconstruction_plugin @@ -62,7 +62,7 @@ if(TARGET CGAL::Eigen_support) target_link_libraries( point_set_normal_estimation_plugin PUBLIC scene_points_with_normal_item scene_callback_signaler - CGAL::Eigen_support) + CGAL::Eigen3_support) qt5_wrap_ui(features_detection_pluginUI_FILES Features_detection_plugin.ui) polyhedron_demo_plugin( @@ -70,14 +70,14 @@ if(TARGET CGAL::Eigen_support) ${features_detection_pluginUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries( features_detection_plugin PUBLIC scene_points_with_normal_item - CGAL::Eigen_support) + CGAL::Eigen3_support) polyhedron_demo_plugin(point_set_smoothing_plugin Point_set_smoothing_plugin KEYWORDS PointSetProcessing) target_link_libraries( point_set_smoothing_plugin PUBLIC scene_points_with_normal_item scene_callback_signaler - CGAL::Eigen_support) + CGAL::Eigen3_support) polyhedron_demo_plugin( point_set_average_spacing_plugin Point_set_average_spacing_plugin KEYWORDS @@ -85,7 +85,7 @@ if(TARGET CGAL::Eigen_support) target_link_libraries( point_set_average_spacing_plugin PUBLIC scene_points_with_normal_item scene_callback_signaler - CGAL::Eigen_support) + CGAL::Eigen3_support) qt5_wrap_ui(point_set_shape_detectionUI_FILES Point_set_shape_detection_plugin.ui) @@ -96,7 +96,7 @@ if(TARGET CGAL::Eigen_support) target_link_libraries( point_set_shape_detection_plugin PUBLIC scene_surface_mesh_item scene_points_with_normal_item - scene_polygon_soup_item scene_callback_signaler CGAL::Eigen_support) + scene_polygon_soup_item scene_callback_signaler CGAL::Eigen3_support) find_package(OpenGR QUIET) include(CGAL_OpenGR_support) @@ -110,7 +110,7 @@ if(TARGET CGAL::Eigen_support) ${register_point_setsUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries(register_point_sets_plugin PUBLIC scene_points_with_normal_item) - target_link_libraries(register_point_sets_plugin PUBLIC CGAL::Eigen_support) + target_link_libraries(register_point_sets_plugin PUBLIC CGAL::Eigen3_support) if(TARGET CGAL::OpenGR_support) target_link_libraries(register_point_sets_plugin PUBLIC CGAL::OpenGR_support) 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 f75d9e95aeb..064ee708375 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 @@ -34,7 +34,7 @@ #include #include -#include +#include #include "run_with_qprogressdialog.h" diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt index 1b5367ac64c..0591da9f770 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt @@ -3,58 +3,61 @@ include(polyhedron_demo_macros) if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() +if(NOT CGAL_DISABLE_GMP) + if(TARGET CGAL::Eigen3_support) + find_package(CGAL REQUIRED COMPONENTS Core) -if(TARGET CGAL::Eigen_support) - find_package(CGAL REQUIRED COMPONENTS Core) + include(${CGAL_USE_FILE}) - include(${CGAL_USE_FILE}) + qt5_wrap_ui(parameterizationUI_FILES Parameterization_widget.ui OTE_dialog.ui) + polyhedron_demo_plugin(parameterization_plugin Parameterization_plugin + ${parameterizationUI_FILES}) + target_link_libraries( + parameterization_plugin PUBLIC scene_surface_mesh_item scene_textured_item + scene_selection_item CGAL::Eigen3_support) + else() + message( + STATUS + "NOTICE: Eigen 3.1 (or greater) was not found. The Parameterization plugin will not be available." + ) + endif() - qt5_wrap_ui(parameterizationUI_FILES Parameterization_widget.ui OTE_dialog.ui) - polyhedron_demo_plugin(parameterization_plugin Parameterization_plugin - ${parameterizationUI_FILES}) - target_link_libraries( - parameterization_plugin PUBLIC scene_surface_mesh_item scene_textured_item - scene_selection_item CGAL::Eigen_support) -else() - 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) -polyhedron_demo_plugin(mesh_segmentation_plugin Mesh_segmentation_plugin - ${segmentationUI_FILES}) -target_link_libraries(mesh_segmentation_plugin PUBLIC scene_surface_mesh_item) + qt5_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) -qt5_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( 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) -polyhedron_demo_plugin(offset_meshing_plugin Offset_meshing_plugin - ${remeshingUI_FILES}) -target_link_libraries(offset_meshing_plugin PUBLIC scene_surface_mesh_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) -if(TARGET CGAL::Eigen_support) - target_link_libraries(offset_meshing_plugin PUBLIC CGAL::Eigen_support) -endif() -if(TARGET CGAL::TBB_support) - target_link_libraries(offset_meshing_plugin PUBLIC CGAL::TBB_support) -endif() + 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 - ${shortestPathUI_FILES}) -target_link_libraries( - shortest_path_plugin PUBLIC scene_surface_mesh_item scene_shortest_path_item - scene_basic_objects) + qt5_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) -polyhedron_demo_plugin( - surface_mesh_approximation_plugin Surface_mesh_approximation_plugin - ${basicUI_FILES} VSA_wrapper.cpp) -target_link_libraries( - surface_mesh_approximation_plugin - PUBLIC scene_surface_mesh_item scene_polygon_soup_item scene_polylines_item) + qt5_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) + target_link_libraries( + surface_mesh_approximation_plugin + PUBLIC scene_surface_mesh_item scene_polygon_soup_item scene_polylines_item) +else() + message(STATUS "NOTICE: Some tests require the CGAL_Core library, and will not be compiled.") +endif() 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 ddcea01a397..428d3ad6114 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp @@ -390,27 +390,70 @@ public: 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 { + bool applicable(QAction* a) const { Scene_item* item = scene->item(scene->mainSelectionIndex()); + return - qobject_cast(item) || - qobject_cast(item); + qobject_cast(item) || + (a == actionOffsetMeshing && qobject_cast(item)); } QList actions() const { - return QList() << actionOffsetMeshing; + 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); + Scene_surface_mesh_item* sm_item = + qobject_cast(item); + + SMesh* sMesh = sm_item->face_graph(); + if(!sMesh) + 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); + SMesh* smesh = sm_item->face_graph(); + 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() { const CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.h b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.h index 644e9fc1501..888146d8da3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.h @@ -66,7 +66,7 @@ class VSA_WRAPPER_EXPORT VSA_wrapper { // fitting center Vector_3 center = CGAL::NULL_VECTOR; FT area(0.0); - for(const face_descriptor f : faces) { + for(const face_descriptor& f : faces) { center = center + (get(center_pmap, f) - CGAL::ORIGIN) * get(area_pmap, f); area += get(area_pmap, f); } 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 0352156457e..a5db1cb3f62 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 @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt index 6cde165b88d..9457b7bdc5d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt @@ -14,7 +14,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5 ImageIO) # Find Qt5 itself find_package( Qt5 QUIET - COMPONENTS OpenGL Script Svg Xml + COMPONENTS OpenGL Script Svg OPTIONAL_COMPONENTS ScriptTools WebSockets) if(RUNNING_CGAL_AUTO_TEST) diff --git a/Polyhedron/demo/Polyhedron/Scene.cpp b/Polyhedron/demo/Polyhedron/Scene.cpp index 88c60c0b06f..763627eedf9 100644 --- a/Polyhedron/demo/Polyhedron/Scene.cpp +++ b/Polyhedron/demo/Polyhedron/Scene.cpp @@ -1184,7 +1184,7 @@ bool Scene::sort_lists(QVector >&sorted_lists, bool up) for(int i = 0; i< sorted_lists.first().size(); ++i) { Scene_group_item* group = qobject_cast(this->item(sorted_lists.first()[i])); - if(group && ! group->getChildren().isEmpty()) + if(group && ! group->getChildren().isEmpty() && sorted_lists.first()[i] < sorted_lists.size()) { sorted_lists[sorted_lists.first()[i]].clear(); } diff --git a/Polyhedron/demo/Polyhedron/Scene.h b/Polyhedron/demo/Polyhedron/Scene.h index 61010a23513..bb8b21b8db2 100644 --- a/Polyhedron/demo/Polyhedron/Scene.h +++ b/Polyhedron/demo/Polyhedron/Scene.h @@ -53,7 +53,7 @@ public: ~Scene(); int addItem(CGAL::Three::Scene_item* item) Q_DECL_OVERRIDE; void addChild(Scene_item* item) Q_DECL_OVERRIDE; - void changeGroup(CGAL::Three::Scene_item* item, CGAL::Three::Scene_group_item* target_group) Q_DECL_OVERRIDE; + Q_INVOKABLE void changeGroup(CGAL::Three::Scene_item* item, CGAL::Three::Scene_group_item* target_group) Q_DECL_OVERRIDE; CGAL::Three::Scene_item* replaceItem(int index, CGAL::Three::Scene_item* item, bool emit_item_about_to_be_destroyed = false) Q_DECL_OVERRIDE; Q_INVOKABLE int erase(int) Q_DECL_OVERRIDE; diff --git a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp index ed1fd56a3ec..a9a3626d544 100644 --- a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include @@ -102,8 +102,12 @@ public : } void setColor(QColor c) Q_DECL_OVERRIDE { - qobject_cast(this->parent())->setColor(c); + Scene_c3t3_item* p_item = qobject_cast(this->parent()); + if(p_item->number_of_patches() > 1) + p_item->setColor(c); Scene_item::setColor(c); + if(p_item->number_of_patches() <= 1) + p_item->changed(); } // Indicates if rendering mode is supported bool supportsRenderingMode(RenderingMode m) const Q_DECL_OVERRIDE{ @@ -1308,7 +1312,11 @@ void Scene_c3t3_item_priv::computeIntersection(const Primitive& cell) typedef unsigned char UC; Tr::Cell_handle ch = cell.id(); - QColor c = this->colors_subdomains[ch->subdomain_index()].lighter(50); + QColor c; + if(surface_patch_indices_.size()>1) + c = this->colors_subdomains[ch->subdomain_index()].lighter(50); + else + c = intersection->color(); const Tr::Bare_point& pa = wp2p(ch->vertex(0)->point()); const Tr::Bare_point& pb = wp2p(ch->vertex(1)->point()); @@ -2117,6 +2125,9 @@ double Scene_c3t3_item::get_sharp_edges_angle() { return d->sharp_edges_angle; } void Scene_c3t3_item::set_detect_borders(bool b) { d->detect_borders = b;} bool Scene_c3t3_item::get_detect_borders() { return d->detect_borders; } - +std::size_t Scene_c3t3_item::number_of_patches() const +{ + return d->surface_patch_indices_.size(); +} #include "Scene_c3t3_item.moc" diff --git a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.h b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.h index d71d906fce3..7d5e343ded0 100644 --- a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.h @@ -128,6 +128,7 @@ public: float getShrinkFactor() const; bool keyPressEvent(QKeyEvent *) Q_DECL_OVERRIDE; bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE; + std::size_t number_of_patches() const; public Q_SLOTS: void on_spheres_color_changed(); diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp index 7c8213bb76a..ab972f2653d 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp @@ -861,7 +861,6 @@ bool Scene_polyhedron_selection_item::treat_selection(const std::setinvalidate_aabb_tree(); + setProperty("need_invalidate_aabb_tree", false); + } invalidateOpenGLBuffers(); Q_EMIT updateInstructions("Ctrl+Right-click to move the point. \nHit Ctrl+Z to leave the selection. (2/2)"); } @@ -1075,7 +1078,6 @@ bool Scene_polyhedron_selection_item:: treat_selection(const std::setmanipulated_frame->position().x-offset.x, d->manipulated_frame->position().y-offset.y, d->manipulated_frame->position().z-offset.z)); + setProperty("need_invalidate_aabb_tree", true); invalidateOpenGLBuffers(); poly_item->updateVertex(vh); // poly_item->invalidateOpenGLBuffers(); @@ -1975,6 +1977,10 @@ void Scene_polyhedron_selection_item::validateMoveVertex() set_highlighting(true); setProperty("need_hl_restore", false); } + if(property("need_invalidate_aabb_tree").toBool()){ + polyhedron_item()->invalidate_aabb_tree(); + setProperty("need_invalidate_aabb_tree", false); + } Q_EMIT updateInstructions("Select a vertex. (1/2)"); } @@ -2255,35 +2261,35 @@ void Scene_polyhedron_selection_item::printPrimitiveId(QPoint p, CGAL::Three::Vi { d->item->polyhedron_item()->printPrimitiveId(p, viewer); } + bool Scene_polyhedron_selection_item::printVertexIds() const { return d->item->polyhedron_item()->printVertexIds(); - return false; } + bool Scene_polyhedron_selection_item::printEdgeIds() const { - d->item->polyhedron_item()->printEdgeIds(); - return false; + return d->item->polyhedron_item()->printEdgeIds(); } + bool Scene_polyhedron_selection_item::printFaceIds() const { return d->item->polyhedron_item()->printFaceIds(); - return false; } + void Scene_polyhedron_selection_item::printAllIds() { d->item->polyhedron_item()->printAllIds(); } + bool Scene_polyhedron_selection_item::testDisplayId(double x, double y, double z, CGAL::Three::Viewer_interface* viewer)const { return d->item->polyhedron_item()->testDisplayId(x, y, z, viewer); - return false; } bool Scene_polyhedron_selection_item::shouldDisplayIds(CGAL::Three::Scene_item *current_item) const { return d->item->polyhedron_item() == current_item; - return false; } void Scene_polyhedron_selection_item::select_boundary() @@ -2310,12 +2316,12 @@ Scene_polyhedron_selection_item::toolTip() const "

    Number of vertices: %2
    " "Number of edges: %3
    " "Number of faces: %4

    ") - .arg(this->name()) - .arg(selected_vertices.size()) - .arg(selected_edges.size()) - .arg(selected_facets.size()) - .arg(this->renderingModeName()) - .arg(this->color().name()); + .arg(this->name()) + .arg(selected_vertices.size()) + .arg(selected_edges.size()) + .arg(selected_facets.size()) + .arg(this->renderingModeName()) + .arg(this->color().name()); } void Scene_polyhedron_selection_item::initializeBuffers(Viewer_interface *v) const diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp index d4d7f42943b..86596bfa994 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp @@ -334,6 +334,15 @@ void Scene_surface_mesh_item::standard_constructor(SMesh* sm) d->textFItems = new TextListItem(this); are_buffers_filled = false; invalidate(ALL); + std::size_t isolated_v = 0; + for(vertex_descriptor v : vertices(*sm)) + { + if(sm->is_isolated(v)) + { + ++isolated_v; + } + } + setNbIsolatedvertices(isolated_v); } Scene_surface_mesh_item::Scene_surface_mesh_item(SMesh* sm) @@ -2401,7 +2410,7 @@ void Scene_surface_mesh_item::updateVertex(vertex_descriptor vh) getEdgeContainer(0)->getVbo(Ed::Vertices), new_point,id); - for(const auto & v_it : CGAL::vertices_around_target(vh, *face_graph())) + for(const auto v_it : CGAL::vertices_around_target(vh, *face_graph())) { EPICK::Vector_3 n = CGAL::Polygon_mesh_processing::compute_vertex_normal(v_it, *face_graph()); cgal_gl_data new_n[3]; @@ -2421,7 +2430,7 @@ void Scene_surface_mesh_item::updateVertex(vertex_descriptor vh) } - for(const auto& f_it : CGAL::faces_around_target( halfedge(vh, *face_graph()), *face_graph())) + for(const auto f_it : CGAL::faces_around_target( halfedge(vh, *face_graph()), *face_graph())) { if (f_it == boost::graph_traits::null_face()) continue; diff --git a/Polyhedron/demo/Polyhedron/Server_ws.cpp b/Polyhedron/demo/Polyhedron/Server_ws.cpp index 82bea309a37..b6d84b6d441 100644 --- a/Polyhedron/demo/Polyhedron/Server_ws.cpp +++ b/Polyhedron/demo/Polyhedron/Server_ws.cpp @@ -88,7 +88,7 @@ int main(int argc, char *argv[]) parser.addHelpOption(); QCommandLineOption portOption(QStringList() << "p" << "port", QCoreApplication::translate("main", "Port for echoserver [default: 1234]."), - QCoreApplication::translate("main", "port"), QLatin1Literal("1234")); + QCoreApplication::translate("main", "port"), QLatin1String("1234")); parser.addOption(portOption); parser.process(a); int port = parser.value(portOption).toInt(); diff --git a/Polyhedron/demo/Polyhedron/Viewer.cpp b/Polyhedron/demo/Polyhedron/Viewer.cpp index 9b6789286e0..f62ea120333 100644 --- a/Polyhedron/demo/Polyhedron/Viewer.cpp +++ b/Polyhedron/demo/Polyhedron/Viewer.cpp @@ -380,6 +380,7 @@ Viewer::Viewer(QWidget* parent, Viewer::~Viewer() { + makeCurrent(); QSettings viewer_settings; viewer_settings.setValue("cam_pos", QString("%1,%2,%3") @@ -940,20 +941,26 @@ void Viewer::attribBuffers(int program_name) const { QMatrix4x4 mv_mat; // transformation of the manipulated frame QMatrix4x4 f_mat; + // ModelView Matrix that is modified just for the normal matrix in case of scene scaling + QMatrix4x4 norm_mat; f_mat.setToIdentity(); //fills the MVP and MV matrices. GLdouble d_mat[16]; - this->camera()->getModelViewMatrix(d_mat); for (int i=0; i<16; ++i) mv_mat.data()[i] = GLfloat(d_mat[i]); this->camera()->getModelViewProjectionMatrix(d_mat); for (int i=0; i<16; ++i) mvp_mat.data()[i] = GLfloat(d_mat[i]); + + norm_mat = mv_mat; + if(d->scene_scaling){ mvp_mat.scale(d->scaler); mv_mat.scale(d->scaler); + QVector3D scale_norm(1.0/d->scaler.x(), 1.0/d->scaler.y(), 1.0/d->scaler.z()); + norm_mat.scale(scale_norm); } QOpenGLShaderProgram* program = getShaderProgram(program_name); @@ -1039,12 +1046,14 @@ void Viewer::attribBuffers(int program_name) const { case PROGRAM_NO_INTERPOLATION: case PROGRAM_HEAT_INTENSITY: program->setUniformValue("mv_matrix", mv_mat); + program->setUniformValue("norm_matrix", norm_mat); break; case PROGRAM_WITHOUT_LIGHT: case PROGRAM_SOLID_WIREFRAME: break; case PROGRAM_WITH_TEXTURE: program->setUniformValue("mv_matrix", mv_mat); + program->setUniformValue("norm_matrix", norm_mat); program->setUniformValue("s_texture",0); program->setUniformValue("f_matrix",f_mat); break; diff --git a/Polyhedron/demo/Polyhedron/Viewer.h b/Polyhedron/demo/Polyhedron/Viewer.h index 00381648013..541674bd510 100644 --- a/Polyhedron/demo/Polyhedron/Viewer.h +++ b/Polyhedron/demo/Polyhedron/Viewer.h @@ -92,7 +92,7 @@ public: //!Set total number of depth peeling passes. void setTotalPass(int); void resetFov(); - const QVector3D& scaler() const; + const QVector3D& scaler() const override; Q_SIGNALS: void sendMessage(QString); void doneInitGL(CGAL::Three::Viewer_interface*); diff --git a/Polyhedron/demo/Polyhedron/create_sphere.h b/Polyhedron/demo/Polyhedron/create_sphere.h index a10cdbacc2b..c2fd27266d1 100644 --- a/Polyhedron/demo/Polyhedron/create_sphere.h +++ b/Polyhedron/demo/Polyhedron/create_sphere.h @@ -197,7 +197,7 @@ void create_flat_and_wire_sphere(FLOAT R, const float sectors=float(prec); const float to_rad = static_cast(CGAL_PI / 180.0); - create_flat_sphere(R, positions_spheres, normals_spheres); + create_flat_sphere(R, positions_spheres, normals_spheres, prec); float T, P; float x[4],y[4],z[4]; diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/heat_intensity_shader.vert b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/heat_intensity_shader.vert index c8f65a827cc..11698361bd4 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/heat_intensity_shader.vert +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/heat_intensity_shader.vert @@ -4,9 +4,10 @@ attribute highp vec3 normals; attribute highp vec3 colors; attribute highp float vdist; uniform highp mat4 mvp_matrix; -uniform highp mat4 mv_matrix; -varying highp vec4 fP; -varying highp vec3 fN; +uniform highp mat4 mv_matrix; +uniform highp mat4 norm_matrix; +varying highp vec4 fP; +varying highp vec3 fN; varying highp vec4 color; varying highp float dist[6]; varying highp float out_dist; @@ -42,10 +43,10 @@ void main(void) compute_distances(); out_dist = vdist; fP = mv_matrix * vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; gl_Position = mvp_matrix * vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3.vert b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3.vert index d2c861cfd7a..61bc2a9c4b0 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3.vert +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3.vert @@ -5,6 +5,7 @@ attribute highp vec3 colors; attribute highp vec3 center; uniform highp mat4 mvp_matrix; uniform highp mat4 mv_matrix; +uniform highp mat4 norm_matrix; uniform highp vec4 cutplane; uniform highp float shrink_factor; varying highp vec4 fP; @@ -17,11 +18,11 @@ void main(void) color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w); fP = mv_matrix * vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; highp mat4 transOB = mat4(1., 0., 0., 0., // first column 0., 1., 0., 0., // second column diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3_spheres.vert b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3_spheres.vert index 26b307888a0..a7bbfc2bb42 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3_spheres.vert +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3_spheres.vert @@ -1,4 +1,4 @@ -//#version 100 +//#version 100 attribute highp vec4 vertex; attribute highp vec3 normals; attribute highp vec3 colors; @@ -7,6 +7,7 @@ attribute highp float radius; uniform highp vec4 cutplane; uniform highp mat4 mvp_matrix; uniform highp mat4 mv_matrix; +uniform highp mat4 norm_matrix; varying highp vec4 fP; varying highp vec3 fN; varying highp vec4 color; @@ -17,10 +18,10 @@ void main(void) color = vec4(colors, center.x * cutplane.x + center.y * cutplane.y + center.z * cutplane.z + cutplane.w); highp vec4 my_vertex = vec4(radius*vertex.x + center.x, radius* vertex.y + center.y, radius*vertex.z + center.z, 1.0) ; fP = mv_matrix * my_vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; gl_Position = mvp_matrix * my_vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_instanced.vert b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_instanced.vert index b8a6ecdaa54..4868a050ec3 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_instanced.vert +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_instanced.vert @@ -1,10 +1,11 @@ -//#version 100 +//#version 100 attribute highp vec4 vertex; attribute highp vec3 normals; attribute highp vec3 colors; attribute highp vec3 center; uniform highp mat4 mvp_matrix; uniform highp mat4 mv_matrix; +uniform highp mat4 norm_matrix; varying highp vec4 fP; varying highp vec3 fN; varying highp vec4 color; @@ -17,10 +18,10 @@ void main(void) color = vec4(colors, 1.0); highp vec4 my_vertex = vec4(vertex.x + center.x, vertex.y + center.y, vertex.z + center.z, 1.0); fP = mv_matrix * my_vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; gl_Position = mvp_matrix * my_vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_spheres.vert b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_spheres.vert index 2bdf861c0eb..3a54795b4b9 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_spheres.vert +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_spheres.vert @@ -1,4 +1,4 @@ -//#version 100 +//#version 100 attribute highp vec4 vertex; attribute highp vec3 normals; attribute highp vec3 colors; @@ -6,6 +6,7 @@ attribute highp vec3 center; attribute highp float radius; uniform highp mat4 mvp_matrix; uniform highp mat4 mv_matrix; +uniform highp mat4 norm_matrix; uniform highp mat4 f_matrix; varying highp vec4 fP; varying highp vec3 fN; @@ -19,12 +20,13 @@ void main(void) for(int i=0; i<6; ++i) dist[i] = 1.0; color = vec4(colors, 1.0); - fP = mv_matrix * vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; - gl_Position = mvp_matrix * f_matrix * - vec4(radius*vertex.x + center.x, radius* vertex.y + center.y, radius*vertex.z + center.z, 1.0) ; + vec4 transformed_vertex = + vec4(radius*vertex.x + center.x, radius* vertex.y + center.y, radius*vertex.z + center.z, 1.0); + fP = mv_matrix * transformed_vertex; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; + gl_Position = mvp_matrix * f_matrix * transformed_vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.vert b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.vert index d0e4d77f61c..8b94698f3bc 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.vert +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.vert @@ -1,12 +1,13 @@ -//#version 100 +//#version 100 attribute highp vec4 vertex; attribute highp vec3 normals; attribute highp vec4 colors; uniform highp mat4 mvp_matrix; -uniform highp mat4 mv_matrix; -uniform highp mat4 f_matrix; -varying highp vec4 fP; -varying highp vec3 fN; +uniform highp mat4 mv_matrix; +uniform highp mat4 norm_matrix; +uniform highp mat4 f_matrix; +varying highp vec4 fP; +varying highp vec3 fN; varying highp vec4 color; varying highp float dist[6]; uniform bool is_clipbox_on; @@ -40,10 +41,10 @@ void main(void) if(is_clipbox_on) compute_distances(); fP = mv_matrix * vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; gl_Position = mvp_matrix * f_matrix * vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_texture.vert b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_texture.vert index e73931212fa..720d1a2711e 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_texture.vert +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_texture.vert @@ -1,30 +1,31 @@ -//#version 100 +//#version 100 attribute highp vec4 vertex; attribute highp vec3 normals; -attribute highp vec2 v_texCoord; +attribute highp vec2 v_texCoord; uniform highp mat4 mvp_matrix; -uniform highp mat4 mv_matrix; -uniform highp mat4 f_matrix; -uniform highp int is_two_side; -uniform highp vec4 light_pos; -uniform highp vec4 light_diff; -uniform highp vec3 light_spec; -uniform highp vec4 light_amb; -uniform highp float spec_power; -varying highp vec3 fColors; -varying highp vec2 f_texCoord; - +uniform highp mat4 mv_matrix; +uniform highp mat4 norm_matrix; +uniform highp mat4 f_matrix; +uniform highp int is_two_side; +uniform highp vec4 light_pos; +uniform highp vec4 light_diff; +uniform highp vec3 light_spec; +uniform highp vec4 light_amb; +uniform highp float spec_power; +varying highp vec3 fColors; +varying highp vec2 f_texCoord; + uniform highp float point_size; void main(void) { gl_PointSize = point_size; highp vec4 P = mv_matrix * vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - highp vec3 N = mv_matrix_3* normals; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + highp vec3 N = norm_matrix_3* normals; highp vec3 L = light_pos.xyz - P.xyz; N = normalize(N); L = normalize(L); @@ -36,4 +37,4 @@ void main(void) f_texCoord = v_texCoord; fColors = vec3(1.0, 1.0, 1.0) * (light_amb.xyz + diffuse); gl_Position = mvp_matrix * f_matrix * vertex; -} +} diff --git a/Polyhedron/demo/Polyhedron/resources/heat_intensity_shader.vert b/Polyhedron/demo/Polyhedron/resources/heat_intensity_shader.vert index c49cf68cbe5..14d9049656c 100644 --- a/Polyhedron/demo/Polyhedron/resources/heat_intensity_shader.vert +++ b/Polyhedron/demo/Polyhedron/resources/heat_intensity_shader.vert @@ -4,9 +4,10 @@ in vec3 normals; in vec4 colors; in float distance; uniform mat4 mvp_matrix; -uniform mat4 mv_matrix; -out vec4 fP; -out vec3 fN; +uniform mat4 mv_matrix; +uniform mat4 norm_matrix; +out vec4 fP; +out vec3 fN; out vec4 color; out float dist[6]; out float out_distance; @@ -42,11 +43,11 @@ void main(void) if(is_clipbox_on) compute_distances(); fP = mv_matrix * vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; out_distance = distance; gl_Position = mvp_matrix * vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.vert b/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.vert index a0654e57e17..727e4b07d9a 100644 --- a/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.vert +++ b/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.vert @@ -13,11 +13,12 @@ out VS_OUT uniform mat4 mvp_matrix; uniform mat4 mv_matrix; +uniform mat4 norm_matrix; void main(void) { vs_out.out_color=colors; vs_out.fP = mv_matrix * vertex; - vs_out.fN = mat3(mv_matrix)* normals; + vs_out.fN = mat3(norm_matrix)* normals; gl_Position = mvp_matrix * vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert index 2c3b6bd0114..c9570f479e4 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert @@ -5,24 +5,25 @@ in vec3 colors; in vec3 center; uniform mat4 mvp_matrix; uniform mat4 mv_matrix; +uniform mat4 norm_matrix; uniform vec4 cutplane; uniform float shrink_factor; -out vec4 fP; -out vec3 fN; -out vec4 color; +out vec4 fP; +out vec3 fN; +out vec4 color; uniform float point_size; void main(void) { gl_PointSize = point_size; color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w); - fP = mv_matrix * vertex; + fP = mv_matrix * vertex; + + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; - mat4 transOB = mat4(1, 0, 0, 0, // first column 0, 1, 0, 0, // second column 0, 0, 1, 0, // third column diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3_spheres.vert b/Polyhedron/demo/Polyhedron/resources/shader_c3t3_spheres.vert index 6559d41db35..4b38487224e 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3_spheres.vert +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3_spheres.vert @@ -7,6 +7,7 @@ in float radius; uniform vec4 cutplane; uniform mat4 mvp_matrix; uniform mat4 mv_matrix; +uniform mat4 norm_matrix; out vec4 fP; out vec3 fN; out vec4 color; @@ -17,10 +18,10 @@ void main(void) color = vec4(colors, center.x * cutplane.x + center.y * cutplane.y + center.z * cutplane.z + cutplane.w); vec4 my_vertex = vec4(radius*vertex.x + center.x, radius* vertex.y + center.y, radius*vertex.z + center.z, 1.0) ; fP = mv_matrix * my_vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; gl_Position = mvp_matrix * my_vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/shader_instanced.vert b/Polyhedron/demo/Polyhedron/resources/shader_instanced.vert index 991b5ae18b1..44dd2586792 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_instanced.vert +++ b/Polyhedron/demo/Polyhedron/resources/shader_instanced.vert @@ -5,6 +5,7 @@ in vec3 colors; in vec3 center; uniform mat4 mvp_matrix; uniform mat4 mv_matrix; +uniform mat4 norm_matrix; out vec4 fP; out vec3 fN; out vec4 color; @@ -17,10 +18,10 @@ void main(void) color = vec4(colors, 1.0); vec4 my_vertex = vec4(vertex.x + center.x, vertex.y + center.y, vertex.z + center.z, 1.0); fP = mv_matrix * my_vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; gl_Position = mvp_matrix * my_vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/shader_spheres.vert b/Polyhedron/demo/Polyhedron/resources/shader_spheres.vert index 8a97ca290ba..68b0babf8a0 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_spheres.vert +++ b/Polyhedron/demo/Polyhedron/resources/shader_spheres.vert @@ -6,6 +6,7 @@ in vec3 center; in float radius; uniform mat4 mvp_matrix; uniform mat4 mv_matrix; +uniform mat4 norm_matrix; uniform mat4 f_matrix; out vec4 fP; out vec3 fN; @@ -16,15 +17,16 @@ uniform float point_size; void main(void) { gl_PointSize = point_size; - for(int i=0; i<6; ++i) - dist[i] = 1.0; + for(int i=0; i<6; ++i) + dist[i] = 1.0; color = vec4(colors, 1.0); - fP = mv_matrix * vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; - gl_Position = mvp_matrix * f_matrix * - vec4(radius*vertex.x + center.x, radius* vertex.y + center.y, radius*vertex.z + center.z, 1.0) ; + vec4 transformed_vertex = + vec4(radius*vertex.x + center.x, radius* vertex.y + center.y, radius*vertex.z + center.z, 1.0); + fP = mv_matrix * transformed_vertex; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; + gl_Position = mvp_matrix * f_matrix * transformed_vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/shader_with_light.vert b/Polyhedron/demo/Polyhedron/resources/shader_with_light.vert index 47a9c7666be..7cd423a588a 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_with_light.vert +++ b/Polyhedron/demo/Polyhedron/resources/shader_with_light.vert @@ -3,10 +3,11 @@ in vec4 vertex; in vec3 normals; in vec4 colors; uniform mat4 mvp_matrix; -uniform mat4 mv_matrix; -uniform mat4 f_matrix; -out vec4 fP; -out vec3 fN; +uniform mat4 mv_matrix; +uniform mat4 norm_matrix; +uniform mat4 f_matrix; +out vec4 fP; +out vec3 fN; out vec4 color; out float dist[6]; uniform bool is_clipbox_on; @@ -36,14 +37,13 @@ void main(void) { gl_PointSize = point_size; color = colors; - // if(is_clipbox_on) compute_distances(); fP = mv_matrix * f_matrix * vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - fN = mv_matrix_3* normals; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + fN = norm_matrix_3* normals; gl_Position = mvp_matrix * f_matrix * vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/shader_with_texture.vert b/Polyhedron/demo/Polyhedron/resources/shader_with_texture.vert index bba4c5cd098..cdcc60f82bd 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_with_texture.vert +++ b/Polyhedron/demo/Polyhedron/resources/shader_with_texture.vert @@ -1,39 +1,40 @@ #version 150 in vec4 vertex; in vec3 normals; -in vec2 v_texCoord; +in vec2 v_texCoord; uniform mat4 mvp_matrix; -uniform mat4 mv_matrix; -uniform mat4 f_matrix; -uniform int is_two_side; -uniform vec4 light_pos; -uniform vec4 light_diff; -uniform vec3 light_spec; -uniform vec4 light_amb; -uniform float spec_power; -out vec3 fColors; -out vec2 f_texCoord; - +uniform mat4 mv_matrix; +uniform mat4 norm_matrix; +uniform mat4 f_matrix; +uniform int is_two_side; +uniform vec4 light_pos; +uniform vec4 light_diff; +uniform vec3 light_spec; +uniform vec4 light_amb; +uniform float spec_power; +out vec3 fColors; +out vec2 f_texCoord; + uniform float point_size; void main(void) { gl_PointSize = point_size; - vec4 P = mv_matrix * vertex; - mat3 mv_matrix_3; - mv_matrix_3[0] = mv_matrix[0].xyz; - mv_matrix_3[1] = mv_matrix[1].xyz; - mv_matrix_3[2] = mv_matrix[2].xyz; - vec3 N = mv_matrix_3* normals; - vec3 L = light_pos.xyz - P.xyz; - N = normalize(N); - L = normalize(L); + vec4 P = mv_matrix * vertex; + mat3 norm_matrix_3; + norm_matrix_3[0] = norm_matrix[0].xyz; + norm_matrix_3[1] = norm_matrix[1].xyz; + norm_matrix_3[2] = norm_matrix[2].xyz; + vec3 N = norm_matrix_3* normals; + vec3 L = light_pos.xyz - P.xyz; + N = normalize(N); + L = normalize(L); vec3 diffuse; - if(is_two_side == 1) - diffuse = abs(dot(N,L)) * light_diff.xyz; - else - diffuse = max(dot(N,L), 0.0) * light_diff.xyz; - f_texCoord = v_texCoord; + if(is_two_side == 1) + diffuse = abs(dot(N,L)) * light_diff.xyz; + else + diffuse = max(dot(N,L), 0.0) * light_diff.xyz; + f_texCoord = v_texCoord; fColors = vec3(1.0, 1.0, 1.0) * (light_amb.xyz + diffuse); - gl_Position = mvp_matrix * f_matrix * vertex; -} + gl_Position = mvp_matrix * f_matrix * vertex; +} diff --git a/Polyhedron/include/CGAL/IO/Polyhedron_scan_OFF.h b/Polyhedron/include/CGAL/IO/Polyhedron_scan_OFF.h index ce4acc9f5bf..51935383f32 100644 --- a/Polyhedron/include/CGAL/IO/Polyhedron_scan_OFF.h +++ b/Polyhedron/include/CGAL/IO/Polyhedron_scan_OFF.h @@ -114,7 +114,7 @@ void Polyhedron_scan_OFF:: operator()(HDS& target) std::cerr << " " << std::endl; std::cerr << "Polyhedron_scan_OFF::" << std::endl; std::cerr << "operator()(): input error: facet " << i - << " has less than 3 vertices." << std::endl; + << " has fewer than 3 vertices." << std::endl; } B.rollback(); diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index d13a66dbbec..e5220aa58f3 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -16,7 +16,7 @@ #include #ifdef CGAL_USE_BASIC_VIEWER - +#include #include #include #include @@ -45,6 +45,7 @@ void draw(const CGAL_POLY_TYPE& apoly, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc=2; const char* argv[2]={"polyhedron_viewer","--old"}; QApplication app(argc,const_cast(argv)); diff --git a/Polyhedron/test/Polyhedron/test_polyhedron_range_based_loops.cpp b/Polyhedron/test/Polyhedron/test_polyhedron_range_based_loops.cpp index da08b8d781f..ee04f5385e1 100644 --- a/Polyhedron/test/Polyhedron/test_polyhedron_range_based_loops.cpp +++ b/Polyhedron/test/Polyhedron/test_polyhedron_range_based_loops.cpp @@ -38,7 +38,7 @@ void test_const_vertex_handles_and_points( auto pit = polyhedron.points_begin(); auto vit = polyhedron.vertices_begin(); - for (const auto vh : polyhedron.vertex_handles()) { + for (const auto& vh : polyhedron.vertex_handles()) { assert(vh == vit); assert(vh->point() == vit->point()); assert(vh->point() == *pit); @@ -88,7 +88,7 @@ void test_const_facet_handles_and_planes( auto pit = polyhedron.planes_begin(); auto fit = polyhedron.facets_begin(); - for (const auto fh : polyhedron.facet_handles()) { + for (const auto& fh : polyhedron.facet_handles()) { assert(fh == fit); assert(fh->plane() == fit->plane()); assert(fh->plane() == *pit); @@ -133,7 +133,7 @@ void test_const_halfedge_handles_and_edges( const Polyhedron& polyhedron) { auto hit = polyhedron.halfedges_begin(); - for (const auto hh : polyhedron.halfedge_handles()) { + for (const auto& hh : polyhedron.halfedge_handles()) { assert(hh == hit); assert(hh->facet() == hit->facet()); assert(hh->vertex() == hit->vertex()); diff --git a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt index 65c33cb6436..19f85245921 100644 --- a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt +++ b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt @@ -17,7 +17,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) set(CMAKE_INCLUDE_CURRENT_DIR ON) -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Widgets Svg) +find_package(Qt5 QUIET COMPONENTS Script OpenGL Widgets Svg) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include) if(CGAL_Qt5_FOUND AND Qt5_FOUND) diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Polyline_simplification_2.txt b/Polyline_simplification_2/doc/Polyline_simplification_2/Polyline_simplification_2.txt index 63a0387263f..1900522d579 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Polyline_simplification_2.txt +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Polyline_simplification_2.txt @@ -167,6 +167,16 @@ over all vertices of all polyline constraints. \cgalExample{Polyline_simplification_2/simplify.cpp} +Note that when polylines share subsequences of polyline vertices they can get simplified simultaneously. + +\cgalFigureBegin{figure_overlapping_polylines, overlapping_polylines.png} +Simplification of overlapping subsequence of polyline vertices +\cgalFigureEnd + +\cgalExample{Polyline_simplification_2/simplify_overlapping_polylines.cpp} + + + \subsection Subsection_PolylineSimplification_Keeping Keeping Points While Removing Vertices diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/examples.txt b/Polyline_simplification_2/doc/Polyline_simplification_2/examples.txt index a0713d4fd20..4f5338858ee 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/examples.txt +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/examples.txt @@ -1,6 +1,7 @@ /*! \example Polyline_simplification_2/simplify_polygon.cpp \example Polyline_simplification_2/simplify.cpp +\example Polyline_simplification_2/simplify_overlapping_polylines.cpp \example Polyline_simplification_2/simplify_terrain.cpp \example Polyline_simplification_2/points_and_vertices.cpp */ diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/fig/overlapping_polylines.png b/Polyline_simplification_2/doc/Polyline_simplification_2/fig/overlapping_polylines.png new file mode 100644 index 00000000000..83b27735ab3 Binary files /dev/null and b/Polyline_simplification_2/doc/Polyline_simplification_2/fig/overlapping_polylines.png differ diff --git a/Polyline_simplification_2/examples/Polyline_simplification_2/simplify_overlapping_polylines.cpp b/Polyline_simplification_2/examples/Polyline_simplification_2/simplify_overlapping_polylines.cpp new file mode 100644 index 00000000000..96fa16269a3 --- /dev/null +++ b/Polyline_simplification_2/examples/Polyline_simplification_2/simplify_overlapping_polylines.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include +#include + +namespace PS = CGAL::Polyline_simplification_2; + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; + +typedef PS::Vertex_base_2 Vb; +typedef CGAL::Constrained_triangulation_face_base_2 Fb; +typedef CGAL::Triangulation_data_structure_2 TDS; +typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; +typedef CGAL::Constrained_triangulation_plus_2 CT; + +typedef CT::Point Point; +typedef CT::Constraint_iterator Constraint_iterator; +typedef CT::Vertices_in_constraint_iterator Vertices_in_constraint_iterator; +typedef CT::Points_in_constraint_iterator Points_in_constraint_iterator; +typedef PS::Stop_below_count_ratio_threshold Stop; +typedef PS::Squared_distance_cost Cost; + +int main() +{ + CT ct; + + std::vector P = { Point(0,1), Point(1,1), Point(2,2), Point(3,1), Point(4,1), Point(4,2), Point(4,1), Point(5,1) }; + std::vector Q = { Point(5,0), Point(4,1), Point(3,1), Point(2,2), Point(1,1), Point(0,0) }; + std::vector R = { Point(3,1), Point(4,1) }; + + ct.insert_constraint(P); + ct.insert_constraint(Q); + ct.insert_constraint(R); + + PS::simplify(ct, Cost(), Stop(0.5)); + + for(Constraint_iterator cit = ct.constraints_begin(); + cit != ct.constraints_end(); + ++cit) { + std::cout << "simplified polyline" << std::endl; + for(Points_in_constraint_iterator vit = + ct.points_in_constraint_begin(*cit); + vit != ct.points_in_constraint_end(*cit); + ++vit) + std::cout << *vit << std::endl; + } + return 0; +} 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 b1d090583f8..d5f2856e239 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 @@ -37,6 +37,9 @@ class Vertex_base_2 bool m_removable; FT m_cost; +public: + std::size_t ID; + #ifndef DOXYGEN_RUNNING public: template < typename TDS2 > 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 2b6aca31f9f..ee681c767d4 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -57,11 +58,15 @@ class Polyline_simplification_2 public: typedef typename PCT::Point Point; + typedef typename PCT::Edge Edge; typedef typename PCT::Constraint_id Constraint_id; + typedef typename PCT::Constrained_edges_iterator Constrained_edges_iterator; typedef typename PCT::Constraint_iterator Constraint_iterator; typedef typename PCT::Vertices_in_constraint_iterator Vertices_in_constraint_iterator; + typedef typename PCT::Finite_vertices_iterator Finite_vertices_iterator; //typedef typename PCT::Points_in_constraint_iterator Points_in_constraint_iterator; typedef typename PCT::Vertex_handle Vertex_handle; + typedef typename PCT::Face_handle Face_handle; typedef typename PCT::Vertex_circulator Vertex_circulator; typedef typename PCT::Geom_traits::FT FT; @@ -71,6 +76,7 @@ public: StopFunction stop; std::size_t pct_initial_number_of_vertices, number_of_unremovable_vertices; + std::unordered_map > vertex_to_iterator; struct Compare_cost { @@ -79,6 +85,12 @@ public: { return (*x)->cost() < (*y)->cost(); } + + bool operator() (const Vertex_handle& x,const Vertex_handle& y) const + { + return x->cost() < y->cost(); + } + } ; struct Id_map : public boost::put_get_helper @@ -86,12 +98,16 @@ public: typedef boost::readable_property_map_tag category; typedef std::size_t value_type; typedef value_type reference; - typedef Vertices_in_constraint_iterator key_type; + typedef Vertex_handle key_type; - reference operator[] ( key_type const& x ) const { return x.base()->id ; } + + reference operator[] ( key_type const& x ) const + { + return x->ID; + } } ; - typedef CGAL::Modifiable_priority_queue MPQ ; + typedef CGAL::Modifiable_priority_queue MPQ ; MPQ* mpq; @@ -124,24 +140,64 @@ public: delete mpq; } + // endpoints of constraints are unremovable + // vertices which are not endpoint and have != 2 incident constrained edges are unremovable void initialize_unremovable() { - std::set vertices; Constraint_iterator cit = pct.constraints_begin(), e = pct.constraints_end(); for(; cit!=e; ++cit){ Constraint_id cid = *cit; - Vertices_in_constraint_iterator it = pct.vertices_in_constraint_begin(cid); + Vertices_in_constraint_iterator it = pct.vertices_in_constraint_begin(cid), + ite = pct.vertices_in_constraint_end(cid); (*it)->set_removable(false); - for(; it != pct.vertices_in_constraint_end(cid); ++it){ - if(vertices.find(*it) != vertices.end()){ + ++it; + for(; it != ite; ++it){ + if((boost::next(it) != ite) && (boost::prior(it)== boost::next(it))){ (*it)->set_removable(false); - } else { - vertices.insert(*it); } } it = boost::prior(it); (*it)->set_removable(false); } + + std::unordered_map degrees; + for (Constrained_edges_iterator it = pct.constrained_edges_begin(); it != pct.constrained_edges_end(); ++it) { + Edge e = *it; + Face_handle fh = e.first; + int ei = e.second; + Vertex_handle vh = fh->vertex(pct.cw(ei)); + ++degrees[vh]; + vh = fh->vertex(pct.ccw(ei)); + ++degrees[vh]; + } + + for(Finite_vertices_iterator it = pct.finite_vertices_begin(); it != pct.finite_vertices_end(); ++it){ + if( it->is_removable() && (degrees[it] != 2) ){ + it->set_removable(false); + } + } + + cit = pct.constraints_begin(), e = pct.constraints_end(); + for(; cit!=e; ++cit){ + Constraint_id cid = *cit; + for(Vertices_in_constraint_iterator it = pct.vertices_in_constraint_begin(cid); + it != pct.vertices_in_constraint_end(cid); + ++it){ + if((*it)->is_removable()){ + typename std::unordered_map >::iterator lit; + lit = vertex_to_iterator.find(*it); + + if(lit != vertex_to_iterator.end()){ + std::list& ilist = lit->second; + if(std::find(ilist.begin(),ilist.end(),it) == ilist.end()){ + ilist.push_back(it); + } + }else{ + vertex_to_iterator[*it].push_back(it); + } + } + } + } } // For all polyline constraints we compute the cost of all unremovable and not removed vertices @@ -156,7 +212,9 @@ public: boost::optional dist = cost(pct, it); if(dist){ (*it)->set_cost(*dist); - (*mpq).push(it); + if(! (*mpq).contains(*it)){ + (*mpq).push(*it); + } ++n; } else { // no need to set the costs as this vertex is not in the priority queue @@ -230,7 +288,9 @@ public: for(Vertices_in_constraint_iterator it = pct.vertices_in_constraint_begin(cid); it != pct.vertices_in_constraint_end(cid); ++it){ - it.base()->id = id++; + Vertex_handle vh = *it; + vh->ID = id++; + //vertex_index_map[vh] = id++; } return id; } @@ -239,9 +299,9 @@ public: initialize_indices() { int id = 0; - Constraint_iterator b = pct.constraints_begin(), e = pct.constraints_end(); - for(; b!=e; ++b){ - id = initialize_indices(*b, id); + + for(Finite_vertices_iterator it = pct.finite_vertices_begin(); it != pct.finite_vertices_end(); ++it){ + it->ID = id++; } return id; } @@ -252,29 +312,31 @@ operator()() if((*mpq).empty()){ return false; } - Vertices_in_constraint_iterator v = (*mpq).top(); + Vertex_handle v = (*mpq).top(); (*mpq).pop(); - if(stop(pct, *v, (*v)->cost(), pct_initial_number_of_vertices, pct.number_of_vertices())){ + if(stop(pct, v, v->cost(), pct_initial_number_of_vertices, pct.number_of_vertices())){ return false; } - if(is_removable(v)){ - Vertices_in_constraint_iterator u = boost::prior(v), w = boost::next(v); - pct.simplify(v); + + 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); + pct.simplify(vit); if((*u)->is_removable()){ boost::optional dist = cost(pct, u); if(! dist){ // cost is undefined - if( mpq->contains(u) ){ - mpq->erase(u); + if( mpq->contains(*u) ){ + mpq->erase(*u); } } else { (*u)->set_cost(*dist); - if(mpq->contains(u)){ - mpq->update(u, true); + if(mpq->contains(*u)){ + mpq->update(*u, true); } else{ - mpq->push(u); + mpq->push(*u); } } } @@ -283,16 +345,16 @@ operator()() boost::optional dist = cost(pct, w); if(! dist){ // cost is undefined - if( mpq->contains(w) ){ - mpq->erase(w); + if( mpq->contains(*w) ){ + mpq->erase(*w); } } else { (*w)->set_cost(*dist); - if(mpq->contains(w)){ - mpq->update(w, true); + if(mpq->contains(*w)){ + mpq->update(*w, true); } else{ - mpq->push(w); + mpq->push(*w); } } diff --git a/Polytope_distance_d/include/CGAL/Polytope_distance_d.h b/Polytope_distance_d/include/CGAL/Polytope_distance_d.h index 3f6a4b74f93..b52d1ca7219 100644 --- a/Polytope_distance_d/include/CGAL/Polytope_distance_d.h +++ b/Polytope_distance_d/include/CGAL/Polytope_distance_d.h @@ -665,9 +665,8 @@ private: check_dimension( InputIterator first, InputIterator last) { return ( std::find_if ( first, last, - CGAL::compose1_1 - ( boost::bind2nd(std::not_equal_to(), d), - tco.access_dimension_d_object())) + [this](const auto& o) + { return this->tco.access_dimension_d_object()(o) != this->d; }) == last); } // compute (squared) distance diff --git a/Polytope_distance_d/include/CGAL/all_furthest_neighbors_2.h b/Polytope_distance_d/include/CGAL/all_furthest_neighbors_2.h index ad05b31358a..d2927f43d6b 100644 --- a/Polytope_distance_d/include/CGAL/all_furthest_neighbors_2.h +++ b/Polytope_distance_d/include/CGAL/all_furthest_neighbors_2.h @@ -22,7 +22,6 @@ #include #include #include -#include namespace CGAL { template < class Operation, class RandomAccessIC > @@ -116,7 +115,7 @@ all_furthest_neighbors_2( RandomAccessIC points_begin, return transform(v.begin(), v.end(), o, - boost::bind(modulus(), _1, number_of_points)); + [number_of_points](int i){ return i % number_of_points;} ); } // all_furthest_neighbors_2( ... ) diff --git a/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt b/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt index d042796fba0..67a8e78c844 100644 --- a/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt +++ b/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt @@ -18,8 +18,8 @@ include_directories(./) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "NOTICE: This project requires the Eigen library, and will not be compiled." @@ -28,7 +28,7 @@ if(NOT TARGET CGAL::Eigen_support) endif() # Find Qt5 itself -find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL) +find_package(Qt5 QUIET COMPONENTS Script OpenGL) if(CGAL_Qt5_FOUND AND Qt5_FOUND) @@ -54,7 +54,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) ${CGAL_Qt5_MOC_FILES}) target_link_libraries(PCA_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - CGAL::Eigen_support Qt5::Gui) + CGAL::Eigen3_support Qt5::Gui) add_to_cached_list(CGAL_EXECUTABLE_TARGETS PCA_demo) diff --git a/Principal_component_analysis/demo/Principal_component_analysis/MainWindow.cpp b/Principal_component_analysis/demo/Principal_component_analysis/MainWindow.cpp index 0676b175517..540480e4926 100644 --- a/Principal_component_analysis/demo/Principal_component_analysis/MainWindow.cpp +++ b/Principal_component_analysis/demo/Principal_component_analysis/MainWindow.cpp @@ -25,9 +25,6 @@ MainWindow::MainWindow(QWidget* parent) // saves some pointers from ui, for latter use. m_pViewer = ui->viewer; - // does not save the state of the viewer - m_pViewer->setStateFileName(QString()); - // accepts drop events setAcceptDrops(true); @@ -48,6 +45,7 @@ MainWindow::MainWindow(QWidget* parent) MainWindow::~MainWindow() { + m_pViewer->makeCurrent(); delete ui; } 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 f1b7a78b624..04b8cf11f13 100644 --- a/Principal_component_analysis/demo/Principal_component_analysis/PCA_demo.cpp +++ b/Principal_component_analysis/demo/Principal_component_analysis/PCA_demo.cpp @@ -18,9 +18,12 @@ #include "MainWindow.h" #include #include +#include int main(int argc, char **argv) { + CGAL::Qt::init_ogl_context(2, 1); + QApplication app(argc, argv); app.setOrganizationDomain("inria.fr"); app.setOrganizationName("INRIA"); diff --git a/Principal_component_analysis/demo/Principal_component_analysis/Scene.cpp b/Principal_component_analysis/demo/Principal_component_analysis/Scene.cpp index e75392cb62d..a4c60dd0a54 100644 --- a/Principal_component_analysis/demo/Principal_component_analysis/Scene.cpp +++ b/Principal_component_analysis/demo/Principal_component_analysis/Scene.cpp @@ -28,6 +28,7 @@ Scene::Scene() Scene::~Scene() { + delete m_pPolyhedron; } diff --git a/Principal_component_analysis/examples/Principal_component_analysis/CMakeLists.txt b/Principal_component_analysis/examples/Principal_component_analysis/CMakeLists.txt index 187bada3b77..7499ccf9c83 100644 --- a/Principal_component_analysis/examples/Principal_component_analysis/CMakeLists.txt +++ b/Principal_component_analysis/examples/Principal_component_analysis/CMakeLists.txt @@ -8,7 +8,7 @@ find_package(CGAL REQUIRED) # Use Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) # create a target per cppfile file( @@ -17,8 +17,8 @@ file( ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) foreach(cppfile ${cppfiles}) create_single_source_cgal_program("${cppfile}") - if(TARGET CGAL::Eigen_support) + if(TARGET CGAL::Eigen3_support) get_filename_component(target ${cppfile} NAME_WE) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endif() endforeach() diff --git a/Principal_component_analysis/test/Principal_component_analysis/CMakeLists.txt b/Principal_component_analysis/test/Principal_component_analysis/CMakeLists.txt index e8d85bd9a6e..498476cdf5c 100644 --- a/Principal_component_analysis/test/Principal_component_analysis/CMakeLists.txt +++ b/Principal_component_analysis/test/Principal_component_analysis/CMakeLists.txt @@ -8,7 +8,7 @@ find_package(CGAL REQUIRED) # Use Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) # create a target per cppfile file( @@ -17,8 +17,8 @@ file( ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) foreach(cppfile ${cppfiles}) create_single_source_cgal_program("${cppfile}") - if(TARGET CGAL::Eigen_support) + if(TARGET CGAL::Eigen3_support) get_filename_component(target ${cppfile} NAME_WE) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endif() endforeach() diff --git a/Profiling_tools/src/CGAL/Real_timer.cpp b/Profiling_tools/src/CGAL/Real_timer.cpp deleted file mode 100644 index 7fece958091..00000000000 --- a/Profiling_tools/src/CGAL/Real_timer.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 1997 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Lutz Kettner -// Matthias Baesken - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -namespace CGAL { - -bool Real_timer::m_failed = false; - -} //namespace CGAL - -#endif // CGAL_HEADER_ONLY diff --git a/Profiling_tools/src/CGAL/Timer.cpp b/Profiling_tools/src/CGAL/Timer.cpp deleted file mode 100644 index 217e3d8f459..00000000000 --- a/Profiling_tools/src/CGAL/Timer.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 1997 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Lutz Kettner -// Matthias Baesken - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -namespace CGAL { - -bool Timer::m_failed = false; - -} //namespace CGAL - -#endif // CGAL_HEADER_ONLY diff --git a/Property_map/examples/Property_map/CMakeLists.txt b/Property_map/examples/Property_map/CMakeLists.txt index be6fba245bf..08681627989 100644 --- a/Property_map/examples/Property_map/CMakeLists.txt +++ b/Property_map/examples/Property_map/CMakeLists.txt @@ -24,8 +24,8 @@ endif() create_single_source_cgal_program("dynamic_properties.cpp") find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("custom_property_map.cpp") - target_link_libraries(custom_property_map PUBLIC CGAL::Eigen_support) + target_link_libraries(custom_property_map PUBLIC CGAL::Eigen3_support) endif() diff --git a/Property_map/include/CGAL/property_map.h b/Property_map/include/CGAL/property_map.h index affbadb93b6..8fce0f606fd 100644 --- a/Property_map/include/CGAL/property_map.h +++ b/Property_map/include/CGAL/property_map.h @@ -469,7 +469,7 @@ struct Constant_property_map typedef KeyType key_type; typedef ValueType value_type; - typedef value_type& reference; + typedef const value_type& reference; typedef boost::read_write_property_map_tag category; Constant_property_map(const value_type& default_value = value_type()) : default_value (default_value) { } diff --git a/QP_solver/include/CGAL/QP_solution.h b/QP_solver/include/CGAL/QP_solution.h index f1908434cc5..722acf3e7dc 100644 --- a/QP_solver/include/CGAL/QP_solution.h +++ b/QP_solver/include/CGAL/QP_solution.h @@ -27,8 +27,6 @@ #include #include #include -#include -#include #include #include @@ -75,7 +73,7 @@ public: typedef QP_solution_detail::Quotient_normalizer Quotient_normalizer; // normalizer (ET, ET) -> (ET, ET) - typedef boost::function1< Quotient, ET > + typedef std::function< Quotient(const ET&) > Quotient_maker; typedef std::vector @@ -130,10 +128,7 @@ public: ET n = solution_numerator(); ET d = solution_denominator(); return - boost::bind - (Quotient_normalizer(), boost::bind - (U_Quotient_creator(), _1, _2)) - (n, d); + Quotient_normalizer()( U_Quotient_creator()(n,d) ); // (solution_numerator(), solution_denominator()); } virtual Quadratic_program_status status() const = 0; @@ -164,20 +159,22 @@ public: original_variable_values_begin( ) const { return Variable_value_iterator (original_variables_numerator_begin(), - boost::bind - (boost::bind - (Quotient_normalizer(), boost::bind - (U_Quotient_creator(), _1, _2)), _1, variables_common_denominator())); + [this](const ET& n) + { + return Quotient_normalizer()( + U_Quotient_creator()(n, this->variables_common_denominator())); + }); } Variable_value_iterator original_variable_values_end ( ) const { return Variable_value_iterator (original_variables_numerator_end(), - boost::bind - (boost::bind - (Quotient_normalizer(), boost::bind - (U_Quotient_creator(), _1, _2)), _1, variables_common_denominator())); + [this](const ET& n) + { + return Quotient_normalizer()( + U_Quotient_creator()(n, this->variables_common_denominator())); + }); } // Basic variables and constraints @@ -234,10 +231,11 @@ public: { return Lambda_iterator (lambda_numerator_begin(), - boost::bind - (boost::bind - (Quotient_normalizer(), boost::bind - (U_Quotient_creator(), _1, _2)), _1, variables_common_denominator())); + [this](const ET& n) + { + return Quotient_normalizer()( + U_Quotient_creator()(n, this->variables_common_denominator())); + }); } Lambda_iterator @@ -245,10 +243,11 @@ public: { return Lambda_iterator (lambda_numerator_end(), - boost::bind - (boost::bind - (Quotient_normalizer(), boost::bind - (U_Quotient_creator(), _1, _2)), _1, variables_common_denominator())); + [this](const ET& n) + { + return Quotient_normalizer()( + U_Quotient_creator()(n, this->variables_common_denominator())); + }); } // destruction diff --git a/QP_solver/include/CGAL/QP_solver/QP_basis_inverse.h b/QP_solver/include/CGAL/QP_solver/QP_basis_inverse.h index 91aaa9972f8..b9f3906da7e 100644 --- a/QP_solver/include/CGAL/QP_solver/QP_basis_inverse.h +++ b/QP_solver/include/CGAL/QP_solver/QP_basis_inverse.h @@ -410,7 +410,7 @@ class QP_basis_inverse { m_it1 = M.begin()+l; for ( row = 0; row < s; ++row, ++m_it1) { std::transform( m_it1->begin(), m_it1->begin()+s, m_it1->begin(), - boost::bind2nd( std::multiplies(), d)); + [this](const ET& v){return v * this->d;}); } // new denominator: |det(A_B)|^2 diff --git a/QP_solver/include/CGAL/QP_solver/QP_basis_inverse_impl.h b/QP_solver/include/CGAL/QP_solver/QP_basis_inverse_impl.h index 10873b0db55..04e8f3f36d4 100644 --- a/QP_solver/include/CGAL/QP_solver/QP_basis_inverse_impl.h +++ b/QP_solver/include/CGAL/QP_solver/QP_basis_inverse_impl.h @@ -178,13 +178,10 @@ z_replace_original_by_original(ForwardIterator y_l_it, // tmp_l -part std::transform(y_l_it, (y_l_it+s), x_l.begin(), tmp_l.begin(), - compose2_2(std::plus(), Identity(), - boost::bind1st(std::multiplies(), s_delta))); - + [&s_delta](const ET& v1, const ET& v2){ return std::plus()(v1, s_delta * v2); }); // tmp_x -part std::transform(y_x_it, (y_x_it+b), x_x.begin(), tmp_x.begin(), - compose2_2(std::plus(), Identity(), - boost::bind1st(std::multiplies(), s_delta))); + [&s_delta](const ET& v1, const ET& v2){ return std::plus()(v1, s_delta * v2); }); tmp_x[k_i] -= d; // prepare \hat{k}_{2} -scalar diff --git a/QP_solver/include/CGAL/QP_solver/QP_solver.h b/QP_solver/include/CGAL/QP_solver/QP_solver.h index 74c7bb367e1..889fdf25a1b 100644 --- a/QP_solver/include/CGAL/QP_solver/QP_solver.h +++ b/QP_solver/include/CGAL/QP_solver/QP_solver.h @@ -38,9 +38,6 @@ #include -#include -#include - #include #include @@ -262,7 +259,7 @@ private: typedef QP_matrix_accessor< A_iterator, false, true, false, false> A_accessor; - typedef boost::function1 + typedef std::function A_row_by_index_accessor; typedef boost::transform_iterator < A_row_by_index_accessor, Index_iterator > @@ -1500,9 +1497,12 @@ transition( Tag_false) inv_M_B.transition (boost::make_transform_iterator (B_O.begin(), - boost::bind - (D_transition_creator_iterator(), B_O.begin(), - boost::bind (D_transition_creator_accessor(), qp_D, _1)))); + [this](int i) + { + return D_transition_creator_iterator()( + this->B_O.begin(),D_transition_creator_accessor()(this->qp_D, i)); + }) + ); } template < typename Q, typename ET, typename Tags > inline // LP case @@ -1597,12 +1597,10 @@ ratio_test_1__q_x_S( Tag_false) A_by_index_iterator( S_B.begin(), A_by_index_accessor( *(qp_A + j))), q_x_S.begin(), - boost::bind(std::minus(), - _1, - boost::bind(std::multiplies(), d, - boost::bind( - NT_converter(), - _2)))); + [this](const ET& n1, const RT& n2) + { + return std::minus()(n1,this->d * NT_converter() (n2)); + }); } // q_x_S = -+ ( A_S_BxB_O * q_x_O - A_S_Bxj) @@ -1883,7 +1881,8 @@ basis_matrix_stays_regular() if ( has_ineq && (i >= qp_n)) { // slack variable new_row = slack_A[ i-qp_n].first; A_row_by_index_accessor a_accessor = - boost::bind (A_accessor( qp_A, 0, qp_n), _1, new_row); + [new_row, this](int i){ return A_accessor( this->qp_A, 0, this->qp_n)(i, new_row); }; + typedef typename std::iterator_traits::value_type RT; std::transform(A_row_by_index_iterator( B_O.begin(), a_accessor), A_row_by_index_iterator( B_O.end (), a_accessor), @@ -1940,17 +1939,14 @@ compute__x_B_S( Tag_false /*has_equalities_only_and_full_rank*/, B_by_index_iterator( S_B.end (), b_accessor), x_B_S.begin(), x_B_S.begin(), - compose2_2( std::minus(), - boost::bind1st( std::multiplies(), d), - Identity())); + [this](const ET& n1, const ET& n2) + { return std::minus()(this->d * n1, n2); }); // b_S_B - ( A_S_BxB_O * x_B_O) - r_S_B std::transform(x_B_S.begin(), x_B_S.begin()+S_B.size(), r_S_B.begin(), x_B_S.begin(), - compose2_2(std::minus(), - Identity(), - boost::bind1st( std::multiplies(), d))); - + [this](const ET& n1, const ET& n2) + { return std::minus()(n1, this->d * n2); }); // x_B_S = +- ( b_S_B - A_S_BxB_O * x_B_O) Value_iterator x_it = x_B_S.begin(); diff --git a/QP_solver/include/CGAL/QP_solver/QP_solver_impl.h b/QP_solver/include/CGAL/QP_solver/QP_solver_impl.h index bc3788745b2..2d3a66015ef 100644 --- a/QP_solver/include/CGAL/QP_solver/QP_solver_impl.h +++ b/QP_solver/include/CGAL/QP_solver/QP_solver_impl.h @@ -14,7 +14,6 @@ // Kaspar Fischer #include -#include #include namespace CGAL { @@ -64,9 +63,7 @@ transition( ) std::transform( C_by_index_iterator( B_O.begin(), c_accessor), C_by_index_iterator( B_O.end (), c_accessor), minus_c_B.begin(), - boost::bind( - NT_converter(), - boost::bind(std::negate(), _1))); + [](const RT& n){return NT_converter()(-n);} ); // compute initial solution of phase II compute_solution(Is_nonnegative()); @@ -1438,7 +1435,7 @@ replace_variable_slack_slack( ) // update basis inverse A_row_by_index_accessor a_accessor = - boost::bind( A_accessor( qp_A, 0, qp_n), _1, new_row); + [new_row, this](int i){ return A_accessor( this->qp_A, 0, this->qp_n)(i, new_row); }; typedef typename std::iterator_traits::value_type RT; std::transform(A_row_by_index_iterator( B_O.begin(), a_accessor), A_row_by_index_iterator( B_O.end (), a_accessor), @@ -1591,7 +1588,7 @@ replace_variable_original_slack( ) // update basis inverse A_row_by_index_accessor a_accessor = - boost::bind (A_accessor( qp_A, 0, qp_n), _1, new_row); + [new_row, this](int i){ return A_accessor( this->qp_A, 0, this->qp_n)(i, new_row); }; typedef typename std::iterator_traits::value_type RT; std::transform(A_row_by_index_iterator( B_O.begin(), a_accessor), A_row_by_index_iterator( B_O.end (), a_accessor), @@ -1946,7 +1943,7 @@ leave_variable( ) // update basis inverse A_row_by_index_accessor a_accessor = - boost::bind (A_accessor( qp_A, 0, qp_n), _1, new_row); + [new_row, this](int i){ return A_accessor( this->qp_A, 0, this->qp_n)(i, new_row); }; std::copy( A_row_by_index_iterator( B_O.begin(), a_accessor), A_row_by_index_iterator( B_O.end (), a_accessor), tmp_x.begin()); @@ -2283,7 +2280,7 @@ z_replace_variable_slack_by_original( ) // prepare u A_row_by_index_accessor a_accessor = - boost::bind (A_accessor( qp_A, 0, qp_n), _1, new_row); + [new_row, this](int i){ return A_accessor( this->qp_A, 0, this->qp_n)(i, new_row); }; std::copy( A_row_by_index_iterator( B_O.begin(), a_accessor), A_row_by_index_iterator( B_O.end (), a_accessor), tmp_x.begin()); @@ -2370,7 +2367,7 @@ z_replace_variable_slack_by_slack( ) // update basis inverse // -------------------- A_row_by_index_accessor a_accessor = - boost::bind ( A_accessor( qp_A, 0, qp_n), _1, new_row); + [new_row, this](int i){ return A_accessor( this->qp_A, 0, this->qp_n)(i, new_row); }; std::copy( A_row_by_index_iterator( B_O.begin(), a_accessor), A_row_by_index_iterator( B_O.end (), a_accessor), tmp_x.begin()); @@ -2937,7 +2934,7 @@ check_basis_inverse( Tag_false) } } v_it = std::find_if( q_x_O.begin(), q_x_O.begin()+cols, - boost::bind2nd( std::not_equal_to(), et0)); + [this](const ET& v){ return v != this->et0; }); if ( v_it != q_x_O.begin()+cols) { if ( ! vout4.verbose()) { std::cerr << std::endl << "basis-inverse check: "; @@ -2978,7 +2975,7 @@ check_basis_inverse( Tag_false) } v_it = std::find_if( q_lambda.begin(), q_lambda.begin()+rows, - boost::bind2nd( std::not_equal_to(), et0)); + [this](const ET& v){ return v != this->et0; }); if ( v_it != q_lambda.begin()+rows) { if ( ! vout4.verbose()) { std::cerr << std::endl << "basis-inverse check: "; diff --git a/QP_solver/test/QP_solver/test_bind.cpp b/QP_solver/test/QP_solver/test_bind.cpp index 3733f359200..ce828b73068 100644 --- a/QP_solver/test/QP_solver/test_bind.cpp +++ b/QP_solver/test/QP_solver/test_bind.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include // functor int x int -> Quotient, (a,b) -> a/b // ------------------------------------------------ @@ -20,14 +20,16 @@ struct Quotient_inverter } }; +using namespace std::placeholders; + int main() { // create composed functor (a,b) -> b/a... // --------------------------------------- int three = 3; int two = 2; - std::cout << boost::bind - (Quotient_inverter(), boost::bind + std::cout << std::bind + (Quotient_inverter(), std::bind (Quotient_creator(), _1, _2)) // ...and apply it to (3, 2) // ------------------------- diff --git a/README.md b/README.md index 828e656f4e0..80336987350 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ computational geometry. CGAL Releases ============= -The primary vector of distribution of CGAL are sources tarballs, released +The primary vector of distribution of CGAL are source tarballs, released twice a year, announced on [the web site of CGAL](https://www.cgal.org/). Getting Started with CGAL diff --git a/Random_numbers/src/CGAL/Random.cpp b/Random_numbers/src/CGAL/Random.cpp deleted file mode 100644 index 29e2ce7639a..00000000000 --- a/Random_numbers/src/CGAL/Random.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 1997-2001 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Sven Schönherr - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -namespace CGAL { - - Random default_random; - -} //namespace CGAL - -#endif diff --git a/Ridges_3/examples/Ridges_3/CMakeLists.txt b/Ridges_3/examples/Ridges_3/CMakeLists.txt index 8eb75f8339a..0ea9b19d09c 100644 --- a/Ridges_3/examples/Ridges_3/CMakeLists.txt +++ b/Ridges_3/examples/Ridges_3/CMakeLists.txt @@ -6,37 +6,37 @@ find_package(CGAL REQUIRED) # use either Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) # Link with Boost.ProgramOptions (optional) find_package(Boost QUIET COMPONENTS program_options) - if(TARGET Boost::program_options) - set(Boost_PROGRAM_OPTIONS_LIBRARY Boost::program_options) - endif() + if(Boost_PROGRAM_OPTIONS_FOUND) - if(CGAL_AUTO_LINK_ENABLED) - message(STATUS "Boost.ProgramOptions library: found") + create_single_source_cgal_program(Compute_Ridges_Umbilics.cpp) + target_link_libraries(Compute_Ridges_Umbilics PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program(Ridges_Umbilics_SM.cpp) + target_link_libraries(Ridges_Umbilics_SM PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program(Ridges_Umbilics_LCC.cpp) + target_link_libraries(Ridges_Umbilics_LCC PUBLIC CGAL::Eigen3_support) + if(TARGET Boost::program_options) + target_link_libraries(Compute_Ridges_Umbilics PRIVATE Boost::program_options) + target_link_libraries(Ridges_Umbilics_SM PRIVATE Boost::program_options) + target_link_libraries(Ridges_Umbilics_LCC PRIVATE Boost::program_options) else() - message( - STATUS "Boost.ProgramOptions library: ${Boost_PROGRAM_OPTIONS_LIBRARY}") + target_link_libraries(Compute_Ridges_Umbilics PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) + target_link_libraries(Ridges_Umbilics_SM PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) + target_link_libraries(Ridges_Umbilics_LCC PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) endif() - add_definitions("-DCGAL_USE_BOOST_PROGRAM_OPTIONS") - list(APPEND CGAL_3RD_PARTY_LIBRARIES ${Boost_PROGRAM_OPTIONS_LIBRARY}) + else() + message( + STATUS + "NOTICE: This programs require Boost Program Options and will not be compiled." + ) endif() - - create_single_source_cgal_program(Compute_Ridges_Umbilics.cpp) - target_link_libraries(Compute_Ridges_Umbilics PUBLIC CGAL::Eigen_support) - create_single_source_cgal_program(Ridges_Umbilics_SM.cpp) - target_link_libraries(Ridges_Umbilics_SM PUBLIC CGAL::Eigen_support) - create_single_source_cgal_program(Ridges_Umbilics_LCC.cpp) - target_link_libraries(Ridges_Umbilics_LCC PUBLIC CGAL::Eigen_support) - else() - message( STATUS "NOTICE: This program requires Eigen 3.1 (or greater) and will not be compiled." ) - endif() diff --git a/Ridges_3/examples/Ridges_3/Compute_Ridges_Umbilics.cpp b/Ridges_3/examples/Ridges_3/Compute_Ridges_Umbilics.cpp index 47e014a1102..66516d5e092 100644 --- a/Ridges_3/examples/Ridges_3/Compute_Ridges_Umbilics.cpp +++ b/Ridges_3/examples/Ridges_3/Compute_Ridges_Umbilics.cpp @@ -9,13 +9,9 @@ #include #include #include - - - -#if defined(CGAL_USE_BOOST_PROGRAM_OPTIONS) && ! defined(DONT_USE_BOOST_PROGRAM_OPTIONS) #include + namespace po = boost::program_options; -#endif typedef PolyhedralSurf::Traits Kernel; diff --git a/Ridges_3/examples/Ridges_3/Ridges_Umbilics_LCC.cpp b/Ridges_3/examples/Ridges_3/Ridges_Umbilics_LCC.cpp index 247a6badd3d..5ce258d2909 100644 --- a/Ridges_3/examples/Ridges_3/Ridges_Umbilics_LCC.cpp +++ b/Ridges_3/examples/Ridges_3/Ridges_Umbilics_LCC.cpp @@ -11,10 +11,8 @@ #include #include -#if defined(CGAL_USE_BOOST_PROGRAM_OPTIONS) && ! defined(DONT_USE_BOOST_PROGRAM_OPTIONS) #include namespace po = boost::program_options; -#endif typedef CGAL::Simple_cartesian Kernel; diff --git a/Ridges_3/examples/Ridges_3/Ridges_Umbilics_SM.cpp b/Ridges_3/examples/Ridges_3/Ridges_Umbilics_SM.cpp index 458d1e8ff5a..b73f19cb409 100644 --- a/Ridges_3/examples/Ridges_3/Ridges_Umbilics_SM.cpp +++ b/Ridges_3/examples/Ridges_3/Ridges_Umbilics_SM.cpp @@ -8,10 +8,8 @@ #include #include -#if defined(CGAL_USE_BOOST_PROGRAM_OPTIONS) && ! defined(DONT_USE_BOOST_PROGRAM_OPTIONS) #include namespace po = boost::program_options; -#endif typedef CGAL::Simple_cartesian Kernel; diff --git a/Ridges_3/test/Ridges_3/CMakeLists.txt b/Ridges_3/test/Ridges_3/CMakeLists.txt index 2db2c27d54a..a04ffb65aa6 100644 --- a/Ridges_3/test/Ridges_3/CMakeLists.txt +++ b/Ridges_3/test/Ridges_3/CMakeLists.txt @@ -8,10 +8,10 @@ find_package(CGAL REQUIRED) # use either Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("ridge_test.cpp") - target_link_libraries(ridge_test PUBLIC CGAL::Eigen_support) + target_link_libraries(ridge_test PUBLIC CGAL::Eigen3_support) else() message( diff --git a/STL_Extension/examples/STL_Extension/min_element_if_example.cpp b/STL_Extension/examples/STL_Extension/min_element_if_example.cpp index a2a98015533..32e43c1abfb 100644 --- a/STL_Extension/examples/STL_Extension/min_element_if_example.cpp +++ b/STL_Extension/examples/STL_Extension/min_element_if_example.cpp @@ -14,8 +14,7 @@ int main() std::cout << "min_odd = " << *CGAL::min_element_if(v.begin(), v.end(), - CGAL::compose1_1(boost::bind2nd(std::greater< int >(), 0), - boost::bind2nd(std::modulus< int >(), 2))) + [](int i){ return (i%2) > 0; }) << std::endl; return 0; } diff --git a/STL_Extension/include/CGAL/Handle_for_virtual.h b/STL_Extension/include/CGAL/Handle_for_virtual.h index ae2845e0c36..839139072f7 100644 --- a/STL_Extension/include/CGAL/Handle_for_virtual.h +++ b/STL_Extension/include/CGAL/Handle_for_virtual.h @@ -79,6 +79,7 @@ class Handle_for_virtual ~Handle_for_virtual() { + if(!ptr) return; ptr->remove_reference(); if ( !ptr->is_referenced() ) delete ptr; diff --git a/STL_Extension/include/CGAL/Multiset.h b/STL_Extension/include/CGAL/Multiset.h index 389880ded7c..5be3bc3b41c 100644 --- a/STL_Extension/include/CGAL/Multiset.h +++ b/STL_Extension/include/CGAL/Multiset.h @@ -1196,7 +1196,7 @@ public: /*! * Split the tree such that all remaining objects are less than a given - * key, and all objects greater then (or equal to) this key form + * key, and all objects greater than (or equal to) this key form * a new output tree. [takes O(log n) operations] * \param key The split key. * \param comp_key A comparison functor for comparing keys and objects. diff --git a/STL_Extension/include/CGAL/Spatial_lock_grid_3.h b/STL_Extension/include/CGAL/Spatial_lock_grid_3.h index 1189a120a33..f5d2b6df798 100644 --- a/STL_Extension/include/CGAL/Spatial_lock_grid_3.h +++ b/STL_Extension/include/CGAL/Spatial_lock_grid_3.h @@ -16,8 +16,6 @@ #include -#include - #include #if TBB_IMPLEMENT_CPP0X # include @@ -334,7 +332,7 @@ protected: Spatial_lock_grid_base_3(const Bbox_3 &bbox, int num_grid_cells_per_axis) : m_num_grid_cells_per_axis(num_grid_cells_per_axis), - m_tls_grids(boost::bind(init_TLS_grid, num_grid_cells_per_axis)) + m_tls_grids([num_grid_cells_per_axis](){ return init_TLS_grid(num_grid_cells_per_axis); }) { set_bbox(bbox); } diff --git a/STL_Extension/include/CGAL/array.h b/STL_Extension/include/CGAL/array.h index 1900a8b1ba0..cfaca0a0550 100644 --- a/STL_Extension/include/CGAL/array.h +++ b/STL_Extension/include/CGAL/array.h @@ -13,11 +13,8 @@ #define CGAL_ARRAY_H #include -#ifndef CGAL_CFG_NO_CPP0X_ARRAY -# include -#else -# include -#endif +#include +#include namespace CGAL { @@ -49,7 +46,7 @@ namespace CGAL { // It's also untrue that this is not documented... It is ! template< typename T, typename... Args > -inline +BOOST_CXX14_CONSTEXPR std::array< T, 1 + sizeof...(Args) > make_array(const T & t, const Args & ... args) { @@ -62,12 +59,27 @@ make_array(const T & t, const Args & ... args) struct Construct_array { template - std::array operator()(const T& t, const Args& ... args) + constexpr + std::array + operator()(const T& t, const Args& ... args) const { return make_array (t, args...); } }; +template +constexpr std::array +make_filled_array_aux(const T& value, std::index_sequence) +{ + return {(static_cast(Is), value)...}; +} + +template +constexpr std::array make_filled_array(const T& value) +{ + return make_filled_array_aux(value, std::make_index_sequence()); +} + } //namespace CGAL #endif // CGAL_ARRAY_H diff --git a/STL_Extension/include/CGAL/function_objects.h b/STL_Extension/include/CGAL/function_objects.h index 09fdf6343a6..82709ab1265 100644 --- a/STL_Extension/include/CGAL/function_objects.h +++ b/STL_Extension/include/CGAL/function_objects.h @@ -349,19 +349,16 @@ class Creator_uniform_d { template < class Op1, class Op2 > class Unary_compose_1 - : public CGAL::cpp98::unary_function< typename Op2::argument_type, - typename Op1::result_type > { protected: Op1 op1; Op2 op2; public: - typedef typename Op2::argument_type argument_type; - typedef typename Op1::result_type result_type; Unary_compose_1(const Op1& x, const Op2& y) : op1(x), op2(y) {} - result_type + template + auto operator()(const argument_type& x) const { return op1(op2(x)); } }; @@ -373,21 +370,18 @@ compose1_1(const Op1& op1, const Op2& op2) template < class Op1, class Op2, class Op3 > class Binary_compose_1 - : public CGAL::cpp98::unary_function< typename Op2::argument_type, - typename Op1::result_type > { protected: Op1 op1; Op2 op2; Op3 op3; public: - typedef typename Op2::argument_type argument_type; - typedef typename Op1::result_type result_type; Binary_compose_1(const Op1& x, const Op2& y, const Op3& z) : op1(x), op2(y), op3(z) {} - result_type + template + auto operator()(const argument_type& x) const { return op1(op2(x), op3(x)); } }; @@ -399,21 +393,16 @@ compose2_1(const Op1& op1, const Op2& op2, const Op3& op3) template < class Op1, class Op2 > class Unary_compose_2 - : public CGAL::cpp98::binary_function< typename Op2::first_argument_type, - typename Op2::second_argument_type, - typename Op1::result_type > { protected: Op1 op1; Op2 op2; public: - typedef typename Op2::first_argument_type first_argument_type; - typedef typename Op2::second_argument_type second_argument_type; - typedef typename Op1::result_type result_type; Unary_compose_2(const Op1& x, const Op2& y) : op1(x), op2(y) {} - result_type + template + auto operator()(const first_argument_type& x, const second_argument_type& y) const { return op1(op2(x, y)); } @@ -426,18 +415,13 @@ compose1_2(const Op1& op1, const Op2& op2) template < class Op1, class Op2, class Op3 > class Binary_compose_2 - : public CGAL::cpp98::binary_function< typename Op2::argument_type, - typename Op3::argument_type, - typename Op1::result_type > + { protected: Op1 op1; Op2 op2; Op3 op3; public: - typedef typename Op2::argument_type first_argument_type; - typedef typename Op3::argument_type second_argument_type; - typedef typename Op1::result_type result_type; Binary_compose_2(const Op1& x, const Op2& y, const Op3& z) : op1(x), op2(y), op3(z) {} @@ -455,7 +439,8 @@ public: return *this; } - result_type + template + auto operator()(const first_argument_type& x, const second_argument_type& y) const { return op1(op2(x), op3(y)); } diff --git a/STL_Extension/include/CGAL/hash_openmesh.h b/STL_Extension/include/CGAL/hash_openmesh.h index bab5dc40918..700f58e87eb 100644 --- a/STL_Extension/include/CGAL/hash_openmesh.h +++ b/STL_Extension/include/CGAL/hash_openmesh.h @@ -43,7 +43,10 @@ public: } bool - operator!=(const OMesh_edge& other) { return !(*this == other); } + operator!=(const OMesh_edge& other) const + { + return !(*this == other); + } Halfedge_handle opposite() const { return Halfedge_handle((halfedge_.idx() & 1) ? halfedge_.idx()-1 : halfedge_.idx()+1); } @@ -73,7 +76,7 @@ inline std::size_t hash_value(const CGAL::internal::OMesh_edge @@ -87,6 +90,8 @@ namespace std { #ifndef CGAL_CFG_NO_STD_HASH +#ifndef OM_HAS_HASH + template <> struct hash : public CGAL::cpp98::unary_function @@ -131,16 +136,6 @@ struct hash } }; -template <> -struct hash > - : public CGAL::cpp98::unary_function -{ - - std::size_t operator()(const CGAL::internal::OMesh_edge& h) const - { - return h.idx(); - } -}; template <> struct hash @@ -153,6 +148,20 @@ struct hash } }; +#endif // OM_HAS_HASH + +template +struct hash > + : public CGAL::cpp98::unary_function, std::size_t> +{ + + std::size_t operator()(const CGAL::internal::OMesh_edge& h) const + { + return h.idx(); + } +}; + + #endif // CGAL_CFG_NO_STD_HASH #if defined(BOOST_MSVC) @@ -162,6 +171,6 @@ struct hash } // namespace std -#endif // OM_HAS_HASH + #endif // CGAL_HASH_OPENMESH_H diff --git a/STL_Extension/src/CGAL/assertions.cpp b/STL_Extension/src/CGAL/assertions.cpp deleted file mode 100644 index f28f656b1c0..00000000000 --- a/STL_Extension/src/CGAL/assertions.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 1997 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Geert-Jan Giezeman and Sven Schönherr - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY diff --git a/STL_Extension/test/STL_Extension/CMakeLists.txt b/STL_Extension/test/STL_Extension/CMakeLists.txt index f54723a483a..6c45f1a551f 100644 --- a/STL_Extension/test/STL_Extension/CMakeLists.txt +++ b/STL_Extension/test/STL_Extension/CMakeLists.txt @@ -9,6 +9,16 @@ find_package(CGAL REQUIRED) find_package( TBB QUIET ) include(CGAL_TBB_support) +find_package(OpenMesh QUIET) + +if(OpenMesh_FOUND) + include(UseOpenMesh) + add_definitions(-DCGAL_USE_OPENMESH) +else() + message(STATUS "Tests that use OpenMesh will not be compiled.") +endif() + + create_single_source_cgal_program( "test_Boolean_tag.cpp" ) create_single_source_cgal_program( "test_Cache.cpp" ) create_single_source_cgal_program( "test_Compact_container.cpp" ) @@ -49,3 +59,8 @@ create_single_source_cgal_program( "test_for_each.cpp" ) if(TARGET CGAL::TBB_support) target_link_libraries(test_for_each PUBLIC CGAL::TBB_support) endif() + +if(OpenMesh_FOUND) + create_single_source_cgal_program("test_hash_OpenMesh.cpp") + target_link_libraries(test_hash_OpenMesh PRIVATE ${OPENMESH_LIBRARIES}) +endif() diff --git a/STL_Extension/test/STL_Extension/test_composition.cpp b/STL_Extension/test/STL_Extension/test_composition.cpp index c7deeaa56f0..a0631437393 100644 --- a/STL_Extension/test/STL_Extension/test_composition.cpp +++ b/STL_Extension/test/STL_Extension/test_composition.cpp @@ -12,8 +12,6 @@ using CGAL::compose1_2; using CGAL::compose2_1; using CGAL::compose2_2; using CGAL::compare_to_less; -using boost::binder1st; -using boost::bind1st; using std::accumulate; using std::plus; using std::multiplies; @@ -30,9 +28,8 @@ struct Myf { int main() { plus< int > pl; - multiplies< int > mu; - binder1st< plus< int > > op1 = bind1st(pl, 1); - binder1st< multiplies< int > > op2 = bind1st(mu, 2); + std::function op1 = [](int i){ return i+1; }; + std::function op2 = [](int i){ return i * 2; }; // compose1_2: int a[] = {3,5,7,2,4}; @@ -50,7 +47,7 @@ int main() // compose2_1: transform(b, b + 5, a, compose2_1(pl, op2, op2)); - transform(b, b + 5, b, bind1st(mu, 4)); + transform(b, b + 5, b, [](int i) { return 4 * i;} ); assert(equal(a, a + 5, b)); // compare_to_less diff --git a/STL_Extension/test/STL_Extension/test_hash_OpenMesh.cpp b/STL_Extension/test/STL_Extension/test_hash_OpenMesh.cpp new file mode 100644 index 00000000000..a13f4d78a75 --- /dev/null +++ b/STL_Extension/test/STL_Extension/test_hash_OpenMesh.cpp @@ -0,0 +1,36 @@ +#include + + +#include +#include +#include + +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; + +typedef OpenMesh::TriMesh_ArrayKernelT Mesh; + + +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef boost::graph_traits::face_descriptor face_descriptor; +typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; +typedef boost::graph_traits::edge_descriptor edge_descriptor; + +int main() +{ + { + std::unordered_map vmap; + std::unordered_map hmap; + std::unordered_map emap; + std::unordered_map fmap; + } + { + boost::unordered_map vmap; + boost::unordered_map hmap; + boost::unordered_map emap; + boost::unordered_map fmap; + } + return 0; +} diff --git a/Scale_space_reconstruction_3/examples/Scale_space_reconstruction_3/CMakeLists.txt b/Scale_space_reconstruction_3/examples/Scale_space_reconstruction_3/CMakeLists.txt index 79737d882ed..def71918e36 100644 --- a/Scale_space_reconstruction_3/examples/Scale_space_reconstruction_3/CMakeLists.txt +++ b/Scale_space_reconstruction_3/examples/Scale_space_reconstruction_3/CMakeLists.txt @@ -17,16 +17,16 @@ if(ACTIVATE_CONCURRENCY) endif() find_package(Eigen3 3.1.0) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("scale_space.cpp") - target_link_libraries(scale_space PUBLIC CGAL::Eigen_support) + target_link_libraries(scale_space PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("scale_space_incremental.cpp") - target_link_libraries(scale_space_incremental PUBLIC CGAL::Eigen_support) + target_link_libraries(scale_space_incremental PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("scale_space_manifold.cpp") - target_link_libraries(scale_space_manifold PUBLIC CGAL::Eigen_support) + target_link_libraries(scale_space_manifold PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("scale_space_advancing_front.cpp") - target_link_libraries(scale_space_advancing_front PUBLIC CGAL::Eigen_support) + target_link_libraries(scale_space_advancing_front PUBLIC CGAL::Eigen3_support) if(ACTIVATE_CONCURRENCY AND TARGET CGAL::TBB_support) target_link_libraries(scale_space PUBLIC CGAL::TBB_support) target_link_libraries(scale_space_incremental PUBLIC CGAL::TBB_support) 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 19a20242b28..7cfdb245391 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 @@ -265,7 +265,7 @@ public: */ Facet_const_iterator shell_begin( std::size_t shell ) const { - CGAL_assertion( shell >= 0 && shell < _shells.size() ); + CGAL_assertion( shell < _shells.size() ); return _shells[ shell ]; } /// gives an iterator to the first triple in a given shell. @@ -277,7 +277,7 @@ public: */ Facet_iterator shell_begin( std::size_t shell ) { - CGAL_assertion( shell >= 0 && shell < _shells.size() ); + CGAL_assertion( shell < _shells.size() ); return _shells[ shell ]; } @@ -288,7 +288,7 @@ public: */ Facet_const_iterator shell_end( std::size_t shell ) const { - CGAL_assertion( shell >= 0 && shell < _shells.size() ); + CGAL_assertion( shell < _shells.size() ); if( shell == _shells.size()-1 ) return _surface.end(); return _shells[ shell+1 ]; @@ -303,7 +303,7 @@ public: */ Facet_iterator shell_end( std::size_t shell ) { - CGAL_assertion( shell >= 0 && shell < _shells.size() ); + CGAL_assertion( shell < _shells.size() ); if( shell == _shells.size()-1 ) return _surface.end(); return _shells[ shell+1 ]; 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 ee7c4eb18d5..bc4ba9ec616 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 @@ -23,7 +23,7 @@ #include #include -#include +#include #ifdef CGAL_LINKED_WITH_TBB #include "tbb/blocked_range.h" diff --git a/Scripts/developer_scripts/autotest_cgal_with_ctest b/Scripts/developer_scripts/autotest_cgal_with_ctest index 3cfe83b02c0..5049e1d0db9 100755 --- a/Scripts/developer_scripts/autotest_cgal_with_ctest +++ b/Scripts/developer_scripts/autotest_cgal_with_ctest @@ -24,7 +24,7 @@ export GUNZIP="gunzip" export COMPRESSOR="gzip" export CONSOLE_OUTPUT="y" export CGAL_HOME=`pwd` -export USE_TARGZ="n" +export USE_TARGZ="y" export USE_TARBZ="n" export CGAL_RELEASE="" export LOGS_DIR="" @@ -35,6 +35,15 @@ export INSTALLATION_DIR="" export TESTSUITE_DIR="" USE_LATEST_UNZIPPED="" +# ---------------------------------------------------------------------------------------- +# produce a string containing the actual date/time +# (used to identify files) +# ---------------------------------------------------------------------------------------- +datestr() +{ + date +%d%m%Y%H%M +} + # ---------------------------------------------------------------------------------------- # Logging functions # ---------------------------------------------------------------------------------------- @@ -61,7 +70,24 @@ log_done() printf "\n-------------------------------------------------------\n" >> "${1}" } - +error() +{ + if [ -n "${CONSOLE_OUTPUT}" ]; then + printf "\nERROR: ${*}, exiting.\n" >&2 + fi + printf "\nERROR: ${*}, exiting.\n" >> "${ACTUAL_LOGFILE}" + ${COMPRESSOR} -9f "${ACTUAL_LOGFILE}" + FILENAME="${CGAL_RELEASE_ID}-log`datestr`.gz" + mv "${ACTUAL_LOGFILE}.gz" "${LOGS_DIR}/${FILENAME}" + if [ ! "${MAIL_ADDRESS}" = "must_be_set_in_.autocgalrc" ]; then + for i in ${MAIL_ADDRESS}; do + printf "ERROR\n${LOGS_DIR}/${FILENAME}\n" | \ + ${SENDMAIL} -s "completed autotest" "${i}" + done + fi + rm -rf "$LOCK_FILE"; + exit 1 +} # ---------------------------------------------------------------------------------------- # Downloads the file "LATEST" whose contents indicates which release to test diff --git a/Scripts/developer_scripts/cgal_check_dependencies.sh b/Scripts/developer_scripts/cgal_check_dependencies.sh index 01e4777ab6a..46c7871152e 100644 --- a/Scripts/developer_scripts/cgal_check_dependencies.sh +++ b/Scripts/developer_scripts/cgal_check_dependencies.sh @@ -30,7 +30,7 @@ do fi done -cmake -DCGAL_HEADER_ONLY=FALSE -DCGAL_BUILD_THREE_DOC=TRUE -DCGAL_ENABLE_CHECK_HEADERS=TRUE -DDOXYGEN_EXECUTABLE="$DOX_PATH" -DCGAL_COPY_DEPENDENCIES=TRUE -DCMAKE_CXX_FLAGS="-std=c++1y" .. +cmake -DCGAL_ENABLE_CHECK_HEADERS=TRUE -DDOXYGEN_EXECUTABLE="$DOX_PATH" -DCGAL_COPY_DEPENDENCIES=TRUE -DCMAKE_CXX_FLAGS="-std=c++1y" .. if [ -n "$DO_CHECK_HEADERS" ]; then make -j$(nproc --all) -k check_headers fi diff --git a/Scripts/developer_scripts/check_library_uses_no_gpl_files b/Scripts/developer_scripts/check_library_uses_no_gpl_files index 1d88879cfc0..32960caefda 100755 --- a/Scripts/developer_scripts/check_library_uses_no_gpl_files +++ b/Scripts/developer_scripts/check_library_uses_no_gpl_files @@ -70,7 +70,7 @@ rm -fr demo/[A-Z]* rm -fr examples/[A-Z]* # Somehow -DWITH_CGAL_Core=OFF is not taken into account, hence the CORE files # are listed in the exceptions file. -cmake . -DBUILD_SHARED_LIBS=TRUE -DWITH_CGAL_Qt5=OFF -DWITH_CGAL_Core=OFF +cmake . make | grep -C 10 "No such file" || true echo " done" echo diff --git a/Scripts/developer_scripts/run_testsuite_with_ctest b/Scripts/developer_scripts/run_testsuite_with_ctest index e576403c326..f7b740d5b94 100644 --- a/Scripts/developer_scripts/run_testsuite_with_ctest +++ b/Scripts/developer_scripts/run_testsuite_with_ctest @@ -176,7 +176,7 @@ setup_dirs() if [ -n "${USE_REFERENCE_PLATFORMS}" ]; then collect_all_reference_platforms fi - + for PLATFORM in ${PLATFORMS}; do CGAL_BINARY_DIR=${CGAL_BINARY_DIR_BASE}/${PLATFORM} @@ -226,9 +226,9 @@ publish_results() ${TAR} cf "test_results-${HOST}_${PLATFORM}.tar" "results_${CGAL_TESTER}_${PLATFORM}.tar.gz" "results_${CGAL_TESTER}_${PLATFORM}.txt" ${COMPRESSOR} -9f "test_results-${HOST}_${PLATFORM}.tar" COMPILER=`printf "%s" "$1" | tr -c '[A-Za-z0-9]./[=-=]*_\'\''\":?() ' 'x'` - + FILENAME="${CGAL_RELEASE_ID}_${CGAL_TESTER}-test`datestr`-${COMPILER}-cmake.tar.gz" - + LOGFILENAME="${CGAL_RELEASE_ID}-log`datestr`-${HOST}.gz" ${COMPRESSOR} -9f "${ACTUAL_LOGFILE}.test.${PLATFORM}" mv "${ACTUAL_LOGFILE}.test.${PLATFORM}.gz" "${LOGS_DIR}/${LOGFILENAME}" @@ -262,14 +262,14 @@ run_test_on_platform() if [ ! -f "${INIT_FILE}" ]; then echo "error NEED A INIT FILE !" fi - cmake ${INIT_FILE:+"-C${INIT_FILE}"} '${CMAKE_GENERATOR}' -DBUILD_TESTING=OFF -DWITH_tests=OFF -DWITH_CGAL_Qt5=OFF -DCGAL_HEADER_ONLY=ON $CGAL_DIR>installation.log 2>&1 + cmake ${INIT_FILE:+"-C${INIT_FILE}"} '${CMAKE_GENERATOR}' -DBUILD_TESTING=ON -DWITH_tests=ON -DCGAL_TEST_SUITE=ON $CGAL_DIR>installation.log 2>&1 rm CMakeCache.txt CMAKE_OPTS="-DCGAL_TEST_SUITE=ON -DCMAKE_VERBOSE_MAKEFILE=ON" if [ -n "${SCRIPTS_DIR}" ]; then CMAKE_OPTS="${CMAKE_OPTS} -DWITH_examples=ON -DWITH_demos=ON" fi if [ -z "${SHOW_PROGRESS}" ]; then - cmake ${INIT_FILE:+"-C${INIT_FILE}"} '${CMAKE_GENERATOR}' -DBUILD_TESTING=ON ${CMAKE_OPTS} $CGAL_DIR >package_installation.log 2>&1 + cmake ${INIT_FILE:+"-C${INIT_FILE}"} '${CMAKE_GENERATOR}' -DBUILD_TESTING=ON ${CMAKE_OPTS} $CGAL_DIR >package_installation.log 2>&1 else cmake ${INIT_FILE:+"-C${INIT_FILE}"} '${CMAKE_GENERATOR}' -DBUILD_TESTING=ON ${CMAKE_OPTS} $CGAL_DIR 2>&1 |tee package_installation.log fi @@ -279,7 +279,7 @@ run_test_on_platform() fi INIT="" for pkg in $LIST_TEST_PACKAGES; do - if [ -z "$INIT" ]; then + if [ -z "$INIT" ]; then TO_TEST=$pkg INIT="y" else @@ -313,14 +313,14 @@ run_test_on_platform() echo "TESTER_NAME ${CGAL_TESTER}" >> "$RESULT_FILE" echo "TESTER_ADDRESS ${TESTER_ADDRESS}" >> "$RESULT_FILE" echo "CGAL_TEST_PLATFORM ${PLATFORM}" >> "$RESULT_FILE" - grep -e "^-- USING " "${CGAL_BINARY_DIR}/installation.log" >> $RESULT_FILE + grep -e "^-- USING " "${CGAL_BINARY_DIR}/installation.log" >> $RESULT_FILE echo "------------" >> "$RESULT_FILE" #if git branch, create empty scm file for python script if [ -n "${SCRIPTS_DIR}" ]; then touch ../../../../../.scm-branch fi python3 ${CGAL_DIR}/${TESTSUITE_DIR}test/parse-ctest-dashboard-xml.py $CGAL_TESTER $PLATFORM - + for file in $(ls|grep _Tests); do mv $file "$(echo "$file" | sed 's/_Tests//g')" done @@ -329,7 +329,7 @@ run_test_on_platform() mkdir -p Installation chmod 777 Installation cat "${CGAL_BINARY_DIR}/package_installation.log" >> "Installation/${TEST_REPORT}" - + #call the python script to complete the results report. python3 ${CGAL_DIR}/${TESTSUITE_DIR}test/post_process_ctest_results.py Installation/${TEST_REPORT} ${TEST_REPORT} results_${CGAL_TESTER}_${PLATFORM}.txt rm -f $OUTPUT_FILE $OUTPUT_FILE.gz @@ -351,7 +351,7 @@ run_test_on_host() collect_all_current_platforms "${CGAL_BINARY_DIR_BASE}" fi - for PLATFORM in ${PLATFORMS}; do + for PLATFORM in ${PLATFORMS}; do run_test_on_platform "${PLATFORM}" publish_results "${PLATFORM}" if [ -z "${KEEP_TESTS}" ]; then @@ -365,13 +365,13 @@ run_test_on_host() setup_dirs -# Setup cmake +# Setup cmake if uname | grep -q "CYGWIN"; then JOM="`which jom`" - if [ -e "$JOM" ]; then + if [ -e "$JOM" ]; then CMAKE_GENERATOR='-GNMake Makefiles JOM' MAKE_CMD='jom' - else + else CMAKE_GENERATOR='-GNMake Makefiles' MAKE_CMD='nmake' fi diff --git a/Scripts/developer_scripts/tag_pr_per_release.sh b/Scripts/developer_scripts/tag_pr_per_release.sh index a8927dcfe17..36e8c56e859 100644 --- a/Scripts/developer_scripts/tag_pr_per_release.sh +++ b/Scripts/developer_scripts/tag_pr_per_release.sh @@ -30,7 +30,7 @@ REMOTE=`git config branch.releases/CGAL-${PREVIOUS_MAJOR_RELEASE}-branch.remote # Call git-fetch to refresh the branch, and fetch the references # refs/pull/*/head as well. -git fetch --tags "${REMOTE}" `git config "remote.${REMOTE}.fetch"` 'refs/pull/*/head:refs/pull/*/head' +git fetch --tags "${REMOTE}" `git config --get-all "remote.${REMOTE}.fetch"` '+refs/pull/*/head:refs/pull/*/head' PR_LIST=`git log --pretty='%D' v${PREVIOUS_MAJOR_RELEASE}..v${CURRENT_RELEASE} | awk 'match($0, /refs\/pull\/([0-9]+)\/head/, a) {print a[1]}' | sort -u` diff --git a/Scripts/scripts/cgal_create_CMakeLists b/Scripts/scripts/cgal_create_CMakeLists index 2be5be308a3..67db54e8d38 100755 --- a/Scripts/scripts/cgal_create_CMakeLists +++ b/Scripts/scripts/cgal_create_CMakeLists @@ -29,12 +29,10 @@ #BLAS #LAPACK #OPENNL -#QGLViewer (or implied by Qt4?) #ESBTL #NTL #Core (implies GMP+GMPXX) -#Qt4 (implies QT4) #ImageIO #not (yet) supported @@ -44,21 +42,19 @@ create_cmake_script_with_options() { - qt4='n' - # parse options file if [ -e "$OPTIONS_FILE" ]; then OLDIFS="$IFS" IFS=$'\n' - for LINE in `cat $OPTIONS_FILE`; do + for LINE in `cat $OPTIONS_FILE`; do # CGAL components if [ -z "$CGAL_COMPONENTS_GIVEN" ]; then # read file only if not given! next_cgal_component=`echo $LINE | grep -v "#" | grep CGAL_COMPONENT` if [ ! -z "$next_cgal_component" ]; then next_cgal_component=${next_cgal_component/CGAL_COMPONENT /} - if [ -z "$CGAL_COMPONENTS" ]; then + if [ -z "$CGAL_COMPONENTS" ]; then CGAL_COMPONENTS=$next_cgal_component else CGAL_COMPONENTS=$CGAL_COMPONENTS":"$next_cgal_component @@ -114,11 +110,10 @@ fi if [ ! -z "$CGAL_COMPONENTS" ]; then # ensure capitalization - # CGAL: Core, Qt4, PDB, ImageIO + # CGAL: Core, PDB, ImageIO CGAL_COMPONENTS=${CGAL_COMPONENTS//[c|C][o|O][r|R][e|E]/Core} - CGAL_COMPONENTS=${CGAL_COMPONENTS//[q|Q][t|T]4/Qt4} CGAL_COMPONENTS=${CGAL_COMPONENTS//[i|I][m|M][a|A][g|G][e|E][i|I][o|O]/ImageIO} - + # external libs CGAL_COMPONENTS=${CGAL_COMPONENTS//[g|G][m|M][p|P]/GMP} @@ -153,11 +148,6 @@ fi for cgal_component in $CGAL_COMPONENTS; do COMPONENT=`echo $cgal_component | tr '[:upper:]' '[:lower:]'` - # for qtmoc - if [ "$COMPONENT" = "qt4" ]; then - qt4='y' - fi - done IFS=$OLDIFS @@ -241,31 +231,6 @@ EOF #------------------------------------------------------------------------- fi - # Qt4 - if [ "$qt4" = "y" ]; then - - #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - cat << 'EOF' - -# Qt4 -set( QT_USE_QTXML true ) -set( QT_USE_QTMAIN true ) -set( QT_USE_QTSCRIPT true ) -set( QT_USE_QTOPENGL true ) - -find_package(Qt4) - -if ( NOT QT_FOUND ) - - message(STATUS "This project requires the Qt4 library, and will not be compiled.") - return() - -endif() -EOF - #------------------------------------------------------------------------- - - fi #qt4 - if [ ! -z "$BOOST_COMPONENTS" ]; then #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv cat << 'EOF' @@ -308,22 +273,6 @@ EOF # add a new line echo - # Qt4 - if [ "$qt4" = "y" ]; then - #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - cat << 'EOF' - -if ( CGAL_Qt4_FOUND AND QT_FOUND ) - - include( ${QT_USE_FILE} ) - include_directories( ${QT_INCLUDE_DIR} ) - -endif() - -EOF - #----------------------------------------------------------------------- - fi # qt4 - for file in `ls *.cc *.cp *.cxx *.cpp *.CPP *.c++ *.C 2> /dev/null | sort` ; do # Create an executable for each cpp that contains a function "main()" BASE=`basename $file .cc` @@ -335,12 +284,8 @@ EOF BASE=`basename $BASE .C` egrep '\bmain[ \t]*\(' $file >/dev/null 2>&1 if [ $? -eq 0 ]; then - if [ "$qt4" = "y" ]; then - echo "create_single_source_cgal_program_qt4( \"$file\" )" - else - echo "create_single_source_cgal_program( \"$file\" )" - fi - if [ -n "$ENABLE_CTEST" ]; then + echo "create_single_source_cgal_program( \"$file\" )" + if [ -n "$ENABLE_CTEST" ]; then if [ -f "$BASE.cin" ] ; then CIN=" < $BASE.cin" else @@ -384,73 +329,6 @@ EOF all="$all $file" done - # Qt4 - if [ "$qt4" = "y" ]; then - #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - cat << 'EOF' - -if ( CGAL_Qt4_FOUND AND QT_FOUND ) - - include( ${QT_USE_FILE} ) - include_directories( ${QT_INCLUDE_DIR} ) - -EOF - #----------------------------------------------------------------------- - - echo " # UI files (Qt Designer files)" - for file in `ls *.ui 2> /dev/null | sort`; do - echo " qt4_wrap_ui( DT_UI_FILES $file )" - done - echo - echo " # qrc files (resources files, that contain icons, at least)" - for file in `ls *.qrc 2> /dev/null | sort`; do - echo " qt4_add_resources ( DT_RESOURCE_FILES ./$file )" - done - echo - MOC_FILES="" - echo " # use the Qt MOC preprocessor on classes that derives from QObject" - for file in `ls include/*.h 2> /dev/null | sort`; do - BASE=`basename $file .h` - egrep 'Q_OBJECT' $file >/dev/null 2>&1 - if [ $? -eq 0 ]; then - echo " qt4_generate_moc( include/${BASE}.h ${BASE}.moc )" - MOC_FILES="${BASE}.moc $MOC_FILES" - fi - done - for file in `ls *.h 2> /dev/null | sort`; do - BASE=`basename $file .h` - egrep 'Q_OBJECT' $file >/dev/null 2>&1 - if [ $? -eq 0 ]; then - echo " qt4_generate_moc( ${BASE}.h ${BASE}.moc )" - MOC_FILES="${BASE}.moc $MOC_FILES" - fi - done - for file in `ls *.cc *.cp *.cxx *.cpp *.CPP *.c++ *.C 2> /dev/null | sort` ; do - BASE=`basename $file .cc` - BASE=`basename $BASE .cp` - BASE=`basename $BASE .cxx` - BASE=`basename $BASE .cpp` - BASE=`basename $BASE .CPP` - BASE=`basename $BASE .c++` - BASE=`basename $BASE .C` - egrep 'Q_OBJECT' $file >/dev/null 2>&1 - if [ $? -eq 0 ]; then - echo " qt4_generate_moc( ${BASE}.cpp ${BASE}.moc )" - MOC_FILES="${BASE}.moc $MOC_FILES" - fi - done - - #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - cat << 'EOF' - -endif() -EOF - #----------------------------------------------------------------------- - - all="${all} ${MOC_FILES} \${DT_UI_FILES} \${DT_RESOURCE_FILES}" - - fi # qt4 - # no 'cat' here, as variable substitution required echo echo "add_executable( ${target_name} ${all} )" @@ -480,7 +358,7 @@ usage() echo "Usage: `basename $0` [-s source] [-c cgal-component1:cgal-component2:...] [-b boost-component1:boost-component2:...] [-p] [-o options_file='`pwd`/cgal_cmake_options:$HOME/.cgal_cmake_options_rc'] [-v] [-h]" >&2 echo >&2 echo " -s source If this parameter is given the script will create one single executable for 'source' with all source files; otherwise it creates one executable for each main'ed source." >&2 - echo " cgal_componentX - must be a valid cgal component, examples are 'Core','ImageIO','Qt4' ('benchmark', 'symbolic')." >&2 + echo " cgal_componentX - must be a valid cgal component, examples are 'Core','ImageIO' ('benchmark', 'symbolic')." >&2 echo " boost_componentX - must be a valid boost component, like 'filesystem', 'program_options'." >&2 echo " -o options_file - file with PACKAGE, DIRECTORY, CGAL_COMPONENT, and BOOST_COMPONENT directives" >&2 echo " -v the version" >&2 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 9aa16d3a72c..55d5ea7bc7f 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 @@ -6,12 +6,28 @@ namespace CGAL { The class `Segment_Delaunay_graph_2` represents the segment Delaunay graph (which is the dual graph of the 2D segment Voronoi diagram). -Currently it supports only insertions of sites. +Currently it only supports the insertions of sites. -\tparam Gt must be a model of `SegmentDelaunayGraphTraits_2` -\tparam DS 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 >`. +\tparam Gt must be a model of `SegmentDelaunayGraphTraits_2`. + +\tparam St must be a model of `SegmentDelaunayGraphStorageTraits_2`. + By default, the storage traits is instantiated by `Segment_Delaunay_graph_storage_traits_2`. + +\tparam DS must be a model of `SegmentDelaunayGraphDataStructure_2` whose vertex and face are + models of the concepts `SegmentDelaunayGraphVertexBase_2` and `TriangulationFaceBase_2`, respectively. + It defaults to: + \code + `CGAL::Triangulation_data_structure_2< + CGAL::Segment_Delaunay_graph_vertex_base_2, + CGAL::Segment_Delaunay_graph_face_base_2 >` + \endcode + +\cgalHeading{Storage} + +To avoid redundancy in the storage of points, input points are stored in a container, +and the various types of sites (input points and segments, points of intersection, +subsegments with one or two points of intersection as endpoints) only store handles to the points +in the container. See Section \ref Segment_Delaunay_graph_2StronglyIntersecting for more information. \cgalHeading{Traversal of the Segment Delaunay Graph} @@ -19,45 +35,34 @@ 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` -\sa `DelaunayGraph_2` -\sa `SegmentDelaunayGraphTraits_2` -\sa `SegmentDelaunayGraphDataStructure_2` -\sa `SegmentDelaunayGraphVertexBase_2` -\sa `TriangulationFaceBase_2` -\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` \sa `CGAL::Segment_Delaunay_graph_traits_2` \sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` \sa `CGAL::Segment_Delaunay_graph_filtered_traits_2` \sa `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2` -\sa `CGAL::Triangulation_data_structure_2` -\sa `CGAL::Segment_Delaunay_graph_vertex_base_2` -\sa `CGAL::Triangulation_face_base_2` - +\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` */ -template< typename Gt, typename DS > +template< typename Gt, typename St, typename DS > class Segment_Delaunay_graph_2 { public: /// \name Types - - - - /// @{ /*! -A type for the geometric traits. +Type for the geometric traits. */ typedef Gt Geom_traits; /*! -A type for the underlying -data structure. +Type for the storage traits. +*/ +typedef St Storage_traits; + +/*! +Type for the underlying data structure. */ typedef DS Data_structure; @@ -73,26 +78,29 @@ Size type (an unsigned integral type) typedef typename DS::size_type size_type; /*! -A type for the -point defined in the geometric traits. +Type for the point defined in the geometric traits. */ typedef typename Gt::Point_2 Point_2; /*! -A type for the segment Delaunay graph site, defined in the geometric -traits. +Type for the segment Delaunay graph site, defined in the geometric traits. */ typedef typename Gt::Site_2 Site_2; /*! -A type for the container of points. +Type for the segment Delaunay storage site, defined in the storage traits. */ -typedef unspecified_type Point_container; +typedef typename Storage_traits::Storage_site_2 Storage_site_2; /*! -A handle for points in the point container. +Type for the container of points. */ -typedef typename Point_container::iterator Point_handle; +typedef typename Storage_traits::Point_container Point_container; + +/*! +Handle type for points in the point container. +*/ +typedef typename Storage_traits::Point_handle Point_handle; /// @} @@ -125,67 +133,67 @@ The `Edge(f,i)` is the edge common to faces `f` and typedef typename DS::Edge Edge; /*! -A type for a vertex. +Type for a vertex. */ typedef typename DS::Vertex Vertex; /*! -A type for a face. +Type for a face. */ typedef typename DS::Face Face; /*! -A type for a handle to a vertex. +Type for a handle to a vertex. */ typedef typename DS::Vertex_handle Vertex_handle; /*! -A type for a handle to a face. +Type for a handle to a face. */ typedef typename DS::Face_handle Face_handle; /*! -A type for a circulator over vertices incident to a given vertex. +Type for a circulator over vertices incident to a given vertex. */ typedef typename DS::Vertex_circulator Vertex_circulator; /*! -A type for a circulator over faces incident to a given vertex. +Type for a circulator over faces incident to a given vertex. */ typedef typename DS::Face_circulator Face_circulator; /*! -A type for a circulator over edges incident to a given vertex. +Type for a circulator over edges incident to a given vertex. */ typedef typename DS::Edge_circulator Edge_circulator; /*! -A type for an iterator over all vertices. +Type for an iterator over all vertices. */ typedef typename DS::Vertex_iterator All_vertices_iterator; /*! -A type for an iterator over all faces. +Type for an iterator over all faces. */ typedef typename DS::Face_iterator All_faces_iterator; /*! -A type for an iterator over all edges. +Type for an iterator over all edges. */ typedef typename DS::Edge_iterator All_edges_iterator; /*! -A type for an iterator over finite vertices. +Type for an iterator over finite vertices. */ typedef unspecified_type Finite_vertices_iterator; /*! -A type for an iterator over finite faces. +Type for an iterator over finite faces. */ typedef unspecified_type Finite_faces_iterator; /*! -A type for an iterator over finite edges. +Type for an iterator over finite edges. */ typedef unspecified_type Finite_edges_iterator; @@ -204,12 +212,12 @@ typedef unspecified_type Finite_edges_iterator; /// @{ /*! -A type for a bidirectional iterator over all input sites. +Type for a bidirectional iterator over all input sites. */ typedef unspecified_type Input_sites_iterator; /*! -A type for a bidirectional iterator over all output sites (the sites +Type for a bidirectional iterator over all output sites (the sites in the Delaunay graph). */ typedef unspecified_type Output_sites_iterator; @@ -222,19 +230,19 @@ typedef unspecified_type Output_sites_iterator; /// @{ /*! -Creates the -segment Delaunay graph using `gt` as geometric traits. +Creates the segment Delaunay graph using `gt` as geometric traits and `st` as storage traits. */ -Segment_Delaunay_graph_2(Gt gt=Gt()); +Segment_Delaunay_graph_2(Gt gt=Gt(), St st=St()); /*! -Creates the segment Delaunay graph using `gt` as geometric traits +Creates the segment Delaunay graph using `gt` as geometric traits, `st` as storage traits, and inserts all sites in the range [`first`, `beyond`). -\pre `Input_iterator` must be a model of `InputIterator`. The value type of `Input_iterator` must be either `Point_2` or `Site_2`. +\pre `Input_iterator` must be a model of `InputIterator`. +The value type of `Input_iterator` must be either `Point_2` or `Site_2`. */ template< class Input_iterator > Segment_Delaunay_graph_2(Input_iterator first, Input_iterator beyond, -Gt gt=Gt()); + Gt gt = Gt(), St gt = St()); /// @} @@ -242,9 +250,30 @@ Gt gt=Gt()); /// @{ /*! -Returns a reference to the segment Delaunay graph traits object. +Returns a reference to the segment Delaunay graph geometric traits object. */ -Geom_traits geom_traits(); +const Geom_traits& geom_traits() const; + +/*! +Returns a reference to the segment Delaunay graph storage traits object. +*/ +const Storage_traits& storage_traits() const; + +/*! +Returns a reference to the point container object. +*/ +const Point_container& point_container() const; + +/*! +Returns a reference to the +segment Delaunay graph data structure object. +*/ +const Data_structure& data_structure() const; + +/*! +Same as `data_structure()`. It has been added for compliance to the `DelaunayGraph_2` concept. +*/ +const Data_structure& tds() const; /*! Returns the dimension of the segment Delaunay graph. The dimension @@ -252,64 +281,45 @@ is \f$ -1\f$ if the graph contains no sites, \f$ 0\f$ if the graph contains one site, \f$ 1\f$ if it contains two sites and \f$ 2\f$ if it contains three or more sites. */ -int dimension(); +int dimension() const; /*! Returns the number of finite vertices of the segment Delaunay graph. */ -size_type number_of_vertices(); +size_type number_of_vertices() const; /*! Returns the number of faces (both finite and infinite) of the segment Delaunay graph. */ -size_type number_of_faces(); +size_type number_of_faces() const; /*! Return the number of input sites. */ -size_type number_of_input_sites(); +size_type number_of_input_sites() const; /*! Return the number of output sites. This is equal to the number of vertices in the segment Delaunay graph. */ -size_type number_of_output_sites(); +size_type number_of_output_sites() const; /*! Returns a face incident to the `infinite_vertex`. */ -Face_handle infinite_face(); +Face_handle infinite_face() const; /*! Returns the `infinite_vertex`. */ -Vertex_handle -infinite_vertex(); +Vertex_handle infinite_vertex() const; /*! Returns a vertex distinct from the `infinite_vertex`. \pre The number of sites in the segment Delaunay graph must be at least one. */ -Vertex_handle finite_vertex(); - -/*! -Returns a reference to the -segment Delaunay graph data structure object. -*/ -Data_structure data_structure(); - -/*! -Same as `data_structure()`. It -has been added for compliance to the `DelaunayGraph_2` concept. -*/ -Data_structure tds(); - -/*! -Returns a reference to -the point container object. -*/ -Point_container point_container(); +Vertex_handle finite_vertex() const; /// @} @@ -324,33 +334,32 @@ Point_container point_container(); /*! Starts at an arbitrary finite vertex. */ -Finite_vertices_iterator finite_vertices_begin(); +Finite_vertices_iterator finite_vertices_begin() const; /*! Past-the-end iterator. */ -Finite_vertices_iterator finite_vertices_end(); +Finite_vertices_iterator finite_vertices_end() const; /*! Starts at an arbitrary finite edge. */ -Finite_edges_iterator finite_edges_begin(); +Finite_edges_iterator finite_edges_begin() const; /*! Past-the-end iterator. */ -Finite_edges_iterator finite_edges_end(); +Finite_edges_iterator finite_edges_end() const; /*! Starts at an arbitrary finite face. */ -Finite_faces_iterator finite_faces_begin(); +Finite_faces_iterator finite_faces_begin() const; /*! Past-the-end iterator. */ -Finite_faces_iterator finite_faces_end() -const; +Finite_faces_iterator finite_faces_end() const; /// @} @@ -366,32 +375,32 @@ const; /*! Starts at an arbitrary vertex. */ -All_vertices_iterator all_vertices_begin(); +All_vertices_iterator all_vertices_begin() const; /*! Past-the-end iterator. */ -All_vertices_iterator all_vertices_end(); +All_vertices_iterator all_vertices_end() const; /*! Starts at an arbitrary edge. */ -All_edges_iterator all_edges_begin(); +All_edges_iterator all_edges_begin() const; /*! Past-the-end iterator. */ -All_edges_iterator all_edges_end(); +All_edges_iterator all_edges_end() const; /*! Starts at an arbitrary face. */ -All_faces_iterator all_faces_begin(); +All_faces_iterator all_faces_begin() const; /*! Past-the-end iterator. */ -All_faces_iterator all_faces_end(); +All_faces_iterator all_faces_end() const; /// @} @@ -405,22 +414,22 @@ All_faces_iterator all_faces_end(); /*! Starts at an arbitrary input site. */ -Input_sites_iterator input_sites_begin(); +Input_sites_iterator input_sites_begin() const; /*! Past-the-end iterator. */ -Input_sites_iterator input_sites_end(); +Input_sites_iterator input_sites_end() const; /*! Starts at an arbitrary output site. */ -Output_sites_iterator output_sites_begin(); +Output_sites_iterator output_sites_begin() const; /*! Past-the-end iterator. */ -Output_sites_iterator output_sites_end(); +Output_sites_iterator output_sites_end() const; /// @} @@ -450,39 +459,39 @@ Output_sites_iterator output_sites_end(); Starts at an arbitrary face incident to `v`. */ -Face_circulator incident_faces(Vertex_handle v); +Face_circulator incident_faces(Vertex_handle v) const; /*! Starts at face `f`. \pre Face `f` is incident to vertex `v`. */ -Face_circulator incident_faces(Vertex_handle v, Face_handle f); +Face_circulator incident_faces(Vertex_handle v, Face_handle f) const; /*! Starts at an arbitrary edge incident to `v`. */ -Edge_circulator incident_edges(Vertex_handle v); +Edge_circulator incident_edges(Vertex_handle v) const; /*! Starts at the first edge of `f` incident to `v`, in counterclockwise order around `v`. \pre Face `f` is incident to vertex `v`. */ -Edge_circulator incident_edges(Vertex_handle v, Face_handle f); +Edge_circulator incident_edges(Vertex_handle v, Face_handle f) const; /*! Starts at an arbitrary vertex incident to `v`. */ -Vertex_circulator incident_vertices(Vertex_handle v); +Vertex_circulator incident_vertices(Vertex_handle v) const; /*! Starts at the first vertex of `f` adjacent to `v` in counterclockwise order around `v`. \pre Face `f` is incident to vertex `v`. */ -Vertex_circulator incident_vertices(Vertex_handle v, Face_handle f); +Vertex_circulator incident_vertices(Vertex_handle v, Face_handle f) const; /// @} @@ -522,41 +531,38 @@ bool is_infinite(Edge_circulator ec) const; /// @{ /*! -Inserts the sites in the range -[`first`,`beyond`). The number of additional sites inserted in -the Delaunay graph is returned. `Input_iterator` must be a model of -`InputIterator` and its value type must be -either `Point_2` or `Site_2`. +Iteratively inserts the sites in the range [`first`,`beyond`). +\tparam Input_iterator must be a model of `InputIterator` and its value type must be either `Point_2` or `Site_2`. +\return the number of sites inserted in the Delaunay graph */ template< class Input_iterator > size_type insert(Input_iterator first, Input_iterator beyond); /*! -Same as the previous method. `Input_iterator` must be a model of -`InputIterator` and its value type must be -either `Point_2` or `Site_2`. +Iteratively inserts the sites in the range [`first`,`beyond`). +\tparam Input_iterator must be a model of `InputIterator` and its value type must be either `Point_2` or `Site_2`. +\return the number of sites inserted in the Delaunay graph */ template< class Input_iterator > -size_type insert(Input_iterator first, Input_iterator beyond, Tag_false); +size_type insert(Input_iterator first, Input_iterator beyond, CGAL::Tag_false); /*! Decomposes the range [first,beyond) into a range of input points and a range of input segments that are respectively passed to `insert_segments()` and `insert_points()`. Non-input sites are first random_shuffled and then inserted one by one. -`Input_iterator` must be a model of `InputIterator` and its value type must be -either `Point_2`, `Segment_2` or `Site_2`. -\return the number of sites inserted in the Delaunay graph +\tparam Input_iterator must be a model of `InputIterator` and its value type must be either `Point_2`, `Segment_2` or `Site_2`. +\return the number of sites inserted in the Delaunay graph */ template< class Input_iterator > -size_type insert(Input_iterator first, Input_iterator beyond, Tag_true); +size_type insert(Input_iterator first, Input_iterator beyond, CGAL::Tag_true); /*! Inserts the points in the range [first,beyond) as sites. Note that this function is not guaranteed to insert the points following the order of `PointInputIterator`, as `spatial_sort()` is used to improve efficiency. -\return the number of points inserted in the Delaunay graph \tparam PointIterator must be an input iterator `Point_2` or `Site_2` as value_type. +\return the number of points inserted in the Delaunay graph */ template std::size_t insert_points(PointIterator first, PointIterator beyond); @@ -566,8 +572,8 @@ Inserts the segments in the range [first,beyond) as sites. Note that this function is not guaranteed to insert the segments following the order of `SegmentIterator`, as `spatial_sort()` is used to improve efficiency. -\return the number of segments inserted in the Delaunay graph \tparam SegmentIterator must be an input iterator with `Site_2`, `Segment_2` or `std::pair` as value type. +\return the number of segments inserted in the Delaunay graph */ template std::size_t insert_segments(SegmentIterator first, SegmentIterator beyond); @@ -577,33 +583,30 @@ Same as above except that each segment is given as a pair of indices of the poin in the range [points_first, points_beyond). The indices must start from 0 to `std::distance(points_first, points_beyond)` \tparam PointIterator is an input iterator with `Point_2` as value type. \tparam IndicesIterator is an input iterator with `std::pair` as value type. +\return the number of segments inserted in the Delaunay graph */ template std::size_t insert_segments(PointIterator points_first, PointIterator points_beyond, IndicesIterator indices_first, IndicesIterator indices_beyond); /*! -Inserts the -point `p` in the segment Delaunay graph. If `p` has already -been inserted, then the vertex handle of its already inserted copy is -returned. If `p` has not been inserted yet, the vertex handle of -`p` is returned. +Inserts the point `p` in the segment Delaunay graph. +If `p` has already been inserted, then the vertex handle of its already inserted copy is returned. +If `p` has not been inserted yet, the vertex handle of `p` is returned. */ -Vertex_handle insert(Point_2 p); +Vertex_handle insert(const Point_2& p); /*! -Inserts `p` in the segment Delaunay graph using the site -associated with `vnear` as an estimate for the nearest neighbor -of `p`. The vertex handle returned has the same semantics as -the vertex handle returned by the method +Inserts `p` in the segment Delaunay graph using the site associated with `vnear` +as an estimate for the nearest neighbor of `p`. +The vertex handle returned has the same semantics as the vertex handle returned by the method `Vertex_handle insert(Point_2 p)`. */ -Vertex_handle insert(Point_2 p, Vertex_handle vnear); +Vertex_handle insert(const Point_2& p, Vertex_handle vnear); /*! -Inserts the -closed segment with endpoints `p1` and `p2` in the segment -Delaunay graph. If the segment has already been inserted in the +Inserts the closed segment with endpoints `p1` and `p2` in the segment Delaunay graph. +If the segment has already been inserted in the Delaunay graph then the vertex handle of its already inserted copy is returned. If the segment does not intersect any segment in the existing diagram, the vertex handle corresponding to its @@ -611,40 +614,34 @@ corresponding open segment is returned. Finally, if the segment intersects other segments in the existing Delaunay graph, the vertex handle to one of its open subsegments is returned. */ -Vertex_handle insert(Point_2 p1, Point_2 p2); +Vertex_handle insert(const Point_2& p1, const Point_2& p2); /*! -Inserts the segment whose endpoints are `p1` and `p2` -in the segment Delaunay graph using the site -associated with `vnear` as an estimate for the nearest neighbor -of `p1`. The vertex handle returned has the same semantics as the -vertex handle returned by the method +Inserts the segment whose endpoints are `p1` and `p2` in the segment Delaunay graph using the site +associated with `vnear` as an estimate for the nearest neighbor of `p1`. +The vertex handle returned has the same semantics as the vertex handle returned by the method `Vertex_handle insert(Point_2 p1, Point_2 p2)`. */ -Vertex_handle insert(Point_2 p1, Point_2 p2, Vertex_handle -vnear); +Vertex_handle insert(const Point_2& p1, const Point_2& p2, Vertex_handle vnear); /*! -Inserts the site `s` in the -segment Delaunay graph. The vertex handle returned has the same -semantics as the vertex handle returned by the methods -`Vertex_handle insert(Point_2 p)` and `Vertex_handle insert(Point_2 p1, Point_2 p2)`, depending on whether `s` -represents a point or a segment respectively. +Inserts the site `s` in the segment Delaunay graph. +The vertex handle returned has the same semantics as the vertex handle returned by the methods +`Vertex_handle insert(Point_2 p)` and `Vertex_handle insert(Point_2 p1, Point_2 p2)`, +depending on whether `s` represents a point or a segment respectively. \pre `s.is_input()` must be `true`. */ -Vertex_handle insert(Site_2 s); +Vertex_handle insert(const Site_2& s); /*! -Inserts `s` in the segment Delaunay graph using the site -associated with `vnear` as an estimate for the nearest neighbor of -`s`, if `s` is a point, or the first endpoint of `s`, if -`s` is a segment. The vertex handle returned has the same -semantics as the vertex handle returned by the method +Inserts `s` in the segment Delaunay graph using the site associated with `vnear` +as an estimate for the nearest neighbor of `s`, if `s` is a point, or the first endpoint of `s`, if +`s` is a segment. +The vertex handle returned has the same semantics as the vertex handle returned by the method `Vertex_handle insert(Site_2 s)`. \pre `s.is_input()` must be `true`. */ -Vertex_handle insert(Site_2 s, Vertex_handle -vnear); +Vertex_handle insert(const Site_2& s, Vertex_handle vnear); /// @} @@ -658,7 +655,7 @@ finds the site whose segment Voronoi diagram cell contains of `p` is returned. If there are no sites in the segment Delaunay graph `Vertex_handle()` is returned. */ -Vertex_handle nearest_neighbor(Point_2 p); +Vertex_handle nearest_neighbor(const Point_2& p) const; /*! Finds the nearest neighbor of the point @@ -668,8 +665,7 @@ arbitrarily and one of the nearest neighbors of `p` is returned. If there are no sites in the segment Delaunay graph `Vertex_handle()` is returned. */ -Vertex_handle nearest_neighbor(Point_2 p, -Vertex_handle vnear); +Vertex_handle nearest_neighbor(const Point_2& p, Vertex_handle vnear) const; /// @} @@ -689,7 +685,7 @@ defined: */ template < class Stream > -Stream& draw_dual(Stream& str); +Stream& draw_dual(Stream& str) const; /*! Draws the segment Voronoi @@ -705,7 +701,7 @@ The following operators must be defined: */ template < class Stream > -Stream& draw_skeleton(Stream& str); +Stream& draw_skeleton(Stream& str) const; /*! Draws the edge `e` of @@ -720,7 +716,7 @@ The following operators must be defined: \pre `e` must be a finite edge. */ template< class Stream > -Stream& draw_dual_edge(Edge e, Stream& str); +Stream& draw_dual_edge(Edge e, Stream& str) const; /*! Draws the edge `*ec` of the segment Voronoi diagram to the stream @@ -735,7 +731,7 @@ The following operators must be defined: \pre `*ec` must be a finite edge. */ template< class Stream > -Stream& draw_dual_edge(Edge_circulator ec, Stream& str); +Stream& draw_dual_edge(Edge_circulator ec, Stream& str) const; /*! Draws the edge `*eit` of the segment Voronoi diagram to the @@ -750,7 +746,7 @@ The following operators must be defined: \pre `*eit` must be a finite edge. */ template< class Stream > -Stream& draw_dual_edge(All_edges_iterator eit, Stream& str); +Stream& draw_dual_edge(All_edges_iterator eit, Stream& str) const; /*! Draws the edge `*eit` of the segment Voronoi diagram to the @@ -764,7 +760,7 @@ The following operators must be defined: `Stream& operator<<(Stream&, Gt::Line_2)` */ template< class Stream > -Stream& draw_dual_edge(Finite_edges_iterator eit, Stream& str); +Stream& draw_dual_edge(Finite_edges_iterator eit, Stream& str) const; /*! Writes the current @@ -776,20 +772,19 @@ combinatorial data structure. void file_output(std::ostream& os); /*! -Reads the state of the -segment Delaunay graph from an input stream. +Reads the state of the segment Delaunay graph from an input stream. */ void file_input(std::istream& is); /*! Writes the current state of the segment Delaunay graph to an output stream. */ -std::ostream& operator<<(std::ostream& os, Segment_Delaunay_graph_2 sdg); +std::ostream& operator<<(std::ostream& os, const Segment_Delaunay_graph_2& sdg); /*! Reads the state of the segment Delaunay graph from an input stream. */ -std::istream& operator>>(std::istream& is, Segment_Delaunay_graph_2 sdg); +std::istream& operator>>(std::istream& is, Segment_Delaunay_graph_2& sdg); /// @} @@ -805,7 +800,7 @@ Delaunay graph are validated. Negative values of `level` always return true, and values greater than 1 are equivalent to `level` being 1. */ -bool is_valid(bool verbose = false, int level = 1); +bool is_valid(bool verbose = false, int level = 1) const; /// @} @@ -818,13 +813,12 @@ Clears all contents of the segment Delaunay graph. void clear(); /*! -The segment Delaunay graphs -`other` and `*this` are swapped. For a segment Delaunay graph `sdg`, the operation +The segment Delaunay graphs `other` and `*this` are swapped. +For a segment Delaunay graph `sdg`, the operation `sdg`.`swap(other)` should be preferred to `sdg``= other` or to `sdg``(other)` if `other` is deleted afterwards. */ -void swap(Segment_Delaunay_graph_2 -other); +void swap(Segment_Delaunay_graph_2& other); /// @} 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 new file mode 100644 index 00000000000..69fc93cf421 --- /dev/null +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_face_base_2.h @@ -0,0 +1,27 @@ + +namespace CGAL { + +/*! +\ingroup PkgSegmentDelaunayGraph2Ref + +\cgalModels `SegmentDelaunayGraphFaceBase_2` + +The class `Segment_Delaunay_graph_face_base_2` provides a model for the +`SegmentDelaunayGraphFaceBase_2` concept which is the face +base required by the `SegmentDelaunayGraphDataStructure_2` +concept. + +\tparam Gt must be a model of the concept `SegmentDelaunayGraphTraits_2`. + This type must be identical to the template parameter used for `CGAL::Segment_Delaunay_graph_2`. + +\tparam Fb is a face base class from which `Segment_Delaunay_graph_face_base_2` derives. + It must be a model of the `TriangulationFaceBase_2` concept. + It has the default value `CGAL::Triangulation_face_base_2`. +*/ +template< typename Gt, typename Fb > +class Segment_Delaunay_graph_face_base_2 { +public: + +}; /* end Segment_Delaunay_graph_face_base_2 */ + +} /* end namespace CGAL */ 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 214ca7577bc..00be59b9a75 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 @@ -8,7 +8,7 @@ The class `Segment_Delaunay_graph_filtered_traits_2` provides a model for the `SegmentDelaunayGraphTraits_2` concept. The class `Segment_Delaunay_graph_filtered_traits_2` uses the filtering technique \cgalCite{cgal:bbp-iayed-01} -to achieve traits for the `Segment_Delaunay_graph_2` +to achieve traits for the `Segment_Delaunay_graph_2` class with efficient and exact predicates given an exact kernel `EK` and a filtering kernel `FK`. The geometric constructions associated provided by this class are equivalent @@ -50,7 +50,7 @@ The default values for the template parameters are as follows:
  • `EM = Field_tag`,
  • `FK = Simple_cartesian >`,
  • `FM = Field_with_sqrt_tag`. -
  • If the \sc{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 >`. +
  • 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` @@ -58,12 +58,11 @@ The default values for the template parameters are as follows: \cgalModels `CopyConstructible` \cgalModels `Assignable` -\sa `Kernel` \sa `SegmentDelaunayGraphTraits_2` \sa `CGAL::Field_tag` \sa `CGAL::Field_with_sqrt_tag` -\sa `CGAL::Segment_Delaunay_graph_2` -\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` +\sa `CGAL::Segment_Delaunay_graph_2` +\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` \sa `CGAL::Segment_Delaunay_graph_traits_2` \sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` \sa `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2` @@ -156,7 +155,7 @@ The class `Segment_Delaunay_graph_filtered_traits_without_intersections_2` provi `SegmentDelaunayGraphTraits_2` concept. The class `Segment_Delaunay_graph_filtered_traits_without_intersections_2` uses the filtering technique \cgalCite{cgal:bbp-iayed-01} -to achieve traits for the `Segment_Delaunay_graph_2` +to achieve traits for the `Segment_Delaunay_graph_2` class with efficient and exact predicates given an exact kernel `EK` and a filtering kernel `FK`. The geometric constructions associated provided by this class are equivalent @@ -205,7 +204,7 @@ will be the entry for the template parameter `CK`),
  • `EM = CGAL::Euclidean_ring_tag`,
  • `FK = CGAL::Simple_cartesian >`,
  • `FM = CGAL::Field_with_sqrt_tag`. -
  • If the \sc{Gmp} package is +
  • If the \gmp package is installed with \cgal, the template parameter `EK` has the default value: `EK = CGAL::Simple_cartesian`, otherwise its default value is @@ -221,8 +220,8 @@ default value is \sa `SegmentDelaunayGraphTraits_2` \sa `CGAL::Euclidean_ring_tag` \sa `CGAL::Field_with_sqrt_tag` -\sa `CGAL::Segment_Delaunay_graph_2` -\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` +\sa `CGAL::Segment_Delaunay_graph_2` +\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` \sa `CGAL::Segment_Delaunay_graph_traits_2` \sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` \sa `CGAL::Segment_Delaunay_graph_filtered_traits_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 49b75205b61..450a299f188 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 @@ -5,8 +5,9 @@ namespace CGAL { \ingroup PkgSegmentDelaunayGraph2Ref We provide an alternative to the class -`Segment_Delaunay_graph_2` for the incremental -construction of the segment Delaunay graph. The `Segment_Delaunay_graph_hierarchy_2` class +`Segment_Delaunay_graph_2` for the incremental +construction of the segment Delaunay graph. +The `Segment_Delaunay_graph_hierarchy_2` class maintains a hierarchy of Delaunay graphs. There are two possibilities as to how this hierarchy is constructed. @@ -21,44 +22,49 @@ In the second case the upper levels of the hierarchy contains not only points but also segments. A site that is in level \f$ i\f$, is in level \f$ i+1\f$ with probability \f$ 1/\beta\f$ where \f$ \beta > 1\f$ is some constant. -The difference between the `Segment_Delaunay_graph_2` +The difference between the `Segment_Delaunay_graph_2` class and the `Segment_Delaunay_graph_hierarchy_2` class (both versions of it) is on how the nearest neighbor location is done. Given a point \f$ p\f$ the location is done as follows: at the top most level we find the nearest neighbor of -\f$ p\f$ as in the `Segment_Delaunay_graph_2` class. At +\f$ p\f$ as in the `Segment_Delaunay_graph_2` class. At every subsequent level \f$ i\f$ we use the nearest neighbor found at level \f$ i+1\f$ to find the nearest neighbor at level \f$ i\f$. This is a variant of the corresponding hierarchy for points found in \cgalCite{cgal:d-dh-02}. The details are described in \cgalCite{cgal:k-reisv-04}. -The class has three template parameters. The first and third -have essentially the same semantics as in the -`Segment_Delaunay_graph_2` class. +The class has four template parameters. The first and fourth +have essentially the same semantics as in the `Segment_Delaunay_graph_2` class. \tparam Gt must be a model of the `SegmentDelaunayGraphTraits_2` concept. -\tparam STag The second template +\tparam St must be a model of `SegmentDelaunayGraphStorageTraits_2`. + By default, the storage traits is instantiated by `Segment_Delaunay_graph_storage_traits_2`. + +\tparam STag The third template parameter controls whether or not segments are added in the upper levels of the hierarchy. It's possible values are `Tag_true` and `Tag_false`. If it is set to `Tag_true`, segments are also inserted in the upper levels of the hierarchy. The value `Tag_false` indicates that only points are to be inserted in the upper levels of the hierarchy. The default value for -the second template parameter is `Tag_false`. +the third template parameter is `Tag_false`. \tparam DS must be a model of the `SegmentDelaunayGraphDataStructure_2` concept. However, the vertex base class that is to be used in the segment Delaunay graph data structure must be a model of the `SegmentDelaunayGraphHierarchyVertexBase_2` -concept. The third template parameter defaults to -`Triangulation_data_structure_2< Segment_Delaunay_graph_hierarchy_vertex_base_2< Segment_Delaunay_graph_vertex_base_2 >, Triangulation_face_base_2 >`. - - +concept. The fourth template parameter defaults to: +\code +`CGAL::Triangulation_data_structure_2< + CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2< + CGAL::Segment_Delaunay_graph_vertex_base_2, + CGAL::Segment_Delaunay_graph_face_base_2 >` +\endcode The `Segment_Delaunay_graph_hierarchy_2` class derives publicly from the -`Segment_Delaunay_graph_2` class. The interface is +`Segment_Delaunay_graph_2` class. The interface is the same with its base class. In the sequel only additional types and methods defined are documented. @@ -66,10 +72,7 @@ and methods defined are documented. \cgalModels `CopyConstructible` \cgalModels `Assignable` -\sa `SegmentDelaunayGraphDataStructure_2` -\sa `SegmentDelaunayGraphTraits_2` -\sa `SegmentDelaunayGraphHierarchyVertexBase_2` -\sa `CGAL::Segment_Delaunay_graph_2` +\sa `CGAL::Segment_Delaunay_graph_2` \sa `CGAL::Triangulation_data_structure_2` \sa `CGAL::Segment_Delaunay_graph_traits_2` \sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` @@ -78,14 +81,15 @@ and methods defined are documented. \sa `CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2` */ -template< typename Gt, typename STag, typename DS > -class Segment_Delaunay_graph_hierarchy_2 : public CGAL::Segment_Delaunay_graph_2 { +template< typename Gt, typename St, typename STag, typename DS > +class Segment_Delaunay_graph_hierarchy_2 + : public CGAL::Segment_Delaunay_graph_2 { public: /// \name Types /// `Segment_Delaunay_graph_hierarchy_2` introduces the following /// types in addition to those introduced by its base class -/// `Segment_Delaunay_graph_2`. +/// `Segment_Delaunay_graph_2`. /// @{ /*! @@ -97,7 +101,7 @@ typedef STag Segments_in_hierarchy_tag; /*! A type for the base class. */ -typedef CGAL::Segment_Delaunay_graph_2 Base; +typedef CGAL::Segment_Delaunay_graph_2 Base; /// @} @@ -110,8 +114,7 @@ typedef CGAL::Segment_Delaunay_graph_2 Base; Creates a hierarchy of segment Delaunay graphs using `gt` as geometric traits. */ -Segment_Delaunay_graph_hierarchy_2(Gt -gt=Gt()); +Segment_Delaunay_graph_hierarchy_2(Gt gt=Gt()); /*! Creates a segment Delaunay graph hierarchy using @@ -121,9 +124,7 @@ model of `InputIterator`. The value type of `Input_iterator` must be either `Point_2` or `Site_2`. */ template< class Input_iterator > -Segment_Delaunay_graph_hierarchy_2(Input_iterator -first, Input_iterator beyond, Gt gt=Gt()); - +Segment_Delaunay_graph_hierarchy_2(Input_iterator first, Input_iterator beyond, Gt gt=Gt()); /// @} @@ -136,13 +137,13 @@ written to the stream (represented through appropriate input sites), as well as the underlying combinatorial hierarchical data structure. \relates Segment_Delaunay_graph_hierarchy_2 */ -std::ostream& operator<<(std::ostream& os, Segment_Delaunay_graph_hierarchy_2 svdh); +std::ostream& operator<<(std::ostream& os, const Segment_Delaunay_graph_hierarchy_2& svdh); /*! Reads the state of the segment Delaunay graph hierarchy from an input stream. \relates Segment_Delaunay_graph_hierarchy_2 */ -std::istream& operator>>(std::istream& is, Segment_Delaunay_graph_hierarchy_2 svdh); +std::istream& operator>>(std::istream& is, const Segment_Delaunay_graph_hierarchy_2& svdh); } /* end namespace CGAL */ 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 56005dcd9d7..5ac99ae6de2 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 @@ -7,7 +7,7 @@ namespace CGAL { The class `Segment_Delaunay_graph_hierarchy_vertex_base_2` provides a model for the `SegmentDelaunayGraphHierarchyVertexBase_2` concept, which is the vertex base required by the -`Segment_Delaunay_graph_hierarchy_2` class. +`Segment_Delaunay_graph_hierarchy_2` class. \tparam Vbb must be a model of the `SegmentDelaunayGraphVertexBase_2` concept. @@ -16,9 +16,9 @@ vertex base required by the \sa `SegmentDelaunayGraphVertexBase_2` \sa `SegmentDelaunayGraphHierarchyVertexBase_2` \sa `SegmentDelaunayGraphDataStructure_2` -\sa `CGAL::Segment_Delaunay_graph_vertex_base_2` +\sa `CGAL::Segment_Delaunay_graph_vertex_base_2` \sa `CGAL::Triangulation_data_structure_2` -\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` +\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` */ template< typename Vbb > 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 8d11eb97bdd..596717be5cc 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 @@ -7,20 +7,13 @@ namespace CGAL { The class `Segment_Delaunay_graph_storage_site_2` is a model for the concept `SegmentDelaunayGraphStorageSite_2`. -\tparam Gt must be a model of the `SegmentDelaunayGraphTraits_2` concept. +\tparam Gt must be a model of the `SegmentDelaunayGraphStorageTraits_2` concept. \cgalModels `SegmentDelaunayGraphStorageSite_2` -\sa `SegmentDelaunayGraphSite_2` -\sa `SegmentDelaunayGraphTraits_2` \sa `CGAL::Segment_Delaunay_graph_site_2` -\sa `CGAL::Segment_Delaunay_graph_traits_2` -\sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` -\sa `CGAL::Segment_Delaunay_graph_filtered_traits_2` -\sa `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2` - */ -template< typename Gt > +template< typename St > class Segment_Delaunay_graph_storage_site_2 { public: @@ -31,9 +24,9 @@ public: /// @{ /*! -A type for the template parameter `Gt`. +A type for the template parameter `St`. */ -typedef Gt Geom_traits; +typedef St Storage_traits; /// @} 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 new file mode 100644 index 00000000000..fc8180ff3d8 --- /dev/null +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_site_with_info_2.h @@ -0,0 +1,50 @@ + +namespace CGAL { + +/*! +\ingroup PkgSegmentDelaunayGraph2Ref + +The class `Segment_Delaunay_graph_storage_site_with_info_2` is a model for the concept +`SegmentDelaunayGraphStorageSite_2`. + +\tparam STraits must be a model of the `SegmentDelaunayGraphStorageTraits_2` concept. +\tparam Base must be a model of `SegmentDelaunayGraphStorageSite_2` + +\cgalModels `SegmentDelaunayGraphStorageSite_2` + +\sa `CGAL::Segment_Delaunay_graph_site_2` +*/ +template< typename STraits, typename Info_, typename Base > +class Segment_Delaunay_graph_storage_site_with_info_2 : public Base { +public: + + /// \name Types + /// The class + /// @{ + + typedef STraits Storage_traits; + /*! + */ + typedef Info_ Info; + + typedef typename Storage_traits::Geom_traits Geom_traits; + typedef typename Geom_traits::Site_2 Site_2; + typedef typename Storage_traits::Point_handle Point_handle; + + struct Has_info_tag {}; + /// @} + + /*! + */ + const Info& info() const; + + /*! + */ + void set_info(const Info&) const; + + /*! + */ + bool info_has_been_set() const; + +}; /* end Segment_Delaunay_graph_storage_site_with_info_2 */ +} /* end namespace CGAL */ 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 new file mode 100644 index 00000000000..8fb333abcc0 --- /dev/null +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_traits_2.h @@ -0,0 +1,34 @@ +namespace CGAL { + +/*! +\ingroup PkgSegmentDelaunayGraph2Ref + +The class `Segment_Delaunay_graph_storage_traits_2` provides a model for the +`SegmentDelaunayGraphStorageTraits_2` concept. + +To avoid redundancy in the storage of points, the input points of a segment Delaunay graph +are stored in a container, and the various types of sites (input points and segments, +points of intersection, subsegments with one or two points of intersection as endpoints) +only store handles to the points in the container. + +See section \ref Segment_Delaunay_graph_2StronglyIntersecting for more information. + +\tparam Gt must be a model of the concept `SegmentDelaunayGraphTraits_2`. + +\cgalModels `SegmentDelaunayGraphStorageTraits_2` + +\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` +\sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` +\sa `CGAL::Segment_Delaunay_graph_filtered_traits_2` +\sa `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2` +*/ +template +class Segment_Delaunay_graph_storage_traits_2 +{ +public: + /*! + */ + typedef unspecified_type Storage_site_2; +}; + +} //namespace CGAL 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 new file mode 100644 index 00000000000..eb032cea795 --- /dev/null +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_traits_with_info_2.h @@ -0,0 +1,35 @@ +namespace CGAL { + +/*! +\ingroup PkgSegmentDelaunayGraph2Ref + +The class `Segment_Delaunay_graph_storage_traits_with_info_2` provides a model for the +`SegmentDelaunayGraphStorageTraits_2` concept. + + +\tparam Gt must be a model of the concept `SegmentDelaunayGraphTraits_2`. + +\cgalModels `SegmentDelaunayGraphStorageTraits_2` + +\sa `CGAL::`Segment_Delaunay_graph_storage_site_with_info_2` +*/ + template +class Segment_Delaunay_graph_storage_traits_with_info_2 + : public Segment_Delaunay_graph_storage_traits_2 +{ +public: + /*! + */ + typedef Info_ Info; + typedef Converter Convert_info; + typedef Merger Merge_info; + typedef typename Base::Geom_traits Geom_traits; + + typedef + Segment_Delaunay_graph_storage_site_with_info_2 Storage_site_2; + +}; + +} //namespace CGAL 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 c27eef36376..1dead711c35 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 @@ -28,8 +28,8 @@ part). \sa `SegmentDelaunayGraphTraits_2` \sa `CGAL::Field_tag` \sa `CGAL::Field_with_sqrt_tag` -\sa `CGAL::Segment_Delaunay_graph_2` -\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` +\sa `CGAL::Segment_Delaunay_graph_2` +\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` \sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` \sa `CGAL::Segment_Delaunay_graph_filtered_traits_2` \sa `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2` @@ -101,8 +101,8 @@ part). \sa `SegmentDelaunayGraphTraits_2` \sa `CGAL::Euclidean_ring_tag` \sa `CGAL::Field_with_sqrt_tag` -\sa `CGAL::Segment_Delaunay_graph_2` -\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` +\sa `CGAL::Segment_Delaunay_graph_2` +\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` \sa `CGAL::Segment_Delaunay_graph_traits_2` \sa `CGAL::Segment_Delaunay_graph_filtered_traits_2` \sa `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_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 ed3e1069c1e..b925fa57dd9 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,33 +4,23 @@ namespace CGAL { /*! \ingroup PkgSegmentDelaunayGraph2Ref +\cgalModels `SegmentDelaunayGraphVertexBase_2` + The class `Segment_Delaunay_graph_vertex_base_2` provides a model for the `SegmentDelaunayGraphVertexBase_2` concept which is the vertex base required by the `SegmentDelaunayGraphDataStructure_2` concept. -\tparam Gt must be a model of the concept `SegmentDelaunayGraphTraits_2`. -\tparam SSTag indicates whether -or not to use the simple storage site that does not support -intersecting segments, or the full storage site, that supports -intersecting segments. The possible values are `Tag_true` -and `Tag_false`. `Tag_true` indicates that the -full storage site is to be used, whereas `Tag_false` -indicates that the simple storage site is to be used. +\tparam St must be a model of the concept `SegmentDelaunayGraphStorageTraits_2`. + This type must be template parameter used for `CGAL::Segment_Delaunay_graph_2`. -\cgalModels `SegmentDelaunayGraphVertexBase_2` - -\sa `SegmentDelaunayGraphVertexBase_2` -\sa `SegmentDelaunayGraphDataStructure_2` -\sa `SegmentDelaunayGraphTraits_2` -\sa `CGAL::Triangulation_data_structure_2` -\sa `CGAL::Segment_Delaunay_graph_traits_2` -\sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` -\sa `CGAL::Segment_Delaunay_graph_filtered_traits_2` -\sa `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2` +\tparam Vb is a vertex base class from which `Segment_Delaunay_graph_vertex_base_2` derives. + It must be a model of the `TriangulationDSVertexBase_2` concept. + It has the default value `CGAL::Triangulation_ds_vertex_base_2<>`. +\sa `CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2` */ -template< typename Gt, typename SSTag > +template< typename St, typename Vb > class Segment_Delaunay_graph_vertex_base_2 { public: 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 new file mode 100644 index 00000000000..8837bc14b74 --- /dev/null +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h @@ -0,0 +1,22 @@ + +/*! +\ingroup PkgSegmentDelaunayGraph2Concepts +\cgalConcept + +The concept `SegmentDelaunayGraphFaceBase_2` describes the +requirements for the face base class of the +`SegmentDelaunayGraphDataStructure_2` concept. + +\cgalRefines `TriangulationFaceBase_2` + +\cgalHasModel `CGAL::Segment_Delaunay_graph_face_base_2` + +\sa `SegmentDelaunayGraphDataStructure_2` +\sa `SegmentDelaunayGraphTraits_2` +\sa `CGAL::Triangulation_data_structure_2` +*/ +class SegmentDelaunayGraphFaceBase_2 { +public: + +}; /* end SegmentDelaunayGraphFaceBase_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 e55017d68e7..626239edae2 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,13 +26,13 @@ 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 > +\cgalHasModel CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2 > \sa `SegmentDelaunayGraphDataStructure_2` \sa `SegmentDelaunayGraphVertexBase_2` -\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` +\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` \sa `CGAL::Triangulation_data_structure_2` -\sa `CGAL::Segment_Delaunay_graph_vertex_base_2` +\sa `CGAL::Segment_Delaunay_graph_vertex_base_2` \sa `CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_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 e6dbd01f666..d52818a7e70 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 @@ -51,7 +51,7 @@ typedef unspecified_type RT; /// \name Creation /// In addition to the default and copy constructors the following -/// static methods are available for constructing sites: +/// static methods must be available for constructing sites: /// @{ /*! 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 new file mode 100644 index 00000000000..63d1ae08db2 --- /dev/null +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h @@ -0,0 +1,92 @@ + +/*! +\ingroup PkgSegmentDelaunayGraph2Concepts +\cgalConcept + +The concept `SegmentDelaunayGraphStorageTraits_2` provides the +requirements for the storage traits of a segment Delaunay graph. + +To avoid redundancy in the storage of points, the input points of a segment Delaunay graph +are stored in a container, and the various types of sites (input points and segments, +points of intersection, subsegments with one or two points of intersection as endpoints) +only store handles to the points in the container. + +See section \ref Segment_Delaunay_graph_2StronglyIntersecting for more information. + +\cgalRefines `DefaultConstructible` +\cgalRefines `CopyConstructible` +\cgalRefines `Assignable` + +\cgalHasModel `CGAL::Segment_Delaunay_graph_storage_traits_2` + +\sa `SegmentDelaunayGraphTraits_2` +*/ + +class SegmentDelaunayGraphStorageTraits_2 { +public: + +/// \name Types +/// @{ + + /*! + The geometric traits type. It must be a model of `SegmentDelaunayGraphTraits_2`. + */ + typedef unspecified_type Geom_traits; + + /*! + A container of unique points, used to associate a unique handle to each + unique input geometric position. + */ + typedef std::set Point_container; + + /*! + */ + typedef Point_container::iterator Point_handle; + + /*! + */ + typedef Point_container::const_iterator const_Point_handle; + + /*! + Type for the storage site. It must be a model of `SegmentDelaunayGraphStorageSite_2`. + */ + typedef unspecified_type Storage_site_2; + + /*! + Type of the storage site construction functor. + */ + typedef CGAL::SegmentDelaunayGraph_2::Construct_storage_site_2 Construct_storage_site_2; + +/// @} + +/// \name Creation +/// @{ + + /*! + Constructor. + */ + SegmentDelaunayGraphStorageTraits_2(const Geom_traits& gt = Geom_traits()); + +/// @} + +/// \name Access Functions +/// @{ + + /*! + returns the geometric traits. + */ + const Geom_traits& geom_traits() const; + +/// @} + +/// \name Constructions +/// @{ + + /*! + returns a functor of type `Construct_storage_site_2`. + */ + Construct_storage_site_2 construct_storage_site_2_object() const +/// @} + +}; /* end SegmentDelaunayGraphStorageTraits_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 240688dd27f..677d942fe8f 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 @@ -1,14 +1,15 @@ /*! \ingroup PkgSegmentDelaunayGraph2Concepts + \cgalConcept \cgalRefines `TriangulationTraits_2` The concept `SegmentDelaunayGraphTraits_2` provides the traits -requirements for the `CGAL::Segment_Delaunay_graph_2` and -`CGAL::Segment_Delaunay_graph_hierarchy_2` classes. In -particular, it provides a type `Site_2`, which must be a model of +requirements for the `CGAL::Segment_Delaunay_graph_2` and +`CGAL::Segment_Delaunay_graph_hierarchy_2` classes. +In particular, it provides a type `Site_2`, which must be a model of the concept `SegmentDelaunayGraphSite_2`. It also provides constructions for sites and several function object types for the predicates. @@ -19,8 +20,8 @@ types for the predicates. \cgalHasModel `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2` \sa `SegmentDelaunayGraphSite_2` -\sa `CGAL::Segment_Delaunay_graph_2` -\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` +\sa `CGAL::Segment_Delaunay_graph_2` +\sa `CGAL::Segment_Delaunay_graph_hierarchy_2` \sa `CGAL::Segment_Delaunay_graph_traits_2` \sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` \sa `CGAL::Segment_Delaunay_graph_filtered_traits_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 639b99e3b13..903d9e92b68 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 @@ -3,7 +3,7 @@ \ingroup PkgSegmentDelaunayGraph2Concepts \cgalConcept -\cgalRefines `TriangulationVertexBase_2` +\cgalRefines `TriangulationDSVertexBase_2` The concept `SegmentDelaunayGraphVertexBase_2` describes the requirements for the vertex base class of the @@ -11,19 +11,15 @@ 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` +\cgalHasModel `CGAL::Segment_Delaunay_graph_vertex_base_2` -\sa `SegmentDelaunayGraphDataStructure_2` \sa `SegmentDelaunayGraphTraits_2` \sa `SegmentDelaunayGraphSite_2` \sa `SegmentDelaunayGraphStorageSite_2` -\sa `CGAL::Segment_Delaunay_graph_vertex_base_2` \sa `CGAL::Segment_Delaunay_graph_site_2` \sa `CGAL::Segment_Delaunay_graph_storage_site_2` \sa `CGAL::Triangulation_data_structure_2` - */ - class SegmentDelaunayGraphVertexBase_2 { public: @@ -31,46 +27,40 @@ public: /// @{ /*! -A type for the geometric traits that defines -the site. \pre The type `Geom_traits` must define the type `Site_2`. +A type for the geometric traits that defines the site. +\pre The type `Geom_traits` must define the type `Site_2`. */ typedef unspecified_type Geom_traits; /*! -A type for the site. This type must coincide -with the type `Geom_traits::Site_2`. +A type for the site. This type must coincide with the type `Geom_traits::Site_2`. */ typedef unspecified_type Site_2; /*! -A type that indicates what kind of -storage type to use. `Storage_site_tag` must either be -`CGAL::Tag_true` or `CGAL::Tag_false`. +A type that indicates what kind of storage type to use. +`Storage_site_tag` must either be `CGAL::Tag_true` or `CGAL::Tag_false`. */ typedef unspecified_type Storage_site_tag; /*! -A type for the internal representation -of sites. This type must satisfy the requirements of the concept -`SegmentDelaunayGraphStorageSite_2`. +A type for the internal representation of sites. +This type must satisfy the requirements of the concept `SegmentDelaunayGraphStorageSite_2`. */ typedef unspecified_type Storage_site_2; /*! -A type for the -underlying data structure, to which the vertex belongs to. +A type for the underlying data structure, to which the vertex belongs to. */ typedef unspecified_type Data_structure; /*! -A type for the vertex handle of the -segment Delaunay graph data structure. +A type for the vertex handle of the segment Delaunay graph data structure. */ typedef unspecified_type Vertex_handle; /*! -A type for the face handle of the -segment Delaunay graph data structure. +A type for the face handle of the segment Delaunay graph data structure. */ typedef unspecified_type Face_handle; @@ -82,18 +72,15 @@ typedef unspecified_type Face_handle; /// @{ /*! -Constructs a vertex associated with the site represented by the -storage site `ss`. +Constructs a vertex associated with the site represented by the storage site `ss`. */ -SegmentDelaunayGraphVertexBase_2(Storage_site_2 ss); +SegmentDelaunayGraphVertexBase_2(const Storage_site_2& ss); /*! -Constructs a vertex associated with -the site represented by the storage site `ss`, +Constructs a vertex associated with the site represented by the storage site `ss`, and pointing to the face associated with the face handle `f`. */ -SegmentDelaunayGraphVertexBase_2(Storage_site_2 ss, -Face_handle f); +SegmentDelaunayGraphVertexBase_2(const Storage_site_2& ss, Face_handle f); /// @} @@ -103,7 +90,7 @@ Face_handle f); /*! Returns the storage site representing the site. */ -Storage_site_2 storage_site(); +const Storage_site_2& storage_site(); /*! Returns the site. @@ -123,7 +110,7 @@ Face_handle face(); /*! Sets the storage site. */ -void set_site(Storage_site_2 ss); +void set_site(const Storage_site_2& ss); /*! Sets the incident face. diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/PackageDescription.txt b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/PackageDescription.txt index 0c74e16e383..947f7034f0d 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/PackageDescription.txt +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/PackageDescription.txt @@ -20,7 +20,7 @@ \cgalPkgShortInfoEnd \cgalPkgDescriptionEnd -\cgal provides the class `CGAL::Segment_Delaunay_graph_2` for +\cgal provides the class `CGAL::Segment_Delaunay_graph_2` for computing the 2D Delaunay graph of segments and points. The two template parameters must be models of the `SegmentDelaunayGraphTraits_2` and @@ -44,23 +44,28 @@ the class - `SegmentDelaunayGraphSite_2` - `SegmentDelaunayGraphStorageSite_2` +- `SegmentDelaunayGraphStorageTraits_2` - `SegmentDelaunayGraphDataStructure_2` - `SegmentDelaunayGraphVertexBase_2` +- `SegmentDelaunayGraphFaceBase_2` - `SegmentDelaunayGraphTraits_2` - `SegmentDelaunayGraphHierarchyVertexBase_2` \cgalCRPSection{Classes} -- `CGAL::Segment_Delaunay_graph_2` +- `CGAL::Segment_Delaunay_graph_2` - `CGAL::Segment_Delaunay_graph_site_2` - `CGAL::Segment_Delaunay_graph_storage_site_2` -- `CGAL::Segment_Delaunay_graph_vertex_base_2` +- `CGAL::Segment_Delaunay_graph_storage_site_with_info_2` +- `CGAL::Segment_Delaunay_graph_storage_traits_2` +- `CGAL::Segment_Delaunay_graph_storage_traits_with_info_2` +- `CGAL::Segment_Delaunay_graph_vertex_base_2` +- `CGAL::Segment_Delaunay_graph_face_base_2` - `CGAL::Segment_Delaunay_graph_traits_2` - `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` - `CGAL::Segment_Delaunay_graph_filtered_traits_2` - `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2` -- `CGAL::Segment_Delaunay_graph_hierarchy_2` +- `CGAL::Segment_Delaunay_graph_hierarchy_2` - `CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2` */ - 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 03cf5c807c3..306fa9e2a91 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 @@ -294,8 +294,8 @@ points of intersection. To avoid this redundancy, input points are stored in a container, and the various types of sites (input points and segments, points of intersection, subsegments with one or two points of intersection as endpoints) only store handles to the points -in the container. This is achieved by the -`Segment_Delaunay_graph_storage_site_2` class which is a +in the container. This is achieved with the +`Segment_Delaunay_graph_storage_site_2` class, which is a model of the corresponding concept: `SegmentDelaunayGraphStorageSite_2`. This concept enforces a site to be represented by up to 6 handles (which are very lightweight @@ -449,9 +449,8 @@ class is used, the possible values are `Field_with_sqrt_tag` and \section secsdg2hierarchy The Segment Delaunay Graph Hierarchy -The -`Segment_Delaunay_graph_hierarchy_2` class is the analogue -of the `Triangulation_hierarchy_2` or the +The `Segment_Delaunay_graph_hierarchy_2` +class is the analogue of the `Triangulation_hierarchy_2` or the `Apollonius_graph_hierarchy_2` classes, applied to the segment Delaunay graph. It consists of a hierarchy of segment Delaunay graphs constructed in a manner analogous to the @@ -480,9 +479,9 @@ Delaunay graphs. If `SSTag` is set to `true`, we have segment Delaunay graphs at all levels of the hierarchy. The class -`Segment_Delaunay_graph_hierarchy_2` +`Segment_Delaunay_graph_hierarchy_2` has exactly the same interface and functionality as the -`Segment_Delaunay_graph_2` +`Segment_Delaunay_graph_2` class. Using the segment Delaunay graph hierarchy involves an additional cost in space and time for maintaining the hierarchy. Our experiments have shown that it usually pays off to use the hierarchy diff --git a/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_vertex_base_2.h b/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_vertex_base_2.h index b7876255e4b..d9267828e29 100644 --- a/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_vertex_base_2.h +++ b/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_vertex_base_2.h @@ -11,8 +11,6 @@ // Author(s) : Menelaos Karavelas - - #ifndef CGAL_SEGMENT_DELAUNAY_GRAPH_VERTEX_BASE_2_H #define CGAL_SEGMENT_DELAUNAY_GRAPH_VERTEX_BASE_2_H @@ -21,12 +19,7 @@ #include #include - #include -#include -#include - - namespace CGAL { diff --git a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_sqrt_field_new_C2.h b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_sqrt_field_new_C2.h index b9f1f840a89..8ea07173025 100644 --- a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_sqrt_field_new_C2.h +++ b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_sqrt_field_new_C2.h @@ -579,7 +579,7 @@ private: vort = Aort - (dort)/(FT(2)); } else { vpar = Apar; - vort = Aort - CGAL::sign(dort)*absdpar; + vort = Aort - int(CGAL::sign(dort))*absdpar; } vv = Point_2(vx_, vy_); } @@ -684,11 +684,11 @@ private: vv = Point_2(is_r_horizontal ? (pp.x() + qq.x()) : (comp == LARGER) ? - RT(2)*coordr + CGAL::sign(signrdist)*pqdist : + RT(2)*coordr + int(CGAL::sign(signrdist))*pqdist : coordr + pp.x(), is_r_horizontal ? (comp == LARGER) ? - RT(2)*coordr + CGAL::sign(signrdist)*pqdist : + RT(2)*coordr + int(CGAL::sign(signrdist))*pqdist : coordr + pp.y() : (pp.y() + qq.y()), RT(2)); @@ -725,9 +725,9 @@ private: } else { vv = Point_2(is_r_horizontal ? (pp.x() + qq.x()) : - (RT(2)*coordr + CGAL::sign(sdistf)*pqdist), + (RT(2)*coordr + int(CGAL::sign(sdistf))*pqdist), is_r_horizontal ? - (RT(2)*coordr + CGAL::sign(sdistf)*pqdist) : + (RT(2)*coordr + int(CGAL::sign(sdistf))*pqdist) : (pp.y() + qq.y()), RT(2)); } @@ -771,8 +771,8 @@ private: Point_2(pcoord, lineval) : Point_2(lineval, pcoord); const FT sidelen = (CGAL::max)(CGAL::abs(corner.x() - q.point().x()), CGAL::abs(corner.y() - q.point().y())); - vv = Point_2(FT(2)*corner.x() + signla*sidelen, - FT(2)*corner.y() + signlb*sidelen, + vv = Point_2(FT(2)*corner.x() + int(signla)*sidelen, + FT(2)*corner.y() + int(signlb)*sidelen, FT(2)); return; } @@ -783,8 +783,8 @@ private: Point_2(lineval, qcoord) : Point_2(qcoord, lineval); const FT sidelen = (CGAL::max)(CGAL::abs(corner.x() - p.point().x()), CGAL::abs(corner.y() - p.point().y())); - vv = Point_2(FT(2)*corner.x() + signla*sidelen, - FT(2)*corner.y() + signlb*sidelen, + vv = Point_2(FT(2)*corner.x() + int(signla)*sidelen, + FT(2)*corner.y() + int(signlb)*sidelen, FT(2)); return; } @@ -812,8 +812,8 @@ private: // is shorter than Linf p, q distance const Point_2 corner = pos_slope? Point_2(pcoord, plineval) : Point_2(plineval, pcoord); - vv = Point_2(FT(2)*corner.x() + signla*pqdist, - FT(2)*corner.y() + signlb*pqdist, + vv = Point_2(FT(2)*corner.x() + int(signla)*pqdist, + FT(2)*corner.y() + int(signlb)*pqdist, FT(2)); return; } @@ -829,8 +829,8 @@ private: // is shorter than Linf p, q distance const Point_2 corner = pos_slope? Point_2(qlineval, qcoord) : Point_2(qcoord, qlineval); - vv = Point_2(FT(2)*corner.x() + signla*pqdist, - FT(2)*corner.y() + signlb*pqdist, + vv = Point_2(FT(2)*corner.x() + int(signla)*pqdist, + FT(2)*corner.y() + int(signlb)*pqdist, FT(2)); return; } @@ -1421,12 +1421,12 @@ private: RT ux_, uy_, uz_; if (cmp == LARGER) { ux_ = is_q_hor ? r_coord + p_coord_r : q_coord + p_coord_q; - uy_ = is_q_hor ? (RT(2)*q_coord + CGAL::sign(sdistq)*dx) : - (RT(2)*r_coord + CGAL::sign(sdistr)*dx) ; + uy_ = is_q_hor ? (RT(2)*q_coord + int(CGAL::sign(sdistq))*dx) : + (RT(2)*r_coord + int(CGAL::sign(sdistr))*dx) ; } else if (cmp == SMALLER) { uy_ = is_r_hor ? r_coord + p_coord_r : q_coord + p_coord_q; - ux_ = is_r_hor ? (RT(2)*q_coord + CGAL::sign(sdistq)*dy) : - (RT(2)*r_coord + CGAL::sign(sdistr)*dy) ; + ux_ = is_r_hor ? (RT(2)*q_coord + int(CGAL::sign(sdistq))*dy) : + (RT(2)*r_coord + int(CGAL::sign(sdistr))*dy) ; } else { ux_ = is_q_hor ? r_coord + p_coord_r : q_coord + p_coord_q; uy_ = is_q_hor ? q_coord + p_coord_q : r_coord + p_coord_r; diff --git a/Set_movable_separability_2/examples/Set_movable_separability_2/CMakeLists.txt b/Set_movable_separability_2/examples/Set_movable_separability_2/CMakeLists.txt index dc42d213320..1ee57d6555d 100644 --- a/Set_movable_separability_2/examples/Set_movable_separability_2/CMakeLists.txt +++ b/Set_movable_separability_2/examples/Set_movable_separability_2/CMakeLists.txt @@ -13,9 +13,6 @@ if(has_cpp11 LESS 0) return() endif() -# Use C++11 for this directory and its sub-directories. -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED TRUE) find_package(CGAL REQUIRED) diff --git a/Set_movable_separability_2/include/CGAL/Set_movable_separability_2/Single_mold_translational_casting/pullout_directions.h b/Set_movable_separability_2/include/CGAL/Set_movable_separability_2/Single_mold_translational_casting/pullout_directions.h index 25045340e0f..8c0a4a80baa 100644 --- a/Set_movable_separability_2/include/CGAL/Set_movable_separability_2/Single_mold_translational_casting/pullout_directions.h +++ b/Set_movable_separability_2/include/CGAL/Set_movable_separability_2/Single_mold_translational_casting/pullout_directions.h @@ -129,7 +129,7 @@ pullout_directions //is true if segment_outer_circle \in [first,clock_first,clock_second] if (f_between_ab && s_between_ab) { // std::cout<<"case 1"< // Boost includes. -#include +#include // CGAL includes. #include 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 ec22801ba1d..820eee71576 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 @@ -1030,8 +1030,10 @@ namespace CGAL { } inline FT stop_probability(std::size_t largest_candidate, std::size_t num_pts, std::size_t num_candidates, std::size_t octree_depth) const { - return (std::min)(std::pow((FT) 1.f - (FT) largest_candidate - / (FT(num_pts) * (octree_depth+1) * (1 << (m_required_samples - 1))), (int) num_candidates), (FT) 1); + return (std::min)(std::pow(FT(1) - FT(largest_candidate) + / (FT(num_pts) * FT(octree_depth+1) + * FT(1 << (m_required_samples - 1))), + int(num_candidates)), FT(1)); } private: diff --git a/Shape_detection/test/Shape_detection/CMakeLists.txt b/Shape_detection/test/Shape_detection/CMakeLists.txt index cfe7db967d8..82ec5d66487 100644 --- a/Shape_detection/test/Shape_detection/CMakeLists.txt +++ b/Shape_detection/test/Shape_detection/CMakeLists.txt @@ -4,8 +4,6 @@ cmake_minimum_required(VERSION 3.1...3.15) project(Shape_detection_Tests) -set(CMAKE_CXX_STANDARD 11) - find_package(CGAL REQUIRED COMPONENTS Core) include(${CGAL_USE_FILE}) @@ -13,7 +11,7 @@ include(CGAL_CreateSingleSourceCGALProgram) # Use Eigen. find_package(Eigen3 3.1.0 QUIET) # (3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) if(EIGEN3_FOUND) create_single_source_cgal_program("test_region_growing_basic.cpp") create_single_source_cgal_program("test_region_growing_on_cube.cpp") @@ -39,7 +37,7 @@ if(EIGEN3_FOUND) test_region_growing_on_point_set_3_with_sorting test_region_growing_on_polygon_mesh_with_sorting test_region_growing_on_degenerated_mesh) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() set(RANSAC_PROTO_DIR CACHE PATH "") @@ -51,10 +49,10 @@ if(EIGEN3_FOUND) file(GLOB proto_misc_src "${RANSAC_PROTO_DIR}/MiscLib/*.cpp") add_library(libproto STATIC ${proto_src} ${proto_misc_src}) add_executable(test_validity_sampled_data "test_validity_sampled_data.cpp") - target_link_libraries(test_validity_sampled_data libproto CGAL::CGAL CGAL::Eigen_support) + target_link_libraries(test_validity_sampled_data libproto CGAL::CGAL CGAL::Eigen3_support) else() add_executable(test_validity_sampled_data "test_validity_sampled_data.cpp") - target_link_libraries(test_validity_sampled_data CGAL::CGAL CGAL::Eigen_support) + target_link_libraries(test_validity_sampled_data CGAL::CGAL CGAL::Eigen3_support) endif() cgal_add_test(test_validity_sampled_data) endif() diff --git a/Shape_detection/test/Shape_detection/test_validity_sampled_data.cpp b/Shape_detection/test/Shape_detection/test_validity_sampled_data.cpp index aed7e31b27d..b7c5c2ab9a1 100644 --- a/Shape_detection/test/Shape_detection/test_validity_sampled_data.cpp +++ b/Shape_detection/test/Shape_detection/test_validity_sampled_data.cpp @@ -18,7 +18,10 @@ #include -#include +#include + +// Uncomment this line to run expensive test +// #define CGAL_SHAPE_DETECTION_RUN_EXPENSIVE_TESTS namespace SD = CGAL::Shape_detection; @@ -64,7 +67,7 @@ int main (int argc, char** argv) test_copied_point_cloud (points, 2); test_copied_point_cloud (points, 5); test_copied_point_cloud (points, 10); -#ifndef CGAL_TEST_SUITE // Disable tests too large for testsuite +#ifdef CGAL_SHAPE_DETECTION_RUN_EXPENSIVE_TESTS test_copied_point_cloud (points, 20); test_copied_point_cloud (points, 50); #endif diff --git a/Solver_interface/doc/Solver_interface/Solver_interface.txt b/Solver_interface/doc/Solver_interface/Solver_interface.txt index 587442df349..e5fded45ffa 100644 --- a/Solver_interface/doc/Solver_interface/Solver_interface.txt +++ b/Solver_interface/doc/Solver_interface/Solver_interface.txt @@ -118,7 +118,7 @@ This package is the result of the increasing needs for linear solvers in \cgal. The first packages that introduced the solver concepts were \ref PkgSurfaceMeshParameterization, \ref PkgPoissonSurfaceReconstruction3 and \ref PkgJetFitting3. At that time, these packages were relying -on \sc{Taucs}, \sc{LAPACK}, \sc{BLAS} and \sc{OpenNL}. Gaël Guennebaud +on \taucs, \lapack, \blas and \opennl. Gaël Guennebaud then introduced new models using the \ref thirdpartyEigen library that became the only supported models by \cgal. Later on the packages \ref PkgSurfaceMeshSkeletonization and \ref PkgSurfaceMeshDeformation diff --git a/Solver_interface/examples/Solver_interface/CMakeLists.txt b/Solver_interface/examples/Solver_interface/CMakeLists.txt index 7cbbdab9622..26abe18b449 100644 --- a/Solver_interface/examples/Solver_interface/CMakeLists.txt +++ b/Solver_interface/examples/Solver_interface/CMakeLists.txt @@ -8,15 +8,15 @@ find_package(CGAL REQUIRED) # Use Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) -if(TARGET CGAL::Eigen_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("singular_value_decomposition.cpp") - target_link_libraries(singular_value_decomposition PUBLIC CGAL::Eigen_support) + target_link_libraries(singular_value_decomposition PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("sparse_solvers.cpp") - target_link_libraries(sparse_solvers PUBLIC CGAL::Eigen_support) + target_link_libraries(sparse_solvers PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("diagonalize_matrix.cpp") - target_link_libraries(diagonalize_matrix PUBLIC CGAL::Eigen_support) + target_link_libraries(diagonalize_matrix PUBLIC CGAL::Eigen3_support) endif() create_single_source_cgal_program("mixed_integer_program.cpp") diff --git a/Spatial_searching/benchmark/Spatial_searching/CMakeLists.txt b/Spatial_searching/benchmark/Spatial_searching/CMakeLists.txt index 996bc8b7be6..049a11792e8 100644 --- a/Spatial_searching/benchmark/Spatial_searching/CMakeLists.txt +++ b/Spatial_searching/benchmark/Spatial_searching/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(CGAL REQUIRED COMPONENTS Core) include(${CGAL_USE_FILE}) find_package(Eigen3 3.1.91) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) include_directories(BEFORE "include") @@ -44,5 +44,5 @@ foreach( nn3nanoflan sizeof deque) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() diff --git a/Spatial_searching/examples/Spatial_searching/CMakeLists.txt b/Spatial_searching/examples/Spatial_searching/CMakeLists.txt index cf8a147a739..b7102fc0a8b 100644 --- a/Spatial_searching/examples/Spatial_searching/CMakeLists.txt +++ b/Spatial_searching/examples/Spatial_searching/CMakeLists.txt @@ -8,7 +8,7 @@ project(Spatial_searching_Examples) find_package(CGAL REQUIRED) find_package(Eigen3 3.1.91) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) if(MSVC) # Turn off VC++ warning @@ -51,13 +51,13 @@ create_single_source_cgal_program("using_fair_splitting_rule.cpp") create_single_source_cgal_program("weighted_Minkowski_distance.cpp") -if(TARGET CGAL::Eigen_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("fuzzy_range_query.cpp") - target_link_libraries(fuzzy_range_query PUBLIC CGAL::Eigen_support) + target_link_libraries(fuzzy_range_query PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("general_neighbor_searching.cpp") - target_link_libraries(general_neighbor_searching PUBLIC CGAL::Eigen_support) + target_link_libraries(general_neighbor_searching PUBLIC CGAL::Eigen3_support) else() diff --git a/Spatial_searching/examples/Spatial_searching/parallel_kdtree.cpp b/Spatial_searching/examples/Spatial_searching/parallel_kdtree.cpp index a14612a5f22..12f474909f6 100644 --- a/Spatial_searching/examples/Spatial_searching/parallel_kdtree.cpp +++ b/Spatial_searching/examples/Spatial_searching/parallel_kdtree.cpp @@ -47,7 +47,7 @@ int main() // neighbor search returns a set of pair of // point and distance , here we // keep the points only - for (const Point_with_distance& pwd : search) + for (const Point_with_distance pwd : search) neighbors[s].push_back (pwd.first); } }); diff --git a/Spatial_searching/include/CGAL/Kd_tree.h b/Spatial_searching/include/CGAL/Kd_tree.h index f4cf65bd057..4e8eb8abaa3 100644 --- a/Spatial_searching/include/CGAL/Kd_tree.h +++ b/Spatial_searching/include/CGAL/Kd_tree.h @@ -281,10 +281,8 @@ public: template Kd_tree(InputIterator first, InputIterator beyond, Splitter s = Splitter(),const SearchTraits traits=SearchTraits()) - : traits_(traits),split(s), built_(false), removed_(false) - { - pts.insert(pts.end(), first, beyond); - } + : traits_(traits), split(s), pts(first, beyond), built_(false), removed_(false) + { } bool empty() const { return pts.empty(); diff --git a/Spatial_sorting/doc/Spatial_sorting/CGAL/Multiscale_sort.h b/Spatial_sorting/doc/Spatial_sorting/CGAL/Multiscale_sort.h index e6f85f14238..acb46863901 100644 --- a/Spatial_sorting/doc/Spatial_sorting/CGAL/Multiscale_sort.h +++ b/Spatial_sorting/doc/Spatial_sorting/CGAL/Multiscale_sort.h @@ -8,7 +8,7 @@ Given a range of `n` points:
    1. it applies `Sort` on the last `(1 - ratio) * n` points,
    2. it recurses on the first `ratio * n` points, -stopping when there are less than `threshold` points. +stopping when there are fewer than `threshold` points.
    */ diff --git a/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h b/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h index 0ea51bb24bc..324a8bdb060 100644 --- a/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h +++ b/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h @@ -83,8 +83,14 @@ struct Hilbert_cmp_3 } // namespace internal +#ifdef __clang__ +#define CGAL_VISIBILITY_MACRO __attribute__ ((visibility ("hidden"))) +#else +#define CGAL_VISIBILITY_MACRO +#endif + template -class Hilbert_sort_median_3 +class CGAL_VISIBILITY_MACRO Hilbert_sort_median_3 { public: typedef Hilbert_sort_median_3 Self; diff --git a/Spatial_sorting/include/CGAL/Hilbert_sort_median_d.h b/Spatial_sorting/include/CGAL/Hilbert_sort_median_d.h index df4c3858e5c..a88b3926006 100644 --- a/Spatial_sorting/include/CGAL/Hilbert_sort_median_d.h +++ b/Spatial_sorting/include/CGAL/Hilbert_sort_median_d.h @@ -114,7 +114,7 @@ public: current_dir = (current_dir +1) % _dimension; }while (current_dir != last_dir); - if ( end-begin < two_to_dim) return; // less than 2^dim points + if ( end-begin < two_to_dim) return; // fewer than 2^dim points /////////////start recursive calls last_dir = (direction + _dimension -1) % _dimension; 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 9180253eda1..f795e14f2a3 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 @@ -266,7 +266,7 @@ If `Polygon_with_holes_2` is used, you can pass an instance of it directly to th \subsection Straight_skeleton_2CreateOffsetPolygonsfrom Create Offset Polygons from a Straight Skeleton -If you already have a straight skeleton instance, the simpler way to generate offset polygons is to call `create_offset_polygons_2()` as shown in the next example, passing the desired offset and the straight skeleton. You can reuse the same skeleton to generate offsets at a different distance, which is recommended because producing the straight skeleton is much slower then generating offset polygons. +If you already have a straight skeleton instance, the simpler way to generate offset polygons is to call `create_offset_polygons_2()` as shown in the next example, passing the desired offset and the straight skeleton. You can reuse the same skeleton to generate offsets at a different distance, which is recommended because producing the straight skeleton is much slower than generating offset polygons. \cgalExample{Straight_skeleton_2/Create_offset_polygons_2.cpp} 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 e2936def38a..5adacb71a4f 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 @@ -17,7 +17,6 @@ #include #include -#include #include #include #if BOOST_VERSION == 106000 @@ -2018,12 +2017,12 @@ bool Straight_skeleton_builder_2::FinishUp() std::for_each( mSplitNodes.begin() ,mSplitNodes.end () - ,boost::bind(&Straight_skeleton_builder_2::MergeSplitNodes,this,_1) + ,[this](Vertex_handle_pair p){ this->MergeSplitNodes(p); } ) ; std::for_each( mDanglingBisectors.begin() ,mDanglingBisectors.end () - ,boost::bind(&Straight_skeleton_builder_2::EraseBisector,this,_1) + ,[this](Halfedge_handle db){ this->EraseBisector(db); } ) ; // MergeCoincidentNodes() locks all extremities of halfedges that have a vertex involved in a multinode. 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 3873a6c54c4..c38e416ab4b 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h @@ -1360,7 +1360,7 @@ public: } else { - CGAL_STSKEL_BUILDER_TRACE(0,"Degenerate contour (less than 3 non-degenerate vertices)."); + CGAL_STSKEL_BUILDER_TRACE(0,"Degenerate contour (fewer than 3 non-degenerate vertices)."); } } else diff --git a/Stream_support/include/CGAL/IO/3MF/write_3mf.h b/Stream_support/include/CGAL/IO/3MF/write_3mf.h index 2b79ec366d0..b8e55897def 100644 --- a/Stream_support/include/CGAL/IO/3MF/write_3mf.h +++ b/Stream_support/include/CGAL/IO/3MF/write_3mf.h @@ -260,7 +260,7 @@ bool write_points(const PointRange& points, return false; } - //add 3 demmy vertices to be sure to have a valid triangle and accept point sets with less than 3 vertices. + //add 3 dummy vertices to be sure to have a valid triangle and accept point sets with fewer than 3 vertices. for(int i = 0; i< 3; ++i) pVertices.push_back(tmf_internal::fnCreateVertex(0,0,0)); diff --git a/Stream_support/include/CGAL/IO/GOCAD.h b/Stream_support/include/CGAL/IO/GOCAD.h index d28f5fe5d9f..104a3c6cc54 100644 --- a/Stream_support/include/CGAL/IO/GOCAD.h +++ b/Stream_support/include/CGAL/IO/GOCAD.h @@ -299,8 +299,7 @@ bool write_GOCAD(std::ostream& os, set_ascii_mode(os); // GOCAD is ASCII only - const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6); - os.precision(precision); + set_stream_precision_from_NP(os, np); os << "GOCAD TSurf 1\n" "HEADER {\n" @@ -357,7 +356,7 @@ bool write_GOCAD(std::ostream& os, * \cgalParamNBegin{stream_precision} * \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} * \cgalParamType{int} - * \cgalParamDefault{`6`} + * \cgalParamDefault{`the precision of the stream `os``} * \cgalParamNEnd * \cgalNamedParamsEnd * diff --git a/Stream_support/include/CGAL/IO/Generic_writer.h b/Stream_support/include/CGAL/IO/Generic_writer.h index abf9077c49f..2f5d2a50d4a 100644 --- a/Stream_support/include/CGAL/IO/Generic_writer.h +++ b/Stream_support/include/CGAL/IO/Generic_writer.h @@ -49,8 +49,7 @@ public: if(!m_os.good()) return false; - const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6); - m_os.precision(precision); + set_stream_precision_from_NP(m_os, np); m_writer.write_header(m_os, points.size(), 0, polygons.size()); for(std::size_t i=0, end=points.size(); i #include +#include #include #include @@ -158,9 +159,9 @@ bool read_OBJ(std::istream& is, } if(norm_found && verbose) - std::cout<<"WARNING: normals were found in this file, but were discarded."< #include +#include // OpenInventor and VRML 1.0 are quite similar formats, so // output operators could be shared if they use the following @@ -89,6 +90,12 @@ private: } }; +template +void set_stream_precision_from_NP(Inventor_ostream_base& os, const NP& np) +{ + return set_stream_precision_from_NP(os.os(), np); +} + } // namespace CGAL #endif // CGAL_IO_INVENTOR_OSTREAM_H diff --git a/Stream_support/include/CGAL/IO/PLY.h b/Stream_support/include/CGAL/IO/PLY.h index dc6518096ca..bfcebbf8d7c 100644 --- a/Stream_support/include/CGAL/IO/PLY.h +++ b/Stream_support/include/CGAL/IO/PLY.h @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -444,7 +445,7 @@ bool read_PLY(const std::string& fname, PointRange& points, PolygonRange& polygo * \cgalParamNBegin{stream_precision} * \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} * \cgalParamType{int} - * \cgalParamDefault{`6`} + * \cgalParamDefault{`the precision of the stream `os``} * \cgalParamExtra{This parameter is only meaningful while using ASCII encoding.} * \cgalParamNEnd * \cgalNamedParamsEnd @@ -467,8 +468,7 @@ bool write_PLY(std::ostream& out, if(!out.good()) return false; - const int precision = parameters::choose_parameter(parameters::get_parameter(np, internal_np::stream_precision), 6); - out.precision(precision); + set_stream_precision_from_NP(out, np); // Write header out << "ply" << std::endl diff --git a/Stream_support/include/CGAL/IO/STL.h b/Stream_support/include/CGAL/IO/STL.h index 6865fd03464..009e90b1ad4 100644 --- a/Stream_support/include/CGAL/IO/STL.h +++ b/Stream_support/include/CGAL/IO/STL.h @@ -284,7 +284,7 @@ bool read_STL(const std::string& fname, PointRange& points, TriangleRange& facet * \cgalParamNBegin{stream_precision} * \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} * \cgalParamType{int} - * \cgalParamDefault{`6`} + * \cgalParamDefault{`the precision of the stream `os``} * \cgalParamExtra{This parameter is only meaningful while using ASCII encoding.} * \cgalParamNEnd * \cgalNamedParamsEnd @@ -317,8 +317,7 @@ bool write_STL(std::ostream& os, if(!os.good()) return false; - const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6); - os.precision(precision); + set_stream_precision_from_NP(os, np); if(get_mode(os) == IO::BINARY) { diff --git a/Stream_support/include/CGAL/IO/VRML/VRML_2_ostream.h b/Stream_support/include/CGAL/IO/VRML/VRML_2_ostream.h index 1de37df3967..08e8fdd7e49 100644 --- a/Stream_support/include/CGAL/IO/VRML/VRML_2_ostream.h +++ b/Stream_support/include/CGAL/IO/VRML/VRML_2_ostream.h @@ -21,6 +21,7 @@ #include #include +#include namespace CGAL { @@ -104,6 +105,11 @@ inline VRML_2_ostream& operator<<(VRML_2_ostream& os, return os; } +template +void set_stream_precision_from_NP(VRML_2_ostream& os, const NP& np) +{ + return set_stream_precision_from_NP(os.os(), np); +} } // namespace CGAL #endif // CGAL_IO_VRML_2_OSTREAM_H @@ -315,4 +321,5 @@ operator<<(VRML_2_ostream& os, } //namespace CGAL #endif // CGAL_IO_VRML_VRML_2_SEGMENT_3 + #endif // CGAL_SPHERE_3_H diff --git a/Stream_support/include/CGAL/IO/VTK.h b/Stream_support/include/CGAL/IO/VTK.h index 0723baceadd..d56dd2f0d11 100644 --- a/Stream_support/include/CGAL/IO/VTK.h +++ b/Stream_support/include/CGAL/IO/VTK.h @@ -19,6 +19,7 @@ #include #include +#include #ifdef CGAL_USE_VTK #include @@ -373,7 +374,7 @@ void write_soup_polys_points(std::ostream& os, * \cgalParamNBegin{stream_precision} * \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} * \cgalParamType{int} - * \cgalParamDefault{`6`} + * \cgalParamDefault{`the precision of the stream `os``} * \cgalParamNEnd * \cgalNamedParamsEnd * @@ -393,8 +394,7 @@ bool write_VTP(std::ostream& os, if(!os.good()) return false; - const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6); - os.precision(precision); + set_stream_precision_from_NP(os, np); os << "\n" << " #include #include -// #include #include #include -// #include #include -// #include #include #include diff --git a/Stream_support/src/CGAL/Color.cpp b/Stream_support/src/CGAL/Color.cpp deleted file mode 100644 index d2e0380858a..00000000000 --- a/Stream_support/src/CGAL/Color.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 1997 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// 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, Hervé Brönnimann - -#ifndef CGAL_HEADER_ONLY - -#include - -#endif // CGAL_HEADER_ONLY diff --git a/Stream_support/src/CGAL/File_header_OFF.cpp b/Stream_support/src/CGAL/File_header_OFF.cpp deleted file mode 100644 index a014e1887d4..00000000000 --- a/Stream_support/src/CGAL/File_header_OFF.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 1997 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Lutz Kettner - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY - -// EOF // diff --git a/Stream_support/src/CGAL/File_header_extended_OFF.cpp b/Stream_support/src/CGAL/File_header_extended_OFF.cpp deleted file mode 100644 index 0d9936d3e13..00000000000 --- a/Stream_support/src/CGAL/File_header_extended_OFF.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 1997 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Lutz Kettner - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY - -// EOF // diff --git a/Surface_mesh/examples/Surface_mesh/CMakeLists.txt b/Surface_mesh/examples/Surface_mesh/CMakeLists.txt index cbad83f22db..351342fb9ec 100644 --- a/Surface_mesh/examples/Surface_mesh/CMakeLists.txt +++ b/Surface_mesh/examples/Surface_mesh/CMakeLists.txt @@ -1,6 +1,11 @@ # Created by the script cgal_create_cmake_script # This is the CMake script for compiling a CGAL application. +#/!\ /!\ +#/!\ /!\ +# Used in /CGAL/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt. +# Careful when modifying + cmake_minimum_required(VERSION 3.1...3.15) project(Surface_mesh_Examples) @@ -35,17 +40,16 @@ create_single_source_cgal_program("sm_iterators.cpp") create_single_source_cgal_program("sm_kruskal.cpp") create_single_source_cgal_program("sm_memory.cpp") create_single_source_cgal_program("sm_properties.cpp") - -#create the executable of the application - -create_single_source_cgal_program("draw_surface_mesh.cpp") create_single_source_cgal_program("sm_draw_small_faces.cpp") 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) #link it with the required CGAL libraries - target_link_libraries(draw_surface_mesh PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(sm_draw_small_faces PUBLIC CGAL::CGAL_Qt5) endif() diff --git a/Surface_mesh/examples/Surface_mesh/sm_do_intersect.cpp b/Surface_mesh/examples/Surface_mesh/sm_do_intersect.cpp index 1f9f8cc4d95..33ac1ef7dad 100644 --- a/Surface_mesh/examples/Surface_mesh/sm_do_intersect.cpp +++ b/Surface_mesh/examples/Surface_mesh/sm_do_intersect.cpp @@ -1,3 +1,7 @@ +#include +#include +#include + #include #include @@ -89,16 +93,12 @@ unsigned int intersect(const Mesh& P, const Mesh& Q) { Q_box_ptr.reserve(Q.number_of_faces()); // build boxes and pointers to boxes - boost::transform(P.faces(), - std::back_inserter(P_boxes), - boost::bind(boost::value_factory(), _1, boost::cref(P))); - - + for(auto f : P.faces()) + P_boxes.push_back( Box(f, P) ); std::transform(P_boxes.begin(), P_boxes.end(), std::back_inserter(P_box_ptr), &address_of_box); - boost::transform(Q.faces(), - std::back_inserter(Q_boxes), - boost::bind(boost::value_factory(), _1, boost::cref(Q))); + for(auto f : Q.faces()) + Q_boxes.push_back( Box(f, Q) ); std::transform(Q_boxes.begin(), Q_boxes.end(), std::back_inserter(Q_box_ptr), &address_of_box); @@ -136,5 +136,3 @@ int main(int argc, char* argv[]) return 0; } - - diff --git a/Surface_mesh/include/CGAL/Surface_mesh/IO/OFF.h b/Surface_mesh/include/CGAL/Surface_mesh/IO/OFF.h index f4eb8ac375a..d8200a7592e 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/IO/OFF.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/IO/OFF.h @@ -556,7 +556,7 @@ bool write_OFF_with_or_without_vnormals(std::ostream& os, /// \cgalParamNBegin{stream_precision} /// \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} /// \cgalParamType{int} -/// \cgalParamDefault{`6`} +/// \cgalParamDefault{`the precision of the stream `os``} /// \cgalParamNEnd /// \cgalNamedParamsEnd /// diff --git a/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h b/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h index 3e82506fe8a..f19a3b9d9b2 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h @@ -899,7 +899,7 @@ CGAL_DEPRECATED bool read_ply(std::istream& is, Surface_mesh

    & sm, std::string /// \cgalParamNBegin{stream_precision} /// \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} /// \cgalParamType{int} -/// \cgalParamDefault{`6`} +/// \cgalParamDefault{`the precision of the stream `os``} /// \cgalParamExtra{This parameter is only meaningful while using ASCII encoding.} /// \cgalParamNEnd /// \cgalNamedParamsEnd @@ -921,8 +921,7 @@ bool write_PLY(std::ostream& os, if(!os.good()) return false; - const int precision = parameters::choose_parameter(parameters::get_parameter(np, internal_np::stream_precision), 6); - os.precision(precision); + set_stream_precision_from_NP(os, np); os << "ply" << std::endl << ((get_mode(os) == IO::BINARY) ? "format binary_little_endian 1.0" : "format ascii 1.0") << std::endl @@ -1136,9 +1135,9 @@ bool write_PLY(std::ostream& os, const Surface_mesh

    & sm) */ template -CGAL_DEPRECATED bool write_ply(std::istream& is, Surface_mesh

    & sm, std::string& comments) +CGAL_DEPRECATED bool write_ply(std::ostream& os, const Surface_mesh

    & sm, const std::string& comments) { - return write_PLY(is, sm, comments); + return write_PLY(os, sm, comments); } #endif // CGAL_NO_DEPRECATED_CODE diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index f3866938526..c15a7a5028e 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -32,6 +32,7 @@ void draw(const SM& asm); #ifdef CGAL_USE_BASIC_VIEWER +#include #include #include namespace CGAL @@ -51,6 +52,7 @@ void draw(const Surface_mesh& amesh, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc=1; const char* argv[2]={"surface_mesh_viewer","\0"}; QApplication app(argc,const_cast(argv)); diff --git a/Surface_mesh/test/Surface_mesh/CMakeLists.txt b/Surface_mesh/test/Surface_mesh/CMakeLists.txt index 81a2d0ae980..6527c9bb721 100644 --- a/Surface_mesh/test/Surface_mesh/CMakeLists.txt +++ b/Surface_mesh/test/Surface_mesh/CMakeLists.txt @@ -14,3 +14,16 @@ file( foreach(cppfile ${cppfiles}) create_single_source_cgal_program("${cppfile}") endforeach() + +find_path(3MF_INCLUDE_DIR + NAMES Model/COM/NMR_DLLInterfaces.h + DOC "Path to lib3MF headers" + ) +find_library(3MF_LIBRARIES NAMES 3MF DOC "Path to the lib3MF library") +if(3MF_LIBRARIES AND 3MF_INCLUDE_DIR AND EXISTS "${3MF_INCLUDE_DIR}/Model/COM/NMR_DLLInterfaces.h") + include_directories(${3MF_INCLUDE_DIR}) + target_link_libraries(test_deprecated_io_sm PRIVATE ${3MF_LIBRARIES}) + target_compile_definitions(test_deprecated_io_sm PRIVATE -DCGAL_LINKED_WITH_3MF) +else() + message(STATUS "NOTICE : read_3mf requires the lib3MF library, and will not be tested.") +endif() diff --git a/Surface_mesh/test/Surface_mesh/surface_mesh_test.cpp b/Surface_mesh/test/Surface_mesh/surface_mesh_test.cpp index ee0e71417de..949d2538bff 100644 --- a/Surface_mesh/test/Surface_mesh/surface_mesh_test.cpp +++ b/Surface_mesh/test/Surface_mesh/surface_mesh_test.cpp @@ -4,9 +4,6 @@ #include #include -#include -#include - #include void constructors_test() @@ -118,15 +115,13 @@ void memory_reuse_test() // remove all faces std::size_t old_face_size = f.m.number_of_faces(); std::size_t old_removed_face_size = f.m.number_of_removed_faces(); - boost::range::for_each(f.m.faces(), boost::bind(&Sm::remove_face, boost::ref(f.m), _1)); + for(auto face : f.m.faces()) f.m.remove_face(face); assert(f.m.number_of_faces()== 0); assert(f.m.number_of_removed_faces()== old_face_size + old_removed_face_size); // remove all edges std::size_t old_edge_size = f.m.number_of_edges(); std::size_t old_removed_edge_size = f.m.number_of_removed_edges(); - boost::range::for_each(f.m.edges(), - boost::bind(static_cast(&Sm::remove_edge), - boost::ref(f.m), _1)); + for(auto e : f.m.edges()) f.m.remove_edge(e); assert(f.m.number_of_faces() == 0); assert(f.m.number_of_removed_edges()== old_edge_size + old_removed_edge_size); @@ -151,7 +146,7 @@ void memory_reuse_test() std::size_t old_size = f.m.number_of_vertices(); std::size_t old_removed_size = f.m.number_of_removed_vertices(); - boost::range::for_each(f.m.vertices(), boost::bind(&Sm::remove_vertex, boost::ref(f.m), _1)); + for(auto v : f.m.vertices()) f.m.remove_vertex(v); assert(f.m.number_of_vertices() == 0); assert(f.m.number_of_removed_vertices()== old_size + old_removed_size); diff --git a/Surface_mesh/test/Surface_mesh/test.3mf b/Surface_mesh/test/Surface_mesh/test.3mf new file mode 100644 index 00000000000..8e8d5e004f2 Binary files /dev/null and b/Surface_mesh/test/Surface_mesh/test.3mf differ diff --git a/Surface_mesh/test/Surface_mesh/test_deprecated_io_sm.cpp b/Surface_mesh/test/Surface_mesh/test_deprecated_io_sm.cpp new file mode 100644 index 00000000000..8607ccba9d7 --- /dev/null +++ b/Surface_mesh/test/Surface_mesh/test_deprecated_io_sm.cpp @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +int main() +{ + // OFF + 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(sm_out, "tmp.off"); + assert(ok); + ok = CGAL::read_off(sm_in, "tmp.off"); + assert(ok); + assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1); + sm_in.clear(); + + std::ofstream os("tmp.off"); + ok = CGAL::write_off(os, sm_out); + assert(ok); + os.close(); + std::ifstream is("tmp.off"); + ok = CGAL::read_off(is, sm_in); + assert(ok); + assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1); + is.close(); + sm_in.clear(); + + //PLY + os.open("tmp.ply"); + std::string comments; + ok = CGAL::write_ply(os, sm_out, comments); + assert(ok); + os.close(); + is.open("tmp.ply"); + ok = CGAL::read_ply(is, sm_in, comments); + assert(ok); + assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1); + is.close(); + sm_in.clear(); + +#ifdef CGAL_LINKED_WITH_3MF + // 3mf + std::vector output_3mf; + ok = CGAL::read_3mf("test.3mf", output_3mf); + assert(ok); + assert(output_3mf.size() == 2); + sm_in.clear(); +#endif + + //others + ok = CGAL::write_mesh(sm_out, "tmp.off"); + assert(ok); + ok = CGAL::read_mesh(sm_in, "tmp.ply"); + assert(ok); + assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1); + sm_in.clear(); + return EXIT_SUCCESS; +} diff --git a/Surface_mesh_approximation/examples/Surface_mesh_approximation/CMakeLists.txt b/Surface_mesh_approximation/examples/Surface_mesh_approximation/CMakeLists.txt index 88e88dc6690..b9db87e2998 100644 --- a/Surface_mesh_approximation/examples/Surface_mesh_approximation/CMakeLists.txt +++ b/Surface_mesh_approximation/examples/Surface_mesh_approximation/CMakeLists.txt @@ -20,8 +20,8 @@ endif() # Use Eigen (for PCA) find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library, and will not be compiled.") return() @@ -33,20 +33,20 @@ endif() include(CGAL_CreateSingleSourceCGALProgram) create_single_source_cgal_program("vsa_approximation_2_example.cpp") -target_link_libraries(vsa_approximation_2_example PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_approximation_2_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_approximation_example.cpp") -target_link_libraries(vsa_approximation_example PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_approximation_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_class_interface_example.cpp") -target_link_libraries(vsa_class_interface_example PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_class_interface_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_isotropic_metric_example.cpp") -target_link_libraries(vsa_isotropic_metric_example PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_isotropic_metric_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_segmentation_example.cpp") -target_link_libraries(vsa_segmentation_example PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_segmentation_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_simple_approximation_example.cpp") target_link_libraries(vsa_simple_approximation_example - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) diff --git a/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_isotropic_metric_example.cpp b/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_isotropic_metric_example.cpp index bad0c2dc1ef..116f53dfbd9 100644 --- a/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_isotropic_metric_example.cpp +++ b/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_isotropic_metric_example.cpp @@ -50,8 +50,7 @@ struct Compact_metric_point_proxy // fitting center Vector_3 center = CGAL::NULL_VECTOR; FT sum_areas = FT(0.0); - for(const face_descriptor f : faces) - { + for(const face_descriptor& f : faces) { center = center + (center_pmap[f] - CGAL::ORIGIN) * area_pmap[f]; sum_areas += area_pmap[f]; } 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 75f324d7469..4a38a9783da 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 @@ -127,7 +127,7 @@ public: // fitting normal Vector_3 norm = CGAL::NULL_VECTOR; - for(const face_descriptor f : faces) { + for(const face_descriptor& f : faces) { norm = m_sum_functor(norm, m_scale_functor(get(m_fnmap, f), get(m_famap, f))); } 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 9ced8858388..eee12468f63 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 @@ -125,7 +125,7 @@ public: CGAL_assertion(!faces.empty()); std::list tris; - for(const face_descriptor f : faces) { + for(const face_descriptor& f : faces) { const halfedge_descriptor he = halfedge(f, *m_tm); const Point_3 &p0 = m_vpmap[source(he, *m_tm)]; const Point_3 &p1 = m_vpmap[target(he, *m_tm)]; diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index 6380cc437d8..ef642b3e074 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -1552,7 +1552,7 @@ private: std::cerr << "#chord_anchor " << m_bcycles.back().num_anchors << std::endl; #endif - for(const halfedge_descriptor he : chord) + for(const halfedge_descriptor& he : chord) he_candidates.erase(he); } while (he_start != he_mark); } @@ -1600,7 +1600,7 @@ private: FT dist_max(0.0); chord_vec = scale_functor(chord_vec, FT(1.0) / CGAL::approximate_sqrt(chord_vec.squared_length())); - for(const halfedge_descriptor he : chord) { + for(const halfedge_descriptor& he : chord) { Vector_3 vec = vector_functor(pt_begin, m_vpoint_map[target(he, *m_ptm)]); vec = cross_product_functor(chord_vec, vec); const FT dist = CGAL::approximate_sqrt(vec.squared_length()); @@ -1612,7 +1612,7 @@ private: } else { FT dist_max(0.0); - for(const halfedge_descriptor he : chord) { + for(const halfedge_descriptor& he : chord) { const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance( pt_begin, m_vpoint_map[target(he, *m_ptm)])); if (dist > dist_max) { diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt b/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt index b9ef38f9f9e..2c2b89ec44f 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt @@ -20,8 +20,8 @@ endif() # Use Eigen (for PCA) find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library, and will not be compiled.") return() @@ -33,28 +33,28 @@ endif() include(CGAL_CreateSingleSourceCGALProgram) create_single_source_cgal_program("vsa_class_interface_test.cpp") -target_link_libraries(vsa_class_interface_test PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_class_interface_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_correctness_test.cpp") -target_link_libraries(vsa_correctness_test PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_correctness_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_error_decrease_test.cpp") -target_link_libraries(vsa_error_decrease_test PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_error_decrease_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_kernel_test.cpp") -target_link_libraries(vsa_kernel_test PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_kernel_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_approximation_test.cpp") -target_link_libraries(vsa_approximation_test PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_approximation_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_segmentation_test.cpp") -target_link_libraries(vsa_segmentation_test PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_segmentation_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_meshing_manifold_test.cpp") -target_link_libraries(vsa_meshing_manifold_test PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_meshing_manifold_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_metric_test.cpp") -target_link_libraries(vsa_metric_test PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_metric_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("vsa_teleportation_test.cpp") -target_link_libraries(vsa_teleportation_test PUBLIC CGAL::Eigen_support) +target_link_libraries(vsa_teleportation_test PUBLIC CGAL::Eigen3_support) diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_metric_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_metric_test.cpp index 4b8fe1e65d4..186048d8631 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_metric_test.cpp +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_metric_test.cpp @@ -46,7 +46,7 @@ struct Compact_metric_point_proxy { // fitting center Vector_3 center = CGAL::NULL_VECTOR; FT sum_areas = FT(0.0); - for(const face_descriptor f : faces) { + for(const face_descriptor& f : faces) { center = center + (center_pmap[f] - CGAL::ORIGIN) * area_pmap[f]; sum_areas += area_pmap[f]; } 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 4e7411f1921..f1d10a9a57c 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 @@ -104,7 +104,7 @@ int main() CGAL::Bbox_3 bbox; - for(const vertex_descriptor v : vertices(mesh)) + for(const vertex_descriptor& v : vertices(mesh)) bbox += vpmap[v].bbox(); const FT ymin = bbox.ymin(), ymax = bbox.ymax(), yrange = ymax - ymin; std::cout << "Range along y axis: [" << ymin << ", " << ymax << "]" << std::endl; @@ -113,7 +113,7 @@ int main() std::size_t planar_pxidx = static_cast(-1); std::size_t num_planar_faces = 0; bool first = true; - for(const face_descriptor f : faces(mesh)) { + for(const face_descriptor& f : faces(mesh)) { const halfedge_descriptor he = halfedge(f, mesh); const Point_3 &p0 = vpmap[source(he, mesh)]; const Point_3 &p1 = vpmap[target(he, mesh)]; diff --git a/Surface_mesh_deformation/benchmark/Surface_mesh_deformation/optimal_rotation/CMakeLists.txt b/Surface_mesh_deformation/benchmark/Surface_mesh_deformation/optimal_rotation/CMakeLists.txt index d23e2937686..4a4e8a179eb 100644 --- a/Surface_mesh_deformation/benchmark/Surface_mesh_deformation/optimal_rotation/CMakeLists.txt +++ b/Surface_mesh_deformation/benchmark/Surface_mesh_deformation/optimal_rotation/CMakeLists.txt @@ -6,10 +6,10 @@ find_package(CGAL REQUIRED COMPONENTS Core) include(${CGAL_USE_FILE}) find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("benchmark_for_concept_models.cpp") - target_link_libraries(benchmark_for_concept_models PUBLIC CGAL::Eigen_support) + target_link_libraries(benchmark_for_concept_models PUBLIC CGAL::Eigen3_support) else() message( STATUS diff --git a/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt index 2d0823d9166..a0e96402040 100644 --- a/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt @@ -14,11 +14,11 @@ set_property(DIRECTORY PROPERTY CGAL_NO_TESTING TRUE) find_package(CGAL REQUIRED) find_package(Eigen3 3.1.91) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("deform_mesh_for_botsch08_format.cpp") target_link_libraries(deform_mesh_for_botsch08_format - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) else() message( STATUS diff --git a/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt index c02d2766bfc..011ab4ef342 100644 --- a/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt @@ -7,8 +7,8 @@ project(Surface_mesh_deformation_Examples) find_package(CGAL REQUIRED) find_package(Eigen3 3.1.91) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("all_roi_assign_example.cpp") create_single_source_cgal_program( "all_roi_assign_example_custom_polyhedron.cpp") @@ -32,7 +32,7 @@ if(TARGET CGAL::Eigen_support) k_ring_roi_translate_rotate_example k_ring_roi_translate_rotate_Surface_mesh deform_mesh_for_botsch08_format_sre_arap) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() find_package(OpenMesh QUIET) @@ -41,7 +41,7 @@ if(TARGET CGAL::Eigen_support) create_single_source_cgal_program( "all_roi_assign_example_with_OpenMesh.cpp") target_link_libraries(all_roi_assign_example_with_OpenMesh - PRIVATE ${OPENMESH_LIBRARIES} CGAL::Eigen_support) + PRIVATE ${OPENMESH_LIBRARIES} CGAL::Eigen3_support) else() message(STATUS "Example that use OpenMesh will not be compiled.") endif() diff --git a/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt index 236714e6444..cea07cbf2a8 100644 --- a/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt @@ -7,21 +7,21 @@ project(Surface_mesh_deformation_Tests) find_package(CGAL REQUIRED) find_package(Eigen3 3.1.91) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("Cactus_deformation_session.cpp") - target_link_libraries(Cactus_deformation_session PUBLIC CGAL::Eigen_support) + target_link_libraries(Cactus_deformation_session PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("Cactus_performance_test.cpp") - target_link_libraries(Cactus_performance_test PUBLIC CGAL::Eigen_support) + target_link_libraries(Cactus_performance_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("Symmetry_test.cpp") - target_link_libraries(Symmetry_test PUBLIC CGAL::Eigen_support) + target_link_libraries(Symmetry_test PUBLIC CGAL::Eigen3_support) find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(UseOpenMesh) create_single_source_cgal_program("Cactus_deformation_session_OpenMesh.cpp") target_link_libraries(Cactus_deformation_session_OpenMesh - PRIVATE ${OPENMESH_LIBRARIES} CGAL::Eigen_support) + PRIVATE ${OPENMESH_LIBRARIES} CGAL::Eigen3_support) else() message(STATUS "Example that use OpenMesh will not be compiled.") endif() diff --git a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt index 29fc96eb538..f0e3458aabc 100644 --- a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt +++ b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt @@ -7,8 +7,8 @@ project(Surface_mesh_parameterization_Examples) find_package(CGAL REQUIRED) find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) # Executables that require Eigen 3.1 # ------------------------------------------------------------------ @@ -54,19 +54,19 @@ if(TARGET CGAL::Eigen_support) # ------------------------------------------------------------------ create_single_source_cgal_program("discrete_authalic.cpp") - target_link_libraries(discrete_authalic PUBLIC CGAL::Eigen_support) + target_link_libraries(discrete_authalic PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("lscm.cpp") - target_link_libraries(lscm PUBLIC CGAL::Eigen_support) + target_link_libraries(lscm PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("orbifold.cpp") - target_link_libraries(orbifold PUBLIC CGAL::Eigen_support) + target_link_libraries(orbifold PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("seam_Polyhedron_3.cpp") - target_link_libraries(seam_Polyhedron_3 PUBLIC CGAL::Eigen_support) + target_link_libraries(seam_Polyhedron_3 PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("simple_parameterization.cpp") - target_link_libraries(simple_parameterization PUBLIC CGAL::Eigen_support) + target_link_libraries(simple_parameterization PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("square_border_parameterizer.cpp") - target_link_libraries(square_border_parameterizer PUBLIC CGAL::Eigen_support) + target_link_libraries(square_border_parameterizer PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program( "iterative_authalic_parameterizer.cpp" ) - target_link_libraries(iterative_authalic_parameterizer PUBLIC CGAL::Eigen_support) + target_link_libraries(iterative_authalic_parameterizer PUBLIC CGAL::Eigen3_support) if(SuiteSparse_FOUND) target_link_libraries(orbifold PRIVATE ${SuiteSparse_LIBRARIES}) endif() 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 45a297e4bf3..3fb7edade43 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 @@ -81,7 +81,7 @@ #include // used to solve conic equations #endif -#include +#include #include #include #include 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 1a4590353a3..c3b9d8de956 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 @@ -33,7 +33,7 @@ #include #endif -#include +#include #include #include diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/IO/File_off.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/IO/File_off.h index de84771bc04..84fca87b11f 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/IO/File_off.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/IO/File_off.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Iterative_authalic_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Iterative_authalic_parameterizer_3.h index 66369441365..38093049023 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Iterative_authalic_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Iterative_authalic_parameterizer_3.h @@ -41,7 +41,7 @@ #include #endif -#include +#include #include #include 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 4ad502312aa..109bfd46196 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 @@ -31,7 +31,7 @@ #endif #include -#include +#include #include #include 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 7a25244f443..876babb7bc1 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 @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/internal/validity.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/internal/validity.h index 21373631533..6c40995198d 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/internal/validity.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/internal/validity.h @@ -25,7 +25,7 @@ #include #include -#include +#include #include diff --git a/Surface_mesh_parameterization/test/Surface_mesh_parameterization/CMakeLists.txt b/Surface_mesh_parameterization/test/Surface_mesh_parameterization/CMakeLists.txt index 98de8be4f5b..4643d889342 100644 --- a/Surface_mesh_parameterization/test/Surface_mesh_parameterization/CMakeLists.txt +++ b/Surface_mesh_parameterization/test/Surface_mesh_parameterization/CMakeLists.txt @@ -7,11 +7,11 @@ project(Surface_mesh_parameterization_Tests) find_package(CGAL REQUIRED) find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("extensive_parameterization_test.cpp") target_link_libraries(extensive_parameterization_test - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) else() message( STATUS diff --git a/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/CMakeLists.txt b/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/CMakeLists.txt index fb93da6bdfe..235ec1b7ef9 100644 --- a/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/CMakeLists.txt +++ b/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/CMakeLists.txt @@ -20,19 +20,13 @@ create_single_source_cgal_program("Surface_mesh_shortest_path_traits_test.cpp") # Link with Boost.ProgramOptions (optional) find_package(Boost QUIET COMPONENTS program_options) if(Boost_PROGRAM_OPTIONS_FOUND) - if(TARGET Boost::program_options) - set(Boost_PROGRAM_OPTIONS_LIBRARY Boost::program_options) - endif() - if(CGAL_AUTO_LINK_ENABLED) - message(STATUS "Boost.ProgramOptions library: found") - else() - message( - STATUS "Boost.ProgramOptions library: ${Boost_PROGRAM_OPTIONS_LIBRARY}") - endif() - add_definitions("-DCGAL_USE_BOOST_PROGRAM_OPTIONS") - list(APPEND CGAL_3RD_PARTY_LIBRARIES ${Boost_PROGRAM_OPTIONS_LIBRARY}) if(CGAL_Core_FOUND OR LEDA_FOUND) create_single_source_cgal_program("TestMesh.cpp") + if(TARGET Boost::filesystem) + target_link_libraries(TestMesh PRIVATE Boost::program_options) + else() + target_link_libraries(TestMesh PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) + endif() else() message( STATUS diff --git a/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/TestMesh.cpp b/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/TestMesh.cpp index 95613fdbb30..389cc215f11 100644 --- a/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/TestMesh.cpp +++ b/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/TestMesh.cpp @@ -1,8 +1,5 @@ #include #include - -#if defined(CGAL_USE_BOOST_PROGRAM_OPTIONS) && ! defined(DONT_USE_BOOST_PROGRAM_OPTIONS) - #include #include #include @@ -350,12 +347,3 @@ int main(int argc, char** argv) return 0; } - - -#else - int main() - { - std::cout << "TestMesh.cpp needs Boost Program Options" << std::endl; - return 0; - } -#endif diff --git a/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt b/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt index a696c6fe11f..4d0818c7aea 100644 --- a/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt +++ b/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt @@ -43,11 +43,11 @@ create_single_source_cgal_program("edge_collapse_bounded_normal_change.cpp") create_single_source_cgal_program("edge_collapse_visitor_surface_mesh.cpp") find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("edge_collapse_garland_heckbert.cpp") target_link_libraries(edge_collapse_garland_heckbert - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) else() message( STATUS 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 7b0ddb69c4f..fd02ec777fa 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 @@ -491,7 +491,7 @@ add_shape_optimization_constraints(const vertex_descriptor_vector& link) 0.0, 0.0, s); Vector c = NULL_VECTOR; - for(const vertex_descriptor v : link) + for(const vertex_descriptor& v : link) c = c + (ORIGIN - get_point(v)); CGAL_SMS_LT_TRACE(1," Adding shape optimization constraint. Shape vector: " << xyz_to_string(c)); @@ -540,7 +540,7 @@ compute_shape_cost(const Point& p, const vertex_descriptor_vector& link) { FT rCost(0); - for(const vertex_descriptor v : link) + for(const vertex_descriptor& v : link) rCost += squared_distance(p, get_point(v)); return rCost; diff --git a/Surface_mesh_skeletonization/benchmark/Surface_mesh_skeletonization/CMakeLists.txt b/Surface_mesh_skeletonization/benchmark/Surface_mesh_skeletonization/CMakeLists.txt index e2f9ca828d5..8ed19957527 100644 --- a/Surface_mesh_skeletonization/benchmark/Surface_mesh_skeletonization/CMakeLists.txt +++ b/Surface_mesh_skeletonization/benchmark/Surface_mesh_skeletonization/CMakeLists.txt @@ -27,9 +27,9 @@ endif() # include for local package find_package(Eigen3 3.2.0) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) -if(NOT TARGET CGAL::Eigen_support) +if(NOT TARGET CGAL::Eigen3_support) message(STATUS "NOTICE: Eigen 3.2 (or greater) is not found.") endif() @@ -37,6 +37,6 @@ endif() # ########################################################## create_single_source_cgal_program("solver_benchmark.cpp") -target_link_libraries(solver_benchmark PUBLIC CGAL::Eigen_support) +target_link_libraries(solver_benchmark PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mcf_scale_invariance.cpp") -target_link_libraries(mcf_scale_invariance PUBLIC CGAL::Eigen_support) +target_link_libraries(mcf_scale_invariance PUBLIC CGAL::Eigen3_support) diff --git a/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt b/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt index 5e93efaf7b4..c452a1aed19 100644 --- a/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt +++ b/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt @@ -7,9 +7,9 @@ project(Surface_mesh_skeletonization_Examples) find_package(CGAL REQUIRED) find_package(Eigen3 3.2.0) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) -if(TARGET CGAL::Eigen_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("simple_mcfskel_example.cpp") create_single_source_cgal_program("simple_mcfskel_sm_example.cpp") create_single_source_cgal_program("simple_mcfskel_LCC_example.cpp") @@ -26,7 +26,7 @@ if(TARGET CGAL::Eigen_support) MCF_Skeleton_sm_example MCF_Skeleton_LCC_example segmentation_example) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() else() message( diff --git a/Surface_mesh_skeletonization/test/Surface_mesh_skeletonization/CMakeLists.txt b/Surface_mesh_skeletonization/test/Surface_mesh_skeletonization/CMakeLists.txt index b6abbe92f38..31d757c9183 100644 --- a/Surface_mesh_skeletonization/test/Surface_mesh_skeletonization/CMakeLists.txt +++ b/Surface_mesh_skeletonization/test/Surface_mesh_skeletonization/CMakeLists.txt @@ -7,13 +7,13 @@ project(Surface_mesh_skeletonization_Tests) find_package(CGAL REQUIRED) find_package(Eigen3 3.2.0) #(requires 3.2.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) -if(TARGET CGAL::Eigen_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("MCF_Skeleton_test.cpp") - target_link_libraries(MCF_Skeleton_test PUBLIC CGAL::Eigen_support) + target_link_libraries(MCF_Skeleton_test PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("skeleton_connectivity_test.cpp") - target_link_libraries(skeleton_connectivity_test PUBLIC CGAL::Eigen_support) + target_link_libraries(skeleton_connectivity_test PUBLIC CGAL::Eigen3_support) else() message( STATUS 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 b37e714ee5e..e5d6efc1b0d 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 @@ -39,6 +39,11 @@ namespace Surface_mesh_topology { */ bool is_contractible(const Path_on_surface& p) const; + /*! returns `true` if the closed path `p` is homotopic to some simple cycle. + * @pre `p` must be a closed path on `amesh`. + */ + bool is_homotopic_to_simple_cycle(const Path_on_surface& p) const; + /*! returns a non-contractible cycle of type `Path_on_surface` with minimal number of edges. This number of edges is the edge width of the mesh. */ Path_on_surface compute_edge_width() const; @@ -56,6 +61,11 @@ namespace Surface_mesh_topology { /*! returns a vector of darts representing a non-contractible curve with a minimal number of intersection with the graph of the mesh. This curve can be described by the alternating sequence of faces and vertices it goes through, so that each dart in the returned vector belongs to both a face and the next vertex in the alternating sequence. (Here, faces and vertices are viewed as subsets of darts.) The size of the returned vector is the face width of the mesh. */ std::vector compute_face_width() const; + + /*! set whether the function should output error message to `std::cerr` when the prerequisite of the argument(s) is not met. + * Affects \link Surface_mesh_topology::Curves_on_surface_topology::are_freely_homotopic `are_freely_homotopic(p1, p2)`\endlink, \link Surface_mesh_topology::Curves_on_surface_topology::are_homotopic_with_fixed_endpoints `are_homotopic_with_fixed_endpoints(p1, p2)`\endlink, \link Surface_mesh_topology::Curves_on_surface_topology::is_contractible `is_contractible(p)`\endlink, and \link Surface_mesh_topology::Curves_on_surface_topology::is_homotopic_to_simple_cycle `is_homotopic_to_simple_cycle(p)`\endlink + */ + void set_verbose(bool is_verbose); }; /*! 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 b85cc68b45c..8337baa4022 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 @@ -46,7 +46,14 @@ The second query asks if the curves are freely homotopic while the thir The algorithms used are based on a paper by Erickson and Whittlesey \cgalCite{ew-tcsr-13}, providing a linear time algorithm for the above homotopy tests. This is a simplified version of the linear time algorithm by Lazarus and Rivaud \cgalCite{lr-hts-12}. +\subsection SMTopology_simplicity Simplicity Test +Given a cycle drawn on a surface one can ask if the cycle can be continously deformed to a cycle that does not intersect with itself. Any contractible cycle deforms to a simple cycle but this is not true for more complicated cycles. The algorithm in this section is purely topological and do not assume any geometry on the input surface. + +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. \section SMTopology_HowToUse API Description @@ -120,6 +127,18 @@ the input surface. This is otherwise independent of the size of input surface, Each time a `Surface_mesh_topology::Path_on_surface` is provided for a homotopy test, it is first transformed to an equivalent path in the quadrangulation stored by the `Surface_mesh_topology::Curves_on_surface_topology`. This transformation is transparent to the user who has never access to the quadrangulation. +\subsection SMTopology_Query_Simplicity Testing Simplicity + +Given a `Surface_mesh_topology::Path_on_surface` \f$p\f$, the class `Surface_mesh_topology::Curves_on_surface_topology` provides the following function: + +- \link Surface_mesh_topology::Curves_on_surface_topology::is_homotopic_to_simple_cycle `is_homotopic_to_simple_cycle(p)` \endlink returns `true` if the closed curve \f$p\f$ is homotopic to some simple cycle. + +Like homotopy tests, the first step is to simplify the input combinatorial surface. The algorithm will share the surface with homotopy tests and invoke the simplification if the preprocessing has not been done yet. +\note The user must not modify the input surface as long as simplicity tests are performed with this `Surface_mesh_topology::Curves_on_surface_topology`. + +Each time a `Surface_mesh_topology::Path_on_surface` is provided for a simplicity test, it is first transformed to an equivalent path in the quadrangulation stored by the `Surface_mesh_topology::Curves_on_surface_topology`. This transformation is transparent to the user who has never access to the quadrangulation. + + \section SMTopology_Examples Examples \subsection SMTopology_Example_I_II_III Compute Shortest Non-contractible Cycle @@ -146,6 +165,10 @@ The following example computes the face width, and visualizes it if CGAL_Qt5 is 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. \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. +\cgalExample{Surface_mesh_topology/path_simplicity_double_torus_2.cpp} + \subsection SMTopology_Example_VI_VII Polygonal Schema Here, we show with two examples how to create a surface from a list of faces specified by edge label sequences. In this first example, we build a genus two torus surface from a single face, also called a polygonal schema. See left \cgalFigureRef{fig_sm_incremental-builder} for an illustration. Two closed paths are then created. The paths are freely homotopic but not homotopic with fixed endpoint. @@ -262,9 +285,51 @@ The canonical form of a curve is obtained by flattening its brackets, removing i \subsection SMTopology_Homotopy_Test Homotopy Test It can be proven that the canonical form is uniquely defined and only depends on the homotopy class of the curve. Hence, the curves \f$C'\f$ and \f$D'\f$ in \f$\cal{Q}\f$ are homotopic if and only if their canonical forms are equal. Since each curve is defined as a sequence of (oriented) edges up to a cyclic permutation, we resort to the Knuth-Morris-Pratt algorithm to decide in linear time if the canonical forms are the same up to a cyclic permutation. +\subsection SMTopology_Simplicity_Test Simplicity Test +The simplicity test relies on the fact that a closed curve is homotopic to a simple one if and only if its canonical form can be made intersection free via infinitesimal perturbations together with some homotopy preserving operations. One can imagine each edge in the quadrangulation has a width and each vertex in the quadrangulation has an area so that paths visiting the same vertex/edge multiple times can avoid intersection after perturbation within a vertex or an edge. See \cgalFigureRef{fig_perturbation_sample} for an example. +\cgalFigureBegin{fig_perturbation_sample,perturbation_sample.svg} + Applying a perturbation to remove 2 intersections between the red and the blue subpaths. + \cgalFigureEnd + +Such a perturbation can be encoded as a transverse ordering of the edges from the canonical form which traverse the same edge in the quadrangulation. The idea of the algorithm is to traverse the canonical form, one edge at a time, to inductively build such orderings and try to avoid intersection as best as we can. + +\subsubsection SMTopology_Simplicity_Test_Primitive Detect Repetition +There is an easy case where we know for sure that a closed curve cannot be deformed to simple one: If the canonical form can be expressed as concatenation of two or more copies of the same path. So the first step of the algorithm is to detect repetition. + +Let \f$P\f$ be a path and let \f$+\f$ be the operator of concatenation. It can be shown that \f$P\f$ contains no repetition if and only if there are only 2 matchings of \f$P\f$ in \f$P+P\f$ (matching the first and the second copy). The algorithm resorts to the Knuth-Morris-Pratt algorithm to decide in linear time if the canonical form contains repetitions. + +\subsubsection SMTopology_Simplicity_Test_Switch Avoid Crossing by Switching +Apart from applying perturbation, the algorithm also tries to avoid crossings using a homotopy-preserving operation called as a switch. A switch is triggered whenever an intersection could be avoided by turning a left L-shaped subpath into a right L-shaped subpath. See \cgalFigureRef{fig_switch_sample} for an example. +\cgalFigureBegin{fig_switch_sample,switch_sample.svg} + Top-left, an intersection between the red subpath and the green subpath at the start of the left L-shaped red subpath. Top-right, switch the left L-shape to right L-shape to avoid the intersection. Bottom-left or right, no switch is performed because no intersection can be avoided. + \cgalFigureEnd + +\subsubsection SMTopology_Simplicity_Test_Relative_Order Decide Relative Order +As the algorithm inductively builds orderings, it has to determine a relative order between the edge being processed and the edges that have been ordered. There are three cases to consider. + +-# The current edge and its predecessor, say \f$e\f$, form a subpath of length two so that a parallel copy of this subpath has already been processed, and \f$e\f$ is adjacent to its parallel copy in the previously constructed ordering. In this case, the current edge must be adjacent to its copy in the transverse ordering. See \cgalFigureRef{fig_relative_order_corner}. +\cgalFigureBegin{fig_relative_order_corner,relative_order_corner.svg} + The red edge is being processed. The blue edge is adjacent to the green edge (the predecessor \f$e\f$ of the red edge) in the previously constructed ordering and forms the same turn (blue-pink turn) as the green-red turn. The red edge should be right next to the pink edge in the ordering so as to avoid crossings. + \cgalFigureEnd + +-# When the previous situation does not occur, the current edge has to be compared against every parallel copy already processed. In this case, the predecessors of the copy and of the current edge form a Y shape with the current edge. The circular order of the edges in this Y can be used to determine the relative order between the current edge and its copy. See \cgalFigureRef{fig_relative_order_normal}. +\cgalFigureBegin{fig_relative_order_normal,relative_order_normal.svg} + The red edge is being processed and is compared against the pink edge. Since the green edge (the predecessor of the red edge) is to the right of the blue edge around the vertex, the red edge must be to the right of the pink edge in the transverse ordering. + \cgalFigureEnd + +-# There is one special case where the comparison of the current edge with a parallel copy cannot be deduced form previous computations: When this copy happens to be the very first edge processed in the traversal. Indeed, the predecessor of the first edge (aka the last edge of the path) has not been processed yet. If the last edge runs parallel to the predecessor of the current edge, we cannot determine their relative order. So the idea is to keep following the predecessors of the current edge and of the first edge until they diverge, at which point the relative order around the vertex can be used to determine the relative order. See \cgalFigureRef{fig_relative_order_first}. This can be precomputed by finding all the longest common suffixes of the path against its circular shifts. A modified Knuth-Morris-Pratt algorithm is applied to preprocess the path in linear time. +\cgalFigureBegin{fig_relative_order_first,relative_order_first.svg} + 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. + +\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. + \section Implementation History -The code was developed in 2018 by Guillaume Damiand and Francis Lazarus. Felix Castillon contributed to the extension of the homotopy test to the case of surfaces with boundaries. Thien Hoang added methods to compute shortest non-contractible cycles, edge width and face width as part of the program Google Summer of Code 2019. +The code was developed in 2018 by Guillaume Damiand and Francis Lazarus. Felix Castillon contributed to the extension of the homotopy test to the case of surfaces with boundaries. Thien Hoang added methods to compute shortest non-contractible cycles, edge width and face width as part of the program Google Summer of Code 2019. Shuhao Tan added methods to test simplicity of a closed curve as part of the program Google Summer of Code 2020. */ } /* namespace CGAL */ diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/examples.txt b/Surface_mesh_topology/doc/Surface_mesh_topology/examples.txt index 0d740fdbd48..1c5bdf3ff9e 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/examples.txt +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/examples.txt @@ -5,5 +5,7 @@ \example Surface_mesh_topology/path_homotopy_double_torus.cpp \example Surface_mesh_topology/path_homotopy_with_symbols.cpp \example Surface_mesh_topology/path_homotopy_with_symbols_2.cpp +\example Surface_mesh_topology/path_simplicity_double_torus.cpp +\example Surface_mesh_topology/path_simplicity_double_torus_2.cpp \example Surface_mesh_topology/open_path_homotopy.cpp */ diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/perturbation_sample.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/perturbation_sample.svg new file mode 100644 index 00000000000..fa5b1dd3500 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/perturbation_sample.svg @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + u + v + e + e + v + u + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/relative_order_corner.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/relative_order_corner.svg new file mode 100644 index 00000000000..a5751b57668 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/relative_order_corner.svg @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/relative_order_first.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/relative_order_first.svg new file mode 100644 index 00000000000..c1b1aa15d57 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/relative_order_first.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/relative_order_normal.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/relative_order_normal.svg new file mode 100644 index 00000000000..96d3c467480 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/relative_order_normal.svg @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/switch_sample.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/switch_sample.svg new file mode 100644 index 00000000000..0cccf3f118f --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/switch_sample.svg @@ -0,0 +1,819 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt index 68cd4f5a819..2572662c735 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt @@ -21,20 +21,23 @@ endif() # add_definitions("-D_GLIBCXX_DEBUG") set(SOURCE_FILES - edgewidth_lcc.cpp - edgewidth_surface_mesh.cpp - facewidth.cpp - map_2_constructor.cpp - open_path_homotopy.cpp - path_homotopy.cpp - path_homotopy_double_torus.cpp - path_homotopy_torus.cpp - path_homotopy_with_sm_and_polyhedron.cpp - path_homotopy_with_symbols_2.cpp - path_homotopy_with_symbols.cpp - shortest_noncontractible_cycle_2.cpp - shortest_noncontractible_cycle.cpp - unsew_edgewidth_repeatedly.cpp) + edgewidth_lcc.cpp + edgewidth_surface_mesh.cpp + facewidth.cpp + map_2_constructor.cpp + open_path_homotopy.cpp + path_homotopy.cpp + path_homotopy_double_torus.cpp + path_homotopy_torus.cpp + path_homotopy_with_sm_and_polyhedron.cpp + path_homotopy_with_symbols_2.cpp + path_homotopy_with_symbols.cpp + path_simplicity_double_torus.cpp + path_simplicity_double_torus_2.cpp + shortest_noncontractible_cycle_2.cpp + shortest_noncontractible_cycle.cpp + unsew_edgewidth_repeatedly.cpp + ) foreach(cppfile ${SOURCE_FILES}) create_single_source_cgal_program("${cppfile}") @@ -48,8 +51,9 @@ if(CGAL_Qt5_FOUND) target_link_libraries(path_homotopy PUBLIC CGAL::CGAL_Qt5) target_link_libraries(path_homotopy_double_torus PUBLIC CGAL::CGAL_Qt5) target_link_libraries(path_homotopy_torus PUBLIC CGAL::CGAL_Qt5) - target_link_libraries(path_homotopy_with_sm_and_polyhedron - PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(path_homotopy_with_sm_and_polyhedron PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(path_simplicity_double_torus PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(path_simplicity_double_torus_2 PUBLIC CGAL::CGAL_Qt5) target_link_libraries(shortest_noncontractible_cycle_2 PUBLIC CGAL::CGAL_Qt5) target_link_libraries(shortest_noncontractible_cycle PUBLIC CGAL::CGAL_Qt5) target_link_libraries(unsew_edgewidth_repeatedly PUBLIC CGAL::CGAL_Qt5) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/path_simplicity_double_torus.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/path_simplicity_double_torus.cpp new file mode 100644 index 00000000000..762c9f986d9 --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/path_simplicity_double_torus.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap; +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_index(438); // Its starting dart + for (int i=0; i<5; ++i) + { p.extend_positive_turn(2); } // Extend the path + p.extend_positive_turn(1); + for (int i=0; i<7; ++i) + { p.extend_positive_turn(2); } +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_index({14, 15, 391, 392, 395, 227, 223, 313, 318, 326, 82, + 87, 431, 160, 435, 753, 754, 756, 757, 674, 678, 850, + 483, 480, 475, 470, 893, 618, 622, 548, 551, 795, + 797, 806, 637, 634, 638, 872, 521, 376, 180, 424, + 88, 95, 440, 152, 149, 21}); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_3(Path_on_surface& p) +{ + p.push_back_by_index(473); // Its starting dart + p.extend_positive_turn(1); // Extend the path + p.extend_positive_turn(3); + for (int i=0; i<7; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + p.extend_positive_turn(1); + for (int i=0; i<3; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + p.extend_positive_turn(1); + for (int i=0; i<2; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); + for (int i=0; i<3; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + p.extend_positive_turn(2); + p.extend_positive_turn(1); + for (int i=0; i<2; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + for (int i=0; i<3; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); + p.extend_positive_turn(1); + for (int i=0; i<2; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); + for (int i=0; i<2; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + for (int i=0; i<3; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + for (int i=0; i<3; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); + p.extend_positive_turn(3); + for (int i=0; i<2; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + p.extend_positive_turn(2); +} + +/////////////////////////////////////////////////////////////////////////////// +int main(int argc, char** argv) +{ + bool draw=(argc>1?std::string(argv[1])=="-draw":false); + LCC_3_cmap lcc; + if (!CGAL::load_off(lcc, "data/double-torus.off")) + { + std::cout<<"ERROR reading file data/double-torus.off"< cst(lcc); + Path_on_surface p1(lcc), p2(lcc), p3(lcc); + create_path_1(p1); + create_path_2(p2); + create_path_3(p3); + + + bool res1=cst.is_homotopic_to_simple_cycle(p1); + std::cout<<"Path p1 (pink) "<<(res1?"IS":"IS NOT") + <<" simple."< +#include +#include +#include +#include + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap; +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void create_path(Path_on_surface& p) +{ + p.push_back_by_index(682); // Its starting dart + for (int i=0; i<11; ++i) + { p.extend_positive_turn(2); } // Extend the path + p.extend_positive_turn(3); + for (int i=0; i<5; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); + p.extend_positive_turn(2); + p.extend_positive_turn(3); + for (int i=0; i<2; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + for (int i=0; i<5; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); + for (int i=0; i<2; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); + for (int i=0; i<2; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + p.extend_positive_turn(2); + p.extend_positive_turn(1); + for (int i=0; i<8; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); + for (int i=0; i<4; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + for (int i=0; i<5; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(3); + for (int i=0; i<5; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); + for (int i=0; i<3; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); + p.extend_positive_turn(1); + for (int i=0; i<11; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); +} + +/////////////////////////////////////////////////////////////////////////////// +int main(int argc, char** argv) +{ + bool draw=(argc>1?std::string(argv[1])=="-draw":false); + LCC_3_cmap lcc; + if (!CGAL::load_off(lcc, "data/double-torus.off")) + { + std::cout<<"ERROR reading file data/double-torus.off"< cst(lcc); + Path_on_surface p(lcc); + create_path(p); + + bool res=cst.is_homotopic_to_simple_cycle(p); + std::cout<<"Path p (pink) "<<(res?"IS":"IS NOT") + <<" simple."<is_contractible(p, display_time); + return m_minimal_quadrangulation->is_contractible(p, display_time, m_is_verbose); } /// @return true iff 'p1' and 'p2' are freely homotopic. @@ -85,7 +86,7 @@ public: { compute_minimal_quadrangulation(display_time); return m_minimal_quadrangulation->are_freely_homotopic(p1, p2, - display_time); + display_time, m_is_verbose); } /// @return true iff 'p1' and 'p2' are base point freely homotopic. @@ -95,7 +96,7 @@ public: { compute_minimal_quadrangulation(display_time); return m_minimal_quadrangulation->are_base_point_homotopic(p1, p2, - display_time); + display_time, m_is_verbose); } //================================================================================ @@ -166,11 +167,32 @@ public: return m_facewidth->compute_face_width(display_time); } +//================================================================================ +// Test whether a path is homotopic to a simple cycle + + bool is_homotopic_to_simple_cycle(const Path_on_surface& p, + bool display_time=false) const + { + compute_minimal_quadrangulation(display_time); + return m_minimal_quadrangulation->is_homotopic_to_simple_cycle(p, display_time, m_is_verbose); + } + +//================================================================================ +// Utility functions + + // Set whether to display warning message in `std::cerr` when input doesn't meet + // prerequesite + void set_verbose(bool is_verbose) + { + m_is_verbose = is_verbose; + } + protected: const Mesh& m_original_mesh; mutable std::unique_ptr m_minimal_quadrangulation; mutable std::unique_ptr m_shortest_noncontractible_cycle; mutable std::unique_ptr m_facewidth; + bool m_is_verbose; }; } // namespace Surface_mesh_topology diff --git a/Surface_mesh_topology/include/CGAL/Path_on_surface.h b/Surface_mesh_topology/include/CGAL/Path_on_surface.h index 5eecbcb9b65..7a56a82156a 100644 --- a/Surface_mesh_topology/include/CGAL/Path_on_surface.h +++ b/Surface_mesh_topology/include/CGAL/Path_on_surface.h @@ -1099,6 +1099,39 @@ public: } } + /// @return the primitive root and the power of the path in the sense of string. + /// use the linear Knuth-Morris-Pratt search + std::pair factorize() { + CGAL_assertion(is_valid()); + if (!is_closed()) { + // if a path is not closed, it is already primitive + return std::make_pair(Path_on_surface(*this), 1); + } + + Self pp1(*this); + pp1.simplify_flips(); + Self pp2(pp1); + /// create a path of (*this)->(*this) + pp2 += pp1; + + /// Match (*this) to (*this)->(*this) with the first dart removed + auto itMatch = boost::algorithm::knuth_morris_pratt_search(pp2.m_path.begin() + 1, + pp2.m_path.end(), + pp1.m_path.begin(), + pp1.m_path.end()) +#if BOOST_VERSION>=106200 + .first +#endif + ; + /// It can be proved that the first match location is the length of match + auto primitiveSize = itMatch - pp2.m_path.begin(); + auto originalLength = pp1.length(); + CGAL_assertion(pp1.length() % primitiveSize == 0); + pp1.cut(primitiveSize); + CGAL_assertion(pp1.is_closed()); + return std::make_pair(pp1, originalLength / primitiveSize); + } + /// @return the turn between dart number i and dart number i+1. /// (turn is position of the second edge in the cyclic ordering of /// edges starting from the first edge around the second extremity @@ -1133,6 +1166,23 @@ public: get_opposite_ith_real_dart(i)); } + /// @return the turn between dart number i-1 and dart number i. + std::size_t prev_positive_turn(std::size_t i) const + { + // CGAL_assertion(is_valid()); + CGAL_assertion(i0); + return next_positive_turn(prev_index(i)); + } + /// @return the negative turn between dart number i-1 and dart number i. + std::size_t prev_negative_turn(std::size_t i) const + { + // CGAL_assertion(is_valid()); + CGAL_assertion(i0); + return next_negative_turn(prev_index(i)); + } + /// Computes all positive turns of this path. std::vector compute_positive_turns() const { diff --git a/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Minimal_quadrangulation.h b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Minimal_quadrangulation.h index 4481eebc353..174ff1aec75 100644 --- a/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Minimal_quadrangulation.h +++ b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Minimal_quadrangulation.h @@ -32,6 +32,8 @@ #include #include #include +#include +#include namespace CGAL { namespace Surface_mesh_topology { @@ -50,6 +52,52 @@ struct Minimal_quadrangulation_local_map_items }; }; +struct Minimal_quadrangulation_simplicity_testing_rbtree_node +{ + Minimal_quadrangulation_simplicity_testing_rbtree_node(std::size_t i=0) + : m_idx(i) {} + + Minimal_quadrangulation_simplicity_testing_rbtree_node *m_parent, *m_left, *m_right; + int m_color; + std::size_t m_idx; +}; + +struct Minimal_quadrangulation_simplicity_testing_rbtree_node_traits +{ + typedef Minimal_quadrangulation_simplicity_testing_rbtree_node node; + typedef Minimal_quadrangulation_simplicity_testing_rbtree_node* node_ptr; + typedef const Minimal_quadrangulation_simplicity_testing_rbtree_node* const_node_ptr; + typedef int color; + + static node_ptr get_parent(const_node_ptr n) { return n->m_parent; } + static void set_parent(node_ptr n, node_ptr parent) { n->m_parent = parent; } + static node_ptr get_left(const_node_ptr n) { return n->m_left; } + static void set_left(node_ptr n, node_ptr left) { n->m_left = left; } + static node_ptr get_right(const_node_ptr n) { return n->m_right; } + static void set_right(node_ptr n, node_ptr right) { n->m_right = right; } + static color get_color(const_node_ptr n) { return n->m_color; } + static void set_color(node_ptr n, color color) { n->m_color = color; } + static color black() { return color(0); } + static color red() { return color(1); } +}; + +struct Minimal_quadrangulation_simplicity_testing_rbtree_value_traits +{ + typedef Minimal_quadrangulation_simplicity_testing_rbtree_node_traits node_traits; + typedef node_traits::node value_type; + typedef node_traits::node_ptr node_ptr; + typedef node_traits::const_node_ptr const_node_ptr; + typedef value_type* pointer; + typedef value_type const* const_pointer; + + static const boost::intrusive::link_mode_type link_mode = boost::intrusive::link_mode_type::normal_link; + + static node_ptr to_node_ptr(value_type &value) { return &value; } + static const_node_ptr to_node_ptr(const value_type &value) { return &value; } + static pointer to_value_ptr(node_ptr n) { return n; } + static const_pointer to_value_ptr(const_node_ptr n) { return n; } +}; + template class Minimal_quadrangulation { @@ -242,14 +290,17 @@ public: /// @return true iff 'p' is contractible. bool is_contractible(const Path_on_surface& p, - bool display_time=false) const + bool display_time=false, bool is_verbose=false) const { if (p.is_empty()) { return true; } if (!p.is_closed()) { - std::cerr<<"Error: is_contractible requires a closed path."<& p1, const Path_on_surface& p2, - bool display_time=false) const + bool display_time=false, bool is_verbose=false) const { if (p1.is_empty() && p2.is_empty()) { return true; } if ((!p1.is_empty() && !p1.is_closed()) || (!p2.is_empty() && !p2.is_closed())) { - std::cerr<<"Error: are_freely_homotopic requires two closed paths." - <& p1, const Path_on_surface& p2, - bool display_time=false) const + bool display_time=false, bool is_verbose=false) const { if (p1.is_empty() && p2.is_empty()) { return true; } if (p1.is_empty() || p2.is_empty()) { return false; } @@ -365,8 +419,11 @@ public: (p1.back_flip()?p1.back():get_original_map().template beta<1>(p1.back()), p2.back_flip()?p2.back():get_original_map().template beta<1>(p2.back()))) { - std::cerr<<"Error: are_base_point_homotopic requires two paths that" - <<" share the same vertices as extremities."<& p, + bool display_time=false, bool is_verbose=false) const + { + if (p.is_empty()) + { return true; } + + if (!p.is_closed()) + { + if (is_verbose) + { + std::cerr<<"Error: is_homotopic_to_simple_cycle requires a closed path."< + pt=transform_original_path_into_quad_surface_for_torus(p); + + int a, b; + count_edges_of_path_on_torus(pt, a, b); + a = std::abs(a); + b = std::abs(b); + res=((a == 0 && b == 1) || (b == 0 && a == 1) || CGAL::gcd(a, b) - 1 == 0); + } + else if (is_contractible(p)) + { + // genus > 1 and contractible + res=true; + } + else + { + // genus > 1 and not contractible, perform unzip algorithm + internal::Path_on_surface_with_rle + pt=transform_original_path_into_quad_surface_with_rle(p); + pt.canonize(); + // Use non-rle path from now on + Path_on_surface p_canonized(pt); + auto factorization=p_canonized.factorize(); + // If the path length is 1, it must be simple + res = factorization.second <= 1 && factorization.first.length() <= 1; + if (factorization.second <= 1 && !res) + { + // If the curve is not primitive, there must be at least + // one self intersection + + auto& p_original = factorization.first; + p_original.simplify_flips(); + + auto perturbation = compute_perturbation(p_original); + + // Check whether orders form a valid parenthesis expression + res = is_ordering_simple(perturbation.first, perturbation.second); + } + } + + if (display_time) + { + t.stop(); + std::cout<<"[TIME] is_homotopic_to_simple_cycle: "<, std::unordered_map>> compute_perturbation(const Path_on_surface& p) const + { + std::vector pr; + pr.reserve(p.length()); + for(std::size_t i = 0; i < p.length(); ++i) + { + pr.emplace_back(p[i]); + } + + // Compute the backward cyclic KMP failure table for the curve + std::vector suffix_len = compute_common_circular_suffix(p); + std::vector switchable = compute_switchable(p); + + typedef typename boost::intrusive::rbtree> rbtree; + std::vector rb_nodes; + rb_nodes.reserve(pr.size()); + std::unordered_map trees; + + for (std::size_t i = 0; i < pr.size(); ++i) + { + Dart_const_handle dh = pr[i]; + auto dart_id = get_absolute_idx(dh); + rb_nodes.emplace_back(i); + auto& node = rb_nodes.back(); + + // Check whether current darts needs to be switched + if (i > 0 && switchable[i]) + { + // Look at the t-1 turn of [i-1, i, i + 1] + Dart_const_handle dleft = get_local_map().template beta<0, 2>(dh); + size_type dleft_id = get_absolute_idx(dleft); + if(trees[dleft_id].size() > 0) + { + std::size_t max_turn_idx = is_absolutely_directed(dleft) ? trees[dleft_id].begin()->m_idx : trees[dleft_id].rbegin()->m_idx; + Dart_const_handle dprev = get_previous_relative_to(pr, max_turn_idx, dleft); + // If there exists a crossing that can be avoided, switch + if(get_order_relative_to(pr[i - 1], dleft) > get_order_relative_to(dprev, dleft)) + { + switch_dart(pr, i, switchable); + dh = pr[i]; + dart_id = get_absolute_idx(pr[i]); + } + } + } + // Insert current darts + if (trees[dart_id].empty()) + { + trees[dart_id].push_back(node); + } + else + { + // First check whether there is another corner in the previous part of the path + // where it matches p[i - 1] -> p[i] + // If so, p[i] must be inserted adjacent to one such corner + size_type prev_dart_id = get_absolute_idx(pr[i - 1]); + auto it_prev = trees[prev_dart_id].iterator_to(rb_nodes[i - 1]); + if (it_prev != trees[prev_dart_id].begin() && is_same_corner(pr, std::prev(it_prev)->m_idx, i - 1)) + { + auto it_adjacent = trees[dart_id].iterator_to(rb_nodes[get_next_idx_relative_to(pr, std::prev(it_prev)->m_idx, pr[i - 1])]); + if(is_absolutely_directed(pr[i - 1]) == is_absolutely_directed(dh)) + { + trees[dart_id].insert_before(std::next(it_adjacent), node); + } + else + { + trees[dart_id].insert_before(it_adjacent, node); + } + } + else if (std::next(it_prev) != trees[prev_dart_id].end() && is_same_corner(pr, std::next(it_prev)->m_idx, i - 1)) + { + auto it_adjacent = trees[dart_id].iterator_to(rb_nodes[get_next_idx_relative_to(pr, std::next(it_prev)->m_idx, pr[i-1])]); + if(is_absolutely_directed(pr[i - 1]) == is_absolutely_directed(dh)) + { + trees[dart_id].insert_before(it_adjacent, node); + } + else + { + trees[dart_id].insert_before(std::next(it_adjacent), node); + } + } + else + { + /// There is no same corner in the previous of the path + /// Perform usual unzip insertion + auto less_than_in_tree = is_absolutely_directed(dh)? + std::function{std::greater()} : std::function{std::less()}; + auto comparator = [this, &pr, &p, &suffix_len, &less_than_in_tree] (const std::size_t& key, const rbtree::value_type& b) -> bool { + if (b.m_idx == 0 && pr[key] == pr[0]) + { + if(pr[key] != p[key]) { + // current edge was switched so it should always be on the right side (more clockwise) + return less_than_in_tree(0, 1); + } + /// Comparing to pr[0], needs to check longest suffix + std::size_t current_dividing_idx = key + p.length() - 1 - suffix_len[key - 1]; + std::size_t path_end_dividing_idx = p.length() - 1 - suffix_len[key - 1]; + std::size_t last_same_idx = (path_end_dividing_idx == p.length() - 1) ? 0 : path_end_dividing_idx + 1; + if (current_dividing_idx >= p.length()) + { + current_dividing_idx -= p.length(); + } + Dart_const_handle dbase = p[last_same_idx], + dcur = p[current_dividing_idx], + d0 = p[path_end_dividing_idx]; + + std::size_t key_prev_order = this->get_order_relative_to(dcur, dbase); + std::size_t b_prev_order = this->get_order_relative_to(d0, dbase); + return less_than_in_tree(key_prev_order, b_prev_order); + } + else + { + std::size_t key_prev_order = this->get_order_relative_to(pr[key - 1], pr[key]); + Dart_const_handle bprev = this->get_previous_relative_to(pr, b.m_idx, pr[key]); + std::size_t b_prev_order = this->get_order_relative_to(bprev, pr[key]); + return less_than_in_tree(key_prev_order, b_prev_order); + } + }; + auto it_after = trees[dart_id].upper_bound(i, comparator); + trees[dart_id].insert_before(it_after, node); + } + } + } + + Path_on_surface p_perturbed(get_local_map()); + for(const auto& dp: pr) + { + p_perturbed.push_back(dp); + } + std::unordered_map> ordering; + for(const auto& edge_ordering: trees) + { + std::transform(edge_ordering.second.begin(), edge_ordering.second.end(), + std::back_inserter(ordering[edge_ordering.first]), + [] (const rbtree::value_type& node) + { + return node.m_idx; + }); + } + return std::make_pair(p_perturbed, ordering); + } + + /// @return true iff the ordering of the edges in the input path is intersection free + bool is_ordering_simple(const Path_on_surface& p, const std::unordered_map>& ordering) const + { + bool res = true; + auto marktemp=get_local_map().get_new_mark(); + for (auto it=get_local_map().darts().begin(); + res && it!=get_local_map().darts().end(); ++it) + { + if (!get_local_map().is_marked(it, marktemp)) + { + std::stack> parenthesis_pairing; + Dart_const_handle dh2=it; + do + { + get_local_map().mark(dh2, marktemp); + auto dart_id = get_absolute_idx(dh2); + auto handle_node = [&dh2, &p, &parenthesis_pairing] (const std::size_t& idx) { + auto curr_dart = std::make_pair(idx, p[idx] == dh2); + if (parenthesis_pairing.empty()) + { + parenthesis_pairing.push(curr_dart); + } + else + { + /// We can cancel a pair of dart iff + /// 1) They are adjacent in the path (wrap around for the last dart) + /// 2) The first one is going in and the second one is going out + auto prev_dart = parenthesis_pairing.top(); + auto next_dart = curr_dart; + if(!next_dart.second) + { + std::swap(next_dart, prev_dart); + } + if ((next_dart.first - prev_dart.first == 1 || (next_dart.first == 0 && prev_dart.first == p.length() - 1)) && + (!prev_dart.second && next_dart.second)) + { + parenthesis_pairing.pop(); + } + else + { + parenthesis_pairing.push(curr_dart); + } + } + }; + auto it_dart_ordering = ordering.find(dart_id); + if (it_dart_ordering != ordering.cend()) + { + if (is_absolutely_directed(dh2)) + { + std::for_each(it_dart_ordering->second.cbegin(), it_dart_ordering->second.cend(), handle_node); + } + else + { + std::for_each(it_dart_ordering->second.crbegin(), it_dart_ordering->second.crend(), handle_node); + } + } + dh2 = get_local_map().template beta<2, 1>(dh2); + } + while(dh2!=it); + res = res && parenthesis_pairing.empty(); + } + } + get_local_map().free_mark(marktemp); + return res; + } + + /// Compute the longest common suffix of a path against all of it circular shifts + /// Based on a modification of Knuth-Morris-Pratt algorithm + std::vector compute_common_circular_suffix(const Path_on_surface& p) const + { + Path_on_surface q(p); + q += p; + std::vector suffix_len(q.length()); + std::size_t match_begin = 0, + match_end = 0; + suffix_len.back() = q.length(); + for (std::size_t i = 1; i < q.length(); ++i) { + std::size_t match_idx = q.length() - 1 - i; + if (i >= match_end || i + suffix_len[match_idx + match_begin] >= match_end) { + match_begin = i; + if (i >= match_end) { + match_end = i; + } + while (match_end < q.length() && q[q.length() - 1 - match_end] == q[q.length() - 1 - (match_end - i)]) { + ++match_end; + } + suffix_len[match_idx] = match_end - match_begin; + } + else { + suffix_len[match_idx] = suffix_len[match_idx + match_begin]; + } + } + + std::vector result(suffix_len.begin() + p.length(), suffix_len.end()); + for (std::size_t i = 0; i < result.size(); ++i) { + result[i] = (std::min)(result[i], p.length()); + } + return result; + } + + /// Compute a boolean array of whether there is an left-L-shape at i-th dart, aka whether it is swicthable + std::vector compute_switchable(const Path_on_surface& p) const + { + std::vector switchable(p.length(), false); + /// Skip the last dart and the first dart since it can never be switched, nor can it + /// be the second last dart of a switch + std::size_t idx = p.length() - 2; + while (idx > 0) + { + if (positive_turn(p[idx], p[idx + 1]) == 1) + { + /// This is the end of a possible switchbale subpath + switchable[idx].flip(); + --idx; + while (idx > 0 && positive_turn(p[idx], p[idx + 1]) == 2) + { + switchable[idx].flip(); + --idx; + } + } else + { + --idx; + } + } + return switchable; + } + + /// Actually switch the dart in a vector of darts + void switch_dart(std::vector& p, std::size_t i, std::vector& switchable) const + { + CGAL_assertion(static_cast(switchable[i])); + p[i] = get_local_map().template beta<0, 2>(p[i]); + p[i + 1] = get_local_map().template beta<2, 0, 2>(p[i]); + switchable[i] = false; + /// It is guarantee that the last dart is not switchable + std::size_t j = i + 2; + for(; switchable[j - 1]; ++j) + { + p[j] = get_local_map().template beta<2, 0, 2, 0, 2>(p[j - 1]); + switchable[j - 1] = false; + } + /// Last dart may become switchable + if (j < p.size() && ((switchable[j] && positive_turn(p[j - 1], p[j]) == 2) || + positive_turn(p[j - 1], p[j]) == 1)) + { + switchable[j - 1] = true; + } + } + + /// Essentially compute the positive turn between ref and x + /// Requires x and ref outgoing at the same vertex + size_type get_order_relative_to(Dart_const_handle x, Dart_const_handle ref) const + { + CGAL_assertion(get_local_map().template belong_to_same_cell<0>(get_local_map().opposite2(x), ref)); +#if defined(CGAL_PWRLE_TURN_V2) || defined(CGAL_PWRLE_TURN_V3) + size_type ref_degree = get_local_map().template info<0>(ref); + size_type x_order = get_dart_id(get_local_map().opposite2(x)) % ref_degree; + size_type base_order = get_dart_id(ref) % ref_degree; + return (x_order < base_order) ? (x_order + ref_degree - base_order) : (x_order - base_order); +#else + return get_local_map().negative_turn(x, ref); +#endif + } + + /// Extend p[i] towards the reverse direction of ref + /// Requires p[i] and ref on the same 1-cell + /// @return the index + int get_previous_idx_relative_to(const std::vector& p, std::size_t i, Dart_const_handle ref) const + { + CGAL_assertion(get_local_map().template belong_to_same_cell<1>(p[i], ref)); + return p[i] == ref ? (static_cast(i) - 1) : (static_cast(i) + 1); + } + + /// Extend p[i] towards the reverse direction of ref + /// Requires p[i] and ref on the same 1-cell + /// @return whether the extension is viable without crossing the first and the last dart + bool has_previous_relative_to(const std::vector& p, std::size_t i, Dart_const_handle ref) const + { + CGAL_assertion(get_local_map().template belong_to_same_cell<1>(p[i], ref)); + int j = get_previous_idx_relative_to(p, i, ref); + return j >= 0 && j < p.size(); + } + + /// Extend p[i] towards the reverse direction of ref + /// Requires p[i] and ref on the same 1-cell + /// @return the actual dart, wrap around if reaching boundary + Dart_const_handle get_previous_relative_to(const std::vector& p, std::size_t i, Dart_const_handle ref) const + { + CGAL_assertion(get_local_map().template belong_to_same_cell<1>(p[i], ref)); + if (p[i] == ref) + { + return p[(i == 0) ? (p.size() - 1) : i - 1]; + } + else + { + return get_local_map().opposite2(p[(i == p.size() - 1) ? 0 : i + 1]); + } + } + + /// Extend p[i] towards the direction of ref + /// Requires p[i] and ref on the same 1-cell + /// @return the index + int get_next_idx_relative_to(const std::vector& p, std::size_t i, Dart_const_handle ref) const + { + CGAL_assertion(get_local_map().template belong_to_same_cell<1>(p[i], ref)); + return p[i] == ref ? (static_cast(i) + 1) : (static_cast(i) - 1); + } + + /// Extend p[i] towards the direction of ref + /// Requires p[i] and ref on the same 1-cell + /// @return whether the extension is viable without crossing the first and the last dart + bool has_next_relative_to(const std::vector& p, std::size_t i, Dart_const_handle ref) const + { + CGAL_assertion(get_local_map().template belong_to_same_cell<1>(p[i], ref)); + int j = get_next_idx_relative_to(p, i, ref); + return j >= 0 && j < static_cast(p.size()); + } + + /// Extend p[i] towards the direction of ref + /// Requires p[i] and ref on the same 1-cell + /// @return the actual dart, wrap around if reaching boundary + Dart_const_handle get_next_relative_to(const std::vector& p, std::size_t i, Dart_const_handle ref) const + { + CGAL_assertion(get_local_map().template belong_to_same_cell<1>(p[i], ref)); + if (p[i] == ref) + { + return p[(i == p.size() - 1) ? 0 : i + 1]; + } + else + { + return get_local_map().opposite2(p[(i == 0) ? (p.size() - 1) : i - 1]); + } + } + + /// @return a unique 1-cell id for the dart + size_type get_absolute_idx(Dart_const_handle dh) const + { + return (std::min)(get_local_map().darts().index(dh), get_local_map().darts().index(get_local_map().opposite(dh))); + } + + /// @return true if the dart is the representative for the unique 1-cell id + bool is_absolutely_directed(Dart_const_handle dh) const + { + return get_local_map().darts().index(dh) < get_local_map().darts().index(get_local_map().opposite(dh)); + } + + /// @return true if p[ref] -> p[ref + 1] forms the same corner as p[j] + /// Requires p[j] and p[ref] on the same 1-cell + bool is_same_corner(const std::vector& p, std::size_t j, std::size_t ref) const + { + if (!has_next_relative_to(p, j, p[ref])) + { + return false; + } + return get_next_relative_to(p, j, p[ref]) == p[ref + 1]; + } + protected: /// The original map (the mesh seen as a 2-map) const typename Get_map::storage_type m_original_map; diff --git a/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Path_on_surface_with_rle.h b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Path_on_surface_with_rle.h index a8e984fd348..34ca3e55ecc 100644 --- a/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Path_on_surface_with_rle.h +++ b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Path_on_surface_with_rle.h @@ -81,6 +81,7 @@ public: Light_MQ(const Local_map& m): m_map(m) {} + Light_MQ(const Light_MQ&) = default; const Local_map& get_local_map() const { return m_map; } @@ -141,6 +142,8 @@ public: #endif //CGAL_PWRLE_TURN_V2 {} + Path_on_surface_with_rle(const Self&) = default; + /// Creates a Path_on_surface_with_rle from a Path_on_surface. /// If use_only_positive, consider only positive flats and not negative ones. /// If use_only_negative, consider only negative flats and not positive ones. @@ -167,15 +170,15 @@ public: if (apath.is_closed()) { - if (!use_only_negative && apath.next_positive_turn(i)==2) + if (!use_only_negative && apath.prev_positive_turn(i)==2) { positive_flat=true; negative_flat=false; } - else if (!use_only_positive && apath.next_negative_turn(i)==2) + else if (!use_only_positive && apath.prev_negative_turn(i)==2) { positive_flat=false; negative_flat=true; } - while ((positive_flat && apath.next_positive_turn(i)==2) || - (negative_flat && apath.next_negative_turn(i)==2)) + while ((positive_flat && apath.prev_positive_turn(i)==2) || + (negative_flat && apath.prev_negative_turn(i)==2)) { - i=apath.next_index(i); + i=apath.prev_index(i); if (i==0) // Case of a closed path, made of only one flat part. { m_path.push_back(Flat(apath.real_front(), apath.real_back(), @@ -186,8 +189,7 @@ public: return; } } - // Here i is the last dart of a flat - i=apath.next_index(i); // Now we are sure that i is the beginning of a flat + // Here i is the first dart of a flat } starti=i; @@ -1214,6 +1216,15 @@ public: return is_next_flat_can_be_extended_at_beginning(it, dh, dummy1, dummy2); } + /// @return true iff the flat 'it' forms a switchable subpath (aka left-L-shape) + bool is_switchable(const List_iterator& it) + { + CGAL_assertion(is_valid_iterator(it)); + if (it == m_path.begin() || std::next(it) == m_path.end()) { return false; } + std::size_t t=next_positive_turn(it); + return (t==1 && flat_length(it) >= 0); + } + /// Add the given dart 'dh' before the flat 'it'. void add_dart_before(const List_iterator& it, Dart_const_handle dh, Set_of_it& modified_flats) diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 96cad072369..726cf03efd1 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -21,6 +21,7 @@ #ifdef CGAL_USE_BASIC_VIEWER +#include #include namespace CGAL { @@ -409,6 +410,7 @@ void draw(const Mesh& alcc, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc=1; const char* argv[2]={"lccviewer","\0"}; QApplication app(argc,const_cast(argv)); diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt index 070c7327bcd..dd5836f3dfb 100644 --- a/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt +++ b/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt @@ -21,19 +21,25 @@ endif() # add_definitions("-D_GLIBCXX_DEBUG") set(SOURCE_FILES - fundamental_group_of_the_circle.cpp - fundamental_group_of_the_torus.cpp - homotopy_big_cylinder.cpp - homotopy_double_torus_with_holes.cpp - homotopy_rond_point_saucisse.cpp - homotopy_small_cylinder.cpp - path_tests.cpp - path_with_rle_deformation_tests.cpp - shortest_noncontractible_cycle_tests.cpp - test_homotopy.cpp - test_homotopy_with_polygonal_schema.cpp - test_shortest_cycle_non_contractible.cpp - tests_path_on_surface.cpp) + fundamental_group_of_the_circle.cpp + fundamental_group_of_the_torus.cpp + homotopy_big_cylinder.cpp + homotopy_double_torus_with_holes.cpp + homotopy_rond_point_saucisse.cpp + homotopy_small_cylinder.cpp + path_tests.cpp + path_with_rle_deformation_tests.cpp + shortest_noncontractible_cycle_tests.cpp + simplicity_cylinder.cpp + simplicity_double_torus.cpp + simplicity_double_torus_with_holes.cpp + simplicity_fundamental_polygon.cpp + simplicity_torus.cpp + test_homotopy.cpp + test_homotopy_with_polygonal_schema.cpp + test_shortest_cycle_non_contractible.cpp + tests_path_on_surface.cpp + ) foreach(cppfile ${SOURCE_FILES}) create_single_source_cgal_program("${cppfile}") diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/path_tests.cpp b/Surface_mesh_topology/test/Surface_mesh_topology/path_tests.cpp index ee9e5ba0765..28cbe41a528 100644 --- a/Surface_mesh_topology/test/Surface_mesh_topology/path_tests.cpp +++ b/Surface_mesh_topology/test/Surface_mesh_topology/path_tests.cpp @@ -93,9 +93,9 @@ bool basic_tests() internal::Light_MQ lmq(p6.get_map()); internal::Path_on_surface_with_rle > p7(lmq, p6); - if (!p7.is_valid() || p7.size_of_list()!=2) + if (!p7.is_valid() || p7.size_of_list()!=3) { - std::cerr<<"path_tests ERROR: !p7.is_valid() || size_of_list()!=2."< +#include +#include + +using namespace CGAL::Surface_mesh_topology; +typedef Polygonal_schema_with_combinatorial_map<> PS; + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh_1(PS& ps) +{ + ps.add_facet("a b c d"); + ps.add_facet("-b e -d f"); + ps.add_facet("-a -e"); + ps.add_facet("-c -f"); + ps.perforate_facet("-a"); + ps.perforate_facet("-c"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh_2(PS& ps) +{ + ps.add_facet("a b c d"); + ps.add_facet("-b e -d f"); + ps.add_facet("-a -e"); + ps.add_facet("-c -f"); + ps.perforate_facet("-a"); + ps.perforate_facet("-c"); + ps.perforate_facet("a"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh_3(PS& ps) +{ + ps.add_facet("a b c d"); + ps.add_facet("-b e -d f"); + ps.add_facet("-a -e"); + ps.add_facet("-c -f"); + ps.perforate_facet("-a"); + ps.perforate_facet("-c"); + ps.perforate_facet("e"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_label("a e"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_label("a b -f d a e"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_3(Path_on_surface& p) +{ + p.push_back_by_label("a b c d"); +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + PS ps[2]; + create_mesh_1(ps[0]); + create_mesh_2(ps[1]); + + std::size_t num_ps = sizeof(ps) / sizeof(PS); + bool res=true; + + for(std::size_t i = 0; i < num_ps; ++i) + { + Curves_on_surface_topology cst(ps[i]); + Path_on_surface p1(ps[i]), p2(ps[i]), p3(ps[i]); + create_path_1(p1); + create_path_2(p2); + create_path_3(p3); + + if(!cst.is_homotopic_to_simple_cycle(p1)) + { + std::cout<<"ERROR simplicity_cylinder surface" + << (i+1) << "/test1: " + <<"Path p1 should be homotopic to a simple cycle" + < +#include +#include + +using namespace CGAL::Surface_mesh_topology; +typedef Polygonal_schema_with_combinatorial_map<> PS; + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_label("b b a b -d -d -d -c -d a"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_label("b b a b d c d d d a"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_3(Path_on_surface& p) +{ + p.push_back_by_label("a b b b a b b a b b"); + p.push_back_by_label("d c"); + p.push_back_by_label("d c d c d"); + p.push_back_by_label("-c -d"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_4(Path_on_surface& p) +{ + p.push_back_by_label("a b b b a b b a b b"); + p.push_back_by_label("d c"); + p.push_back_by_label("-d -c -d -c -d"); + p.push_back_by_label("-c -d"); +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + PS ps; + ps.add_facet("a b -a -b c d -c -d"); + + Curves_on_surface_topology cst(ps); + Path_on_surface p1(ps), p2(ps), p3(ps), p4(ps); + create_path_1(p1); + create_path_2(p2); + create_path_3(p3); + create_path_4(p4); + + bool res=true; + + if(!cst.is_homotopic_to_simple_cycle(p1)) + { + std::cout<<"ERROR simplicity_double_torus test1: " + <<"Path p1 should be homotopic to a simple cycle" + < +#include +#include + +using namespace CGAL::Surface_mesh_topology; +typedef Polygonal_schema_with_combinatorial_map<> PS; + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh_1(PS& ps) +{ + ps.add_facet("b -a g f e"); + ps.add_facet("-b k i -g"); + ps.add_facet("-f -i -h"); + ps.add_facet("a -e h j"); + ps.add_facet("-k -m -l -j"); + ps.add_facet("c -r o m"); + ps.add_facet("-o -p -n"); + ps.add_facet("-d l n -q"); + ps.add_facet("d -c q p r"); + ps.perforate_facet("-i"); + ps.perforate_facet("-o"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh_2(PS& ps) +{ + ps.add_facet("a b -a -b o"); + ps.add_facet("-o -p"); + ps.add_facet("c d -c -d p"); + ps.perforate_facet("-o"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh_3(PS& ps) +{ + ps.add_facet("a b -a -b s"); + ps.add_facet("c d -c -d -s"); + ps.perforate_facet("s"); + ps.perforate_facet("-s"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_label("b b a b -d -d -d -c -d a"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_label("b b a b d c d d d a"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_3(Path_on_surface& p) +{ + p.push_back_by_label("a b b b a b b a b b"); + p.push_back_by_label("d c"); + p.push_back_by_label("d c d c d"); + p.push_back_by_label("-c -d"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_4(Path_on_surface& p) +{ + p.push_back_by_label("a b b b a b b a b b"); + p.push_back_by_label("d c"); + p.push_back_by_label("-d -c -d -c -d"); + p.push_back_by_label("-c -d"); +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + PS ps[3]; + create_mesh_1(ps[0]); + create_mesh_2(ps[1]); + create_mesh_3(ps[2]); + + std::size_t num_ps = sizeof(ps) / sizeof(PS); + bool res=true; + + for(std::size_t i = 0; i < num_ps; ++i) + { + Curves_on_surface_topology cst(ps[i]); + Path_on_surface p1(ps[i]), p2(ps[i]), p3(ps[i]), p4(ps[i]); + create_path_1(p1); + create_path_2(p2); + create_path_3(p3); + create_path_4(p4); + + if(!cst.is_homotopic_to_simple_cycle(p1)) + { + std::cout<<"ERROR simplicity_double_torus_with_holes surface" + << (i+1) << "/test1: " + <<"Path p1 should be homotopic to a simple cycle" + < +#include +#include + +using namespace CGAL::Surface_mesh_topology; +typedef Polygonal_schema_with_combinatorial_map<> PS; + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh1(PS& ps) +{ + ps.add_facet("a b -a -b c d -c -d"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh1_path1(Path_on_surface& p) +{ + p.push_back_by_label("a b c c -a -a -a b"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh1_path2(Path_on_surface& p) +{ + p.push_back_by_label("a c a a c -a"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh1_path3(Path_on_surface& p) +{ + p.push_back_by_label("d -c a a b a d b -c -c d b"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh2(PS& ps) +{ + ps.add_facet("a b -a -b c d -c -d e f -e -f"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh2_path1(Path_on_surface& p) +{ + p.push_back_by_label("b -c e -f c -f c b e c"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh2_path2(Path_on_surface& p) +{ + p.push_back_by_label("a f -e a -e f"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_mesh2_path3(Path_on_surface& p) +{ + p.push_back_by_label("f a f -b -e -e b a"); +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + PS ps1, ps2; + create_mesh1(ps1); + create_mesh2(ps2); + + bool res=true; + + Curves_on_surface_topology cst1(ps1), cst2(ps2); + Path_on_surface p1_1(ps1), p2_1(ps1), p3_1(ps1), + p1_2(ps2), p2_2(ps2), p3_2(ps2); + + create_mesh1_path1(p1_1); + create_mesh1_path2(p2_1); + create_mesh1_path3(p3_1); + create_mesh2_path1(p1_2); + create_mesh2_path2(p2_2); + create_mesh2_path3(p3_2); + + if(cst1.is_homotopic_to_simple_cycle(p1_1)) + { + std::cout<<"ERROR simplicity_homology_group test1" + <<"Path p1_1 should not be homotopic to a simple cycle" + < +#include +#include + +using namespace CGAL::Surface_mesh_topology; +typedef Polygonal_schema_with_combinatorial_map<> PS; + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_label("a b a a b"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_label("a b"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_3(Path_on_surface& p) +{ + p.push_back_by_label("-a b a b b"); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_4(Path_on_surface& p) +{ + p.push_back_by_label("-a -b a a -b -b a a -b a -b -b"); +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + PS ps; + ps.add_facet("a b -a -b"); + + Curves_on_surface_topology cst(ps); + Path_on_surface p1(ps), p2(ps), p3(ps), p4(ps); + create_path_1(p1); + create_path_2(p2); + create_path_3(p3); + create_path_4(p4); + + bool res=true; + + if(!cst.is_homotopic_to_simple_cycle(p1)) + { + std::cout<<"ERROR simplicity_torus test1: " + <<"Path p1 should be homotopic to a simple cycle" + < -#include - -#include - -namespace CGAL { -namespace Total { -namespace internal { - -//To avoid "fopen may be unsafe" on Visual. -bool open_file(FILE **fin, const char* filename) -{ -#if defined(BOOST_MSVC) - return (fopen_s(fin, filename, "rw") == 0); -#else - *fin = fopen(filename, "rw"); - return (fin != NULL); -#endif -} - -} // namespace internal - -void permuteLong(char *a) -{ - char tmp; - -#ifdef CGAL_LITTLE_ENDIAN -tmp=a[0]; a[0]=a[3]; a[3]=tmp; -tmp=a[1]; a[1]=a[2]; a[2]=tmp; -#endif -} - -void permuteLongTab(long *a,int nb) -{ - int i; - -#ifdef CGAL_LITTLE_ENDIAN -for(i=0;isetNum((int)image_word_size() * - dim_x->value() * - dim_y->value() * - dim_z->value()); -} - -unsigned int Raw_image_dialog::image_word_size() const { - if(short_bt->isChecked()) - return 2; - if(int_bt->isChecked()) - return 4; - else if(float_bt->isChecked()) - return 4; - else if(double_bt->isChecked()) - return 8; - else - return 1; -} - diff --git a/Surface_mesher/demo/Surface_mesher/Raw_image_dialog.h b/Surface_mesher/demo/Surface_mesher/Raw_image_dialog.h deleted file mode 100644 index 7f191fecaf6..00000000000 --- a/Surface_mesher/demo/Surface_mesher/Raw_image_dialog.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef RAW_IMAGE_DIALOG_H -#define RAW_IMAGE_DIALOG_H - -#include "ui_raw_image.h" - -class Raw_image_dialog : public QDialog, public Ui::Raw_image_dialog -{ - Q_OBJECT - -public: - Raw_image_dialog(QWidget* parent = 0); - - unsigned int image_word_size() const; - -private Q_SLOTS: - void update_image_size(); -}; - -#endif // RAW_IMAGE_DIALOG diff --git a/Surface_mesher/demo/Surface_mesher/Surface_mesher.cpp b/Surface_mesher/demo/Surface_mesher/Surface_mesher.cpp deleted file mode 100644 index b6c18695ab5..00000000000 --- a/Surface_mesher/demo/Surface_mesher/Surface_mesher.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "mainwindow.h" -#include -#include -#include - -int main(int argc, char** argv) -{ - QApplication application(argc,argv); - - application.setOrganizationDomain("geometryfactory.com"); - application.setOrganizationName("GeometryFactory"); - application.setApplicationName("Surface mesher Qt5 demo"); - - MainWindow w; - - if(argc>1) - w.surface_open(argv[1]); - - w.show(); - std::setlocale(LC_ALL, "C"); - return application.exec(); - std::cerr << "Exit\n"; -} diff --git a/Surface_mesher/demo/Surface_mesher/binary_image.h b/Surface_mesher/demo/Surface_mesher/binary_image.h deleted file mode 100644 index 591e6159744..00000000000 --- a/Surface_mesher/demo/Surface_mesher/binary_image.h +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright (c) 2005-2008 INRIA Sophia-Antipolis (France). -// Copyright (c) 2008 GeometryFactory (France) -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Laurent RINEAU, Pierre ALLIEZ - -#ifndef BINARY_IMAGE_3 -#define BINARY_IMAGE_3 - -#include - -#include -#include -#include - -#include -#include - -#include - -#include - -template -class CBinary_image_3 : public CGAL::Image_3 -{ - bool interpolate_; - bool labellized_; - -public: - double min_value; - double max_value; - - typedef FT_ FT; - -public: - CBinary_image_3() - : Image_3(), interpolate_(true) - { - } - - CBinary_image_3(const Image_3& bi) - : Image_3(bi), interpolate_(true) - { - } - - - CBinary_image_3(const CBinary_image_3& bi) - : Image_3(bi), interpolate_(bi.interpolate_),labellized_(bi.labellized_) - { - std::cerr << "CBinary_image_3::copy_constructor\n"; - min_value = bi.min_value; - max_value = bi.max_value; - } - - - void finish_open() { - CGAL_IMAGE_IO_CASE(image_ptr.get(), - Word *min; Word *max; - (boost::tie(min, max)) = - (CGAL::min_max_element((Word*)(data()), - (Word*)(data()) + - xdim() * ydim() * zdim())); - min_value = *min; - max_value = *max;) - } - - float xmax() const - { - return (float)(((image_ptr->xdim) - 1.0)*(image_ptr->vx)); - } - - float ymax() const - { - return (float)(((image_ptr->ydim) - 1.0)*(image_ptr->vy)); - } - - float zmax() const - { - return (float)(((image_ptr->zdim) - 1.0)*(image_ptr->vz)); - } - - Point center() - { - FT cx = 0.5 * xmax(); - FT cy = 0.5 * ymax(); - FT cz = 0.5 * zmax(); - return Point(cx,cy,cz); - } - - FT radius() - { - return (std::max)((std::max)(xmax(),ymax()),zmax()); - } - - Point point(const std::size_t i, - const std::size_t j, - const std::size_t k) const - { - return Point(i * (image_ptr->vx), - j * (image_ptr->vy), - k * (image_ptr->vz)); - } - -public: - bool inside(const float x, - const float y, - const float z) const - { - return ( x >= 0.0f && - y >= 0.0f && - z >= 0.0f && - x <= xmax() && - y <= ymax() && - z <= zmax() ); - } - - float rand_x() { return (float)rand() / (float)RAND_MAX * xmax(); } - float rand_y() { return (float)rand() / (float)RAND_MAX * ymax(); } - float rand_z() { return (float)rand() / (float)RAND_MAX * zmax(); } - - void set_interpolation(const bool b) - { - interpolate_ = b; - } - - bool interpolation() const { - return interpolate_; - } - - void set_labellized(const bool b) - { - labellized_ = b; - } - - bool labellized() const { - return labellized_; - } - - FT operator()(Point p) const - { - const float x = static_cast(CGAL::to_double(p.x())); - const float y = static_cast(CGAL::to_double(p.y())); - const float z = static_cast(CGAL::to_double(p.z())); - - if(interpolation()) { - if(labellized()) { - CGAL_IMAGE_IO_CASE(image_ptr.get(), - return (this->labellized_trilinear_interpolation(x, y, z, min_value));) - } - else { - CGAL_IMAGE_IO_CASE(image_ptr.get(), - return (this->trilinear_interpolation(x, y, z, min_value));) - } - } - else { - const std::ptrdiff_t i = static_cast(x/image()->vx + 0.5f); - const std::ptrdiff_t j = static_cast(y/image()->vy + 0.5f); - const std::ptrdiff_t k = static_cast(z/image()->vz + 0.5f); - if( i < 0 || - j < 0 || - k < 0 ) - { - return 0; - } - else - { - const std::size_t ui = static_cast(i); - const std::size_t uj = static_cast(j); - const std::size_t uk = static_cast(k); - if( ui >= image()->xdim || - uj >= image()->ydim || - uk >= image()->zdim ) - { - return 0; - } - else - { - return this->value(ui, uj, uk); - } - } - } - return FT(); - } -}; // end CBinary_image_3 - -#endif // BINARY_IMAGE_3 diff --git a/Surface_mesher/demo/Surface_mesher/colorlisteditor.cpp b/Surface_mesher/demo/Surface_mesher/colorlisteditor.cpp deleted file mode 100644 index 508b532c090..00000000000 --- a/Surface_mesher/demo/Surface_mesher/colorlisteditor.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2007-2007 Trolltech ASA. All rights reserved. -** -** This file is part of the example classes of the Qt Toolkit. -** -** This file may be used under the terms of the GNU General Public -** License version 2.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of -** this file. Please review the following information to ensure GNU -** General Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/ -** -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** In addition, as a special exception, Trolltech gives you certain -** additional rights. These rights are described in the Trolltech GPL -** Exception version 1.0, which can be found at -** http://www.trolltech.com/products/qt/gplexception/ and in the file -** GPL_EXCEPTION.txt in this package. -** -** In addition, as a special exception, Trolltech, as the sole copyright -** holder for Qt Designer, grants users of the Qt/Eclipse Integration -** plug-in the right for the Qt/Eclipse Integration to link to -** functionality provided by Qt Designer and its related libraries. -** -** Trolltech reserves all rights not expressly granted herein. -** -** 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: LGPL-2.0-only -** -****************************************************************************/ - -#include - -#include "colorlisteditor.h" - -ColorListEditor::ColorListEditor(QWidget *widget) : QComboBox(widget) -{ - populateList(); -} - -QColor ColorListEditor::color() const -{ - return itemData(currentIndex(), Qt::DecorationRole).value(); -} - -void ColorListEditor::setColor(QColor color) -{ - setCurrentIndex(findData(color, int(Qt::DecorationRole))); -} - -void ColorListEditor::populateList() -{ - QStringList colorNames = QColor::colorNames(); - - for (int i = 0; i < colorNames.size(); ++i) { - QColor color(colorNames[i]); - - insertItem(i, colorNames[i]); - setItemData(i, color, Qt::DecorationRole); - } -} - diff --git a/Surface_mesher/demo/Surface_mesher/colorlisteditor.h b/Surface_mesher/demo/Surface_mesher/colorlisteditor.h deleted file mode 100644 index 4763d52b3b0..00000000000 --- a/Surface_mesher/demo/Surface_mesher/colorlisteditor.h +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2007-2007 Trolltech ASA. All rights reserved. -** -** This file is part of the example classes of the Qt Toolkit. -** -** This file may be used under the terms of the GNU General Public -** License version 2.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of -** this file. Please review the following information to ensure GNU -** General Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/ -** -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** In addition, as a special exception, Trolltech gives you certain -** additional rights. These rights are described in the Trolltech GPL -** Exception version 1.0, which can be found at -** http://www.trolltech.com/products/qt/gplexception/ and in the file -** GPL_EXCEPTION.txt in this package. -** -** In addition, as a special exception, Trolltech, as the sole copyright -** holder for Qt Designer, grants users of the Qt/Eclipse Integration -** plug-in the right for the Qt/Eclipse Integration to link to -** functionality provided by Qt Designer and its related libraries. -** -** Trolltech reserves all rights not expressly granted herein. -** -** 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: LGPL-2.0-only -** -****************************************************************************/ - -#ifndef COLORLISTEDITOR_H -#define COLORLISTEDITOR_H - -#include - -class QColor; -class QWidget; - -class ColorListEditor : public QComboBox -{ - Q_OBJECT - Q_PROPERTY(QColor color READ color WRITE setColor USER true) - -public: - ColorListEditor(QWidget *widget = 0); - -public: - QColor color() const; - void setColor(QColor c); - -private: - void populateList(); -}; - -#endif diff --git a/Surface_mesher/demo/Surface_mesher/get_polyhedral_surface.h b/Surface_mesher/demo/Surface_mesher/get_polyhedral_surface.h deleted file mode 100644 index 51ebed3272d..00000000000 --- a/Surface_mesher/demo/Surface_mesher/get_polyhedral_surface.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _GET_POLYHEDRAL_SURFACE_H -#define _GET_POLYHEDRAL_SURFACE_H - -#include "surface.h" - -Surface* get_polyhedral_surface(QObject*, double, double); - -#endif // _GET_POLYHEDRAL_SURFACE_H diff --git a/Surface_mesher/demo/Surface_mesher/icons/bbox-red.png b/Surface_mesher/demo/Surface_mesher/icons/bbox-red.png deleted file mode 100644 index 0da5c8fdde3..00000000000 Binary files a/Surface_mesher/demo/Surface_mesher/icons/bbox-red.png and /dev/null differ diff --git a/Surface_mesher/demo/Surface_mesher/icons/bbox-red.svg b/Surface_mesher/demo/Surface_mesher/icons/bbox-red.svg deleted file mode 100644 index 25be024f77e..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/bbox-red.svg +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/icons/bbox.png b/Surface_mesher/demo/Surface_mesher/icons/bbox.png deleted file mode 100644 index 28c0d50c6b3..00000000000 Binary files a/Surface_mesher/demo/Surface_mesher/icons/bbox.png and /dev/null differ diff --git a/Surface_mesher/demo/Surface_mesher/icons/bbox.svg b/Surface_mesher/demo/Surface_mesher/icons/bbox.svg deleted file mode 100644 index e23b746c510..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/bbox.svg +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/icons/cgal_logo.xpm b/Surface_mesher/demo/Surface_mesher/icons/cgal_logo.xpm deleted file mode 100644 index 6a69b3d67e1..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/cgal_logo.xpm +++ /dev/null @@ -1,24 +0,0 @@ -/* XPM */ -const char * demoicon_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 3 1", -" c None", -". c #FFFF00", -"+ c #000000", -/* pixels */ -"................", -"...++++...++++..", -"..+....+.+....+.", -"..+......+......", -"..+......+..+++.", -"..+......+....+.", -"..+....+.+....+.", -"...++++...++++..", -"................", -"...++++...+.....", -"..+....+..+.....", -"..+....+..+.....", -"..++++++..+.....", -"..+....+..+.....", -"..+....+..+++++.", -"................"}; diff --git a/Surface_mesher/demo/Surface_mesher/icons/fileopen.png b/Surface_mesher/demo/Surface_mesher/icons/fileopen.png deleted file mode 100644 index 82b79b7242b..00000000000 Binary files a/Surface_mesher/demo/Surface_mesher/icons/fileopen.png and /dev/null differ diff --git a/Surface_mesher/demo/Surface_mesher/icons/filesave.png b/Surface_mesher/demo/Surface_mesher/icons/filesave.png deleted file mode 100644 index 0c5a242bc58..00000000000 Binary files a/Surface_mesher/demo/Surface_mesher/icons/filesave.png and /dev/null differ diff --git a/Surface_mesher/demo/Surface_mesher/icons/flip.png b/Surface_mesher/demo/Surface_mesher/icons/flip.png deleted file mode 100644 index 3d28392a0f5..00000000000 Binary files a/Surface_mesher/demo/Surface_mesher/icons/flip.png and /dev/null differ diff --git a/Surface_mesher/demo/Surface_mesher/icons/flip.svg b/Surface_mesher/demo/Surface_mesher/icons/flip.svg deleted file mode 100644 index 293e82fc3a7..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/flip.svg +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - Go Next - - - go - next - right - arrow - pointer - > - - - - - - - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/icons/minus.png b/Surface_mesher/demo/Surface_mesher/icons/minus.png deleted file mode 100644 index d6f233d7399..00000000000 Binary files a/Surface_mesher/demo/Surface_mesher/icons/minus.png and /dev/null differ diff --git a/Surface_mesher/demo/Surface_mesher/icons/plus.png b/Surface_mesher/demo/Surface_mesher/icons/plus.png deleted file mode 100644 index 40df1134f84..00000000000 Binary files a/Surface_mesher/demo/Surface_mesher/icons/plus.png and /dev/null differ diff --git a/Surface_mesher/demo/Surface_mesher/icons/resize.png b/Surface_mesher/demo/Surface_mesher/icons/resize.png deleted file mode 100644 index b3d930f1d7b..00000000000 Binary files a/Surface_mesher/demo/Surface_mesher/icons/resize.png and /dev/null differ diff --git a/Surface_mesher/demo/Surface_mesher/icons/resize.svg b/Surface_mesher/demo/Surface_mesher/icons/resize.svg deleted file mode 100644 index ed30359a802..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/resize.svg +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/icons/surface.png b/Surface_mesher/demo/Surface_mesher/icons/surface.png deleted file mode 100644 index e3585c5d816..00000000000 Binary files a/Surface_mesher/demo/Surface_mesher/icons/surface.png and /dev/null differ diff --git a/Surface_mesher/demo/Surface_mesher/icons/surface.svg b/Surface_mesher/demo/Surface_mesher/icons/surface.svg deleted file mode 100644 index b3ce5b253a7..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/surface.svg +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/icons/twosides.png b/Surface_mesher/demo/Surface_mesher/icons/twosides.png deleted file mode 100644 index a2da1eb1b39..00000000000 Binary files a/Surface_mesher/demo/Surface_mesher/icons/twosides.png and /dev/null differ diff --git a/Surface_mesher/demo/Surface_mesher/icons/twosides.svg b/Surface_mesher/demo/Surface_mesher/icons/twosides.svg deleted file mode 100644 index e1effe1d026..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/twosides.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - Go Next - - - go - next - right - arrow - pointer - > - - - - - - - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/mainwindow.cpp b/Surface_mesher/demo/Surface_mesher/mainwindow.cpp deleted file mode 100644 index ebb1260a693..00000000000 --- a/Surface_mesher/demo/Surface_mesher/mainwindow.cpp +++ /dev/null @@ -1,179 +0,0 @@ -#include "mainwindow.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include // std::max -#include // std::sqrt -#include - -#include "ui_mainwindow.h" -#include "volume.h" -#ifndef CGAL_DO_NOT_USE_POLYHEDRAL_SURFACE -# include "polyhedral_surface.h" -#endif - -MainWindow::MainWindow(MainWindow* other_window /* = 0 */) : - CGAL::Qt::DemosMainWindow(), - surface(0) -{ - setupUi(this); - setAcceptDrops(true); - - if(other_window != 0) - { - viewer->setCamera(other_window->viewer->camera()); - connect(other_window, SIGNAL(destroyed()), - this, SLOT(close())); - } - - this->addAboutCGAL(); - this->addRecentFiles(this->menu_File, - this->action_Quit); - connect(this, SIGNAL(openRecentFile(QString)), - this, SLOT(surface_open(QString))); - - this->readState(); - - show_only(""); -} - -void MainWindow::dragEnterEvent(QDragEnterEvent *event) -{ - if (event->mimeData()->hasFormat("text/uri-list")) - event->acceptProposedAction(); -} - -void MainWindow::dropEvent(QDropEvent *event) -{ - QString filename = event->mimeData()->urls().at(0).toLocalFile(); - surface_open(filename); - event->acceptProposedAction(); -} - -void MainWindow::surface_open(const QString& filename) -{ - if(surface != 0) { - delete surface; - surface = 0; - } -#ifndef CGAL_DO_NOT_USE_POLYHEDRAL_SURFACE - surface = new Polyhedral_surface(this); - if(surface->open(filename)) { - this->addToRecentFiles(filename); - return; - } - delete surface; - surface = 0; -#endif - surface = new Volume(this); - if(surface->open(filename)) { - this->addToRecentFiles(filename); - } -} - -void MainWindow::show_only(QString tag) -{ -#if 0 - QTextStream err(stderr); -#else - QString dummy; - QTextStream err(&dummy); -#endif - err << "** Show only in \"" << tag << "\"\n"; - Q_FOREACH(QObject* object, - this->findChildren()) - { - QStringList show_only_in = object->property("show_only_in").toStringList(); - if(!show_only_in.isEmpty()) - { - err << object->metaObject()->className() - << " \"" << object->objectName() << "\" only in: "; - Q_FOREACH(QString s, show_only_in) - err << s << " "; - const bool visible = show_only_in.contains(tag); - err << (visible ? "(enabled)\n" : "(disabled)\n"); - if(QMenu* menu = qobject_cast(object)) { - menu->menuAction()->setVisible(visible); - } - else { - object->setProperty("visible", QVariant::fromValue(visible)); - } - } - } -} - -void MainWindow::on_action_Open_triggered() -{ - QSettings settings; - QString directory = settings.value("Open directory", - QDir::current().dirName()).toString(); - QString filename = QFileDialog::getOpenFileName(this, tr("Open File"), - directory, - tr("all Files (*.*)")); - if(!filename.isEmpty()) { - QFileInfo fileinfo(filename); - if(fileinfo.isFile() && fileinfo.isReadable()) { - settings.setValue("Open directory", - fileinfo.absoluteDir().absolutePath()); - surface_open(filename); - } - } -} - -void MainWindow::on_action_OpenDirectory_triggered() -{ - QSettings settings; - QString start_dir = settings.value("Open directory", - QDir::current().dirName()).toString(); - QString dir = - QFileDialog::getExistingDirectory(this, - tr("Open directory"), - start_dir, - QFileDialog::ShowDirsOnly - | QFileDialog::DontResolveSymlinks); - - if (!dir.isEmpty()) { - QFileInfo fileinfo(dir); - if (fileinfo.isDir() && fileinfo.isReadable()) - { - settings.setValue("Open directory", - fileinfo.absoluteDir().absolutePath()); - surface_open(dir); - } - } -} - -void MainWindow::on_action_Quit_triggered() -{ - this->writeState(); - qApp->exit(); -} - -void MainWindow::closeEvent(QCloseEvent *event) -{ - this->writeState(); - event->accept(); -} - -void MainWindow::on_action_Clone_triggered() -{ - MainWindow* other = new MainWindow(this); - other->show(); -} - diff --git a/Surface_mesher/demo/Surface_mesher/mainwindow.h b/Surface_mesher/demo/Surface_mesher/mainwindow.h deleted file mode 100644 index 36aa2db2138..00000000000 --- a/Surface_mesher/demo/Surface_mesher/mainwindow.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _MAINWINDOW_H -#define _MAINWINDOW_H - -#include -#include "ui_mainwindow.h" -#include - -class QDragEnterEvent; -class QDropEvent; -class Surface; -class QDoubleSpinBox; -class QCloseEvent; - -namespace CGAL{ -class QGLViewer; -} - -class MainWindow : public CGAL::Qt::DemosMainWindow, public Ui::MainWindow -{ - Q_OBJECT -public: - MainWindow(MainWindow* other_window = 0); - void dragEnterEvent(QDragEnterEvent *); - void dropEvent(QDropEvent *event); - -public Q_SLOTS: - void show_only(QString); - void surface_open(const QString& filename); - -private Q_SLOTS: - void on_action_Open_triggered(); - void on_action_OpenDirectory_triggered(); - void on_action_Quit_triggered(); - void on_action_Clone_triggered(); - -private: - void closeEvent(QCloseEvent *event); - Surface* surface; -}; - - -#endif // _MAINWINDOW_H diff --git a/Surface_mesher/demo/Surface_mesher/polyhedral_surface.cpp b/Surface_mesher/demo/Surface_mesher/polyhedral_surface.cpp deleted file mode 100644 index 2ac24c2b2c4..00000000000 --- a/Surface_mesher/demo/Surface_mesher/polyhedral_surface.cpp +++ /dev/null @@ -1,407 +0,0 @@ -#include "polyhedral_surface.h" -#include "get_polyhedral_surface.h" - -#include -#include -#include -#include -#include -#include -#include "ui_optionsdialog.h" -#include -#include -#include -#include -#include "mainwindow.h" - -typedef CGAL_polyhedral_surface::Polyhedron Polyhedron; - -Polyhedral_surface::Polyhedral_surface(QObject* parent, - double sharp_edges_angle_lower_bound, - double sharp_edges_angle_upper_bound) - : Surface(parent), - m_inverse_normals(false), - surface_ptr(0), - parent(parent), - display_octree(false), - display_edges_octree(false), - display_surface(true), - display_all_edges(true), - display_control_edges(false), - sharp_edges_angle_lower_bound(sharp_edges_angle_lower_bound), - sharp_edges_angle_upper_bound(sharp_edges_angle_upper_bound), - is_octree_initialized(false), - selected_edge(-1), - selected_facet(-1), - is_dirty(true), - list_id(0) -{ - connection_map["actionDisplay_octree"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(toggle_display_octree(bool))); - - connection_map["actionDisplay_edges_octree"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(toggle_display_edges_octree(bool))); - - connection_map["actionDisplay_surface"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(toggle_display_surface(bool))); - - connection_map["actionDisplay_all_edges"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(toggle_display_all_edges(bool))); - - connection_map["actionDisplay_control_edges"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(toggle_display_control_edges(bool))); - - connection_map["actionInverse_normals"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(set_inverse_normals(bool))); - - connection_map["actionSubdivision"] = - std::make_pair(SIGNAL(triggered()), - SLOT(make_one_subdivision_step())); - connection_map["action_Options"] = - std::make_pair(SIGNAL(triggered()), - SLOT(on_action_Options_triggered())); -} - -Polyhedral_surface::~Polyhedral_surface() -{ - clear(); - delete surface_ptr; -} - -void Polyhedral_surface::on_action_Options_triggered() -{ - QDialog *options_dialog = new QDialog(qobject_cast(parent)); - Ui::OptionDialog ui; - ui.setupUi(options_dialog); - - QDoubleSpinBox* sb_upper = options_dialog->findChild("angle_upper_bound"); - QDoubleSpinBox* sb_lower = options_dialog->findChild("angle_lower_bound"); - - if(!sb_lower || !sb_upper) - return; - - sb_lower->setValue(sharp_edges_angle_lower_bound); - sb_upper->setValue(sharp_edges_angle_upper_bound); - if(options_dialog->exec() == QDialog::Accepted) - { - sharp_edges_angle_upper_bound = sb_upper->value(); - sharp_edges_angle_lower_bound = sb_lower->value(); - set_sharp_edges_angle_bounds(sharp_edges_angle_lower_bound, - sharp_edges_angle_upper_bound); - } -} - -void Polyhedral_surface::clear() { - for(Connection_map::const_iterator - it = connection_map.begin(), - end = connection_map.end(); - it != end; - ++it) - { - QAction* action = parent->findChild(it->first); - action->setVisible(false); - } -} - -void Polyhedral_surface::connect_actions() -{ - for(Connection_map::const_iterator - it = connection_map.begin(), - end = connection_map.end(); - it != end; - ++it) - { - QAction* action = parent->findChild(it->first); - action->setVisible(true); - if(action) - connect(action, it->second.first, - this, it->second.second); - } - MainWindow* mw = qobject_cast(parent); - if(mw) { -// mw->fix_menus_visibility(); - mw->show_only("polyhedral"); - } - - - connect(this, SIGNAL(changed()), this, SLOT(display_nb_elements_in_status_bar())); -} - -void Polyhedral_surface::display_nb_elements_in_status_bar() const -{ - QMainWindow* mw = qobject_cast(parent); - if(surface_ptr && mw) - { - mw->statusBar()->showMessage(QString("%1 vertices. %2 edges. %3 facets.") - .arg(surface_ptr->size_of_vertices()) - .arg(surface_ptr->size_of_halfedges()/2) - .arg(surface_ptr->size_of_facets())); - } -} - -void Polyhedral_surface::set_dirty() -{ - is_dirty = true; - Q_EMIT changed(); -} - -void Polyhedral_surface::busy() const -{ - QMainWindow* mw = qobject_cast(parent); - if(mw) - { - mw->statusBar()->showMessage(QString("Constructing octree...")); - } - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); -} - -void Polyhedral_surface::not_busy() const -{ - QApplication::restoreOverrideCursor(); - QMainWindow* mw = qobject_cast(parent); - if(mw) - { - mw->statusBar()->clearMessage(); - } -} - -void Polyhedral_surface::set_sharp_edges_angle_bounds(const double lower_bound, - const double upper_bound) -{ - sharp_edges_angle_lower_bound = lower_bound; - sharp_edges_angle_upper_bound = upper_bound; - if(surface_ptr) { - surface_ptr->set_sharp_edges_angle_bounds(lower_bound, upper_bound); - surface_ptr->set_sharp_vertices_angle_bounds(lower_bound, upper_bound); - update_data_structures(); - Q_EMIT set_dirty(); - } -} - -void Polyhedral_surface::update_data_structures() -{ - surface_ptr->compute_sharp_edges_incidence_graph(); - if(display_octree || display_edges_octree) { - construct_octree(); - is_octree_initialized = true; - } - else - is_octree_initialized = false; -} - -void Polyhedral_surface::construct_octree() -{ - busy(); - surface_ptr->construct_octree(); - not_busy(); -} - -void Polyhedral_surface::toggle_display_octree(bool b) -{ - if(surface_ptr && b && !is_octree_initialized) { - is_octree_initialized = true; - construct_octree(); - } - display_octree = b; - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::toggle_display_edges_octree(bool b) -{ - if(surface_ptr && b && !is_octree_initialized) { - is_octree_initialized = true; - construct_octree(); - } - display_edges_octree = b; - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::toggle_display_surface(bool b) -{ - display_surface = b; - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::toggle_display_all_edges(bool b) -{ - display_all_edges = b; - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::toggle_display_control_edges(bool b) -{ - display_control_edges = b; - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::make_one_subdivision_step() -{ - if(surface_ptr) - { - Polyhedron output; - CSubdivider_loop pw_loop_subdiviser; - - pw_loop_subdiviser.subdivide(*surface_ptr, output); - static_cast(*surface_ptr) = output; - surface_ptr->compute_normals(); - surface_ptr->compute_type(); - update_data_structures(); - Q_EMIT set_dirty(); - } -} - -bool Polyhedral_surface::open(const QString& filename) -{ - clear(); - - std::cerr << "Opening file \"" << qPrintable(filename) << "\"..."; - std::ifstream in(filename.toUtf8()); - if(!in) return false; - - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - - if(surface_ptr) - delete surface_ptr; - surface_ptr = new CGAL_polyhedral_surface(in, - sharp_edges_angle_lower_bound, - sharp_edges_angle_upper_bound, - false /*do not construct - octree*/); - if(!in) { - QApplication::restoreOverrideCursor(); - return false; - } - is_octree_initialized = false; - selected_facet = selected_edge = -1; - update_data_structures(); - - connect_actions(); - std::cerr << " Done.\n"; - QApplication::restoreOverrideCursor(); - float xmin, ymin, zmin, xmax, ymax, zmax; - get_bbox(xmin, ymin, zmin, xmax, ymax, zmax); - const float xcenter = (xmin + xmax) / 2; - const float ycenter = (ymin + ymax) / 2; - const float zcenter = (zmin + zmax) / 2; - const float xdelta = (-xmin + xmax); - const float ydelta = (-ymin + ymax); - const float zdelta = (-zmin + zmax); -// const float radius = std::max(std::max(xdelta, ydelta), zdelta) * std::sqrt(3.)/ 2.; - std::cerr << boost::format("Bounding box: xmin=%1%, ymin=%2%, zmin=%3%\n" - " xmax=%4%, ymax=%5%, zmax=%6%\n" - " center=(%7%, %8%, %9%)\n") - % xmin % ymin % zmin % xmax % ymax % zmax - % xcenter % ycenter % zcenter - << boost::format(" span=(%1%,%2%,%3%)\n") - % xdelta % ydelta % zdelta; - viewer->camera()->setSceneBoundingBox(CGAL::qglviewer::Vec(xmin, ymin, zmin), - CGAL::qglviewer::Vec(xmax, ymax, zmax)); - viewer->setBackgroundColor(Qt::white); - viewer->showEntireScene(); - - QAction* actionInverse_normals = qFindChild(this, "actionInverse_normals"); - if(actionInverse_normals) actionInverse_normals->setChecked(false); - Q_EMIT set_dirty(); - return true; -} - -void Polyhedral_surface::close() -{ - delete surface_ptr; - surface_ptr = 0; -} - -void Polyhedral_surface::draw() { - draw(false); -} - -void Polyhedral_surface::drawWithNames() { - draw(true); -} - -void Polyhedral_surface::postSelection(const QPoint&) -{ - if(!surface_ptr) return; - - selected_facet = selected_edge = -1; - - const int nb_vertices = surface_ptr->incidence_graph.vertices.size(); - const int nb_edges = surface_ptr->incidence_graph.edges.size(); - if(viewer->selectedName() >= nb_edges + nb_vertices) - selected_facet = viewer->selectedName() - nb_edges - nb_vertices; - else if(viewer->selectedName() >= nb_vertices) - selected_edge = viewer->selectedName() - nb_vertices; - - std::cerr << boost::format("post-selection.\n" - "selectedName()=%1%\n" - "selected edge=%2%\n" - "selected facet=%3%\n") - % viewer->selectedName() % selected_edge % selected_facet; - - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::draw(bool with_names) -{ - if(!list_id) - { - std::cerr << "Generating OpenGL display list ID: "; - std::cerr << (list_id = ::glGenLists(1)) << "\n"; - } - if(!with_names) - { - if(is_dirty) - ::glNewList(list_id, GL_COMPILE_AND_EXECUTE); - else if(::glIsList(list_id)) - { - ::glCallList(list_id); - return; - } - else - std::cerr << "Call list (" << list_id << ")failed.\n"; - } -} -void Polyhedral_surface::get_bbox(float& xmin, float& ymin, float& zmin, - float& xmax, float& ymax, float& zmax) -{ - if(surface_ptr) { - xmin=surface_ptr->bbox().xmin(); - ymin=surface_ptr->bbox().ymin(); - ymin=surface_ptr->bbox().zmin(); - xmax=surface_ptr->bbox().xmax(); - ymax=surface_ptr->bbox().ymax(); - zmax=surface_ptr->bbox().zmax(); - } - else - { - xmin = ymin = zmin = 0.f; - xmax = ymax = zmax = 1.f; - } -} - -void Polyhedral_surface::set_inverse_normals(const bool b) { - m_inverse_normals = b; - set_dirty(); -} - -bool Polyhedral_surface::inverse_normals() const { - return m_inverse_normals; -} - - -Surface* get_polyhedral_surface(QObject* parent, - double sharp_edges_angle_lower_bound, - double sharp_edges_angle_upper_bound = 180.) -{ - return new Polyhedral_surface(parent, - sharp_edges_angle_lower_bound, - sharp_edges_angle_upper_bound); -} - -#include "polyhedral_surface.moc" diff --git a/Surface_mesher/demo/Surface_mesher/polyhedral_surface.h b/Surface_mesher/demo/Surface_mesher/polyhedral_surface.h deleted file mode 100644 index 001eaee5fd6..00000000000 --- a/Surface_mesher/demo/Surface_mesher/polyhedral_surface.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef _POLYHEDRAL_SURFACE_H -#define _POLYHEDRAL_SURFACE_H - -#define CGAL_SURFACE_MESHER_DEBUG_POLYHEDRAL_SURFACE_CONSTRUCTION - -#include "surface.h" -#include "viewer.h" - -#include -#include - -typedef std::pair Signal_slot_pair; -typedef std::map Connection_map; - -// CGAL -#include - -// kernel -#include - -// surface -#include - -// piece-wise loop subdivision -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel Poly_kernel; -typedef Poly_kernel::FT FT; -typedef Poly_kernel::Point_3 Poly_point; -typedef Poly_kernel::Sphere_3 Sphere; -typedef Poly_kernel::Vector_3 Vector; -typedef Poly_kernel::Triangle_3 Triangle_3; - -typedef CGAL::Polyhedral_surface_3 CGAL_polyhedral_surface; - - -class Polyhedral_surface : public Surface -{ - Q_OBJECT; - -public: - Polyhedral_surface(QObject* parent, - double sharp_edges_angle_lower_bound = 90, - double sharp_edges_angle_upper_bound = 120); - - ~Polyhedral_surface(); -public Q_SLOTS: - void clear(); - void connect_actions(); - void display_nb_elements_in_status_bar() const; - void set_dirty(); - void busy() const; - void not_busy() const; - void set_sharp_edges_angle_bounds(const double lower_bound, - const double upper_bound); - void update_data_structures(); - void construct_octree(); - void toggle_display_octree(bool b); - void toggle_display_edges_octree(bool b); - void toggle_display_surface(bool b); - void toggle_display_all_edges(bool b); - void toggle_display_control_edges(bool b); - void make_one_subdivision_step(); - void on_action_Options_triggered(); - -public: - bool open(const QString& filename); - void close(); - void draw(); - void drawWithNames(); - void postSelection(const QPoint&); - void draw(bool with_names); - void get_bbox(float& xmin, float& ymin, float& zmin, - float& xmax, float& ymax, float& zmax); - -public Q_SLOTS: - void set_inverse_normals(const bool b); - -public: - bool inverse_normals() const; - -protected: - bool m_inverse_normals; - CGAL_polyhedral_surface* surface_ptr; - QObject* parent; - bool display_octree; - bool display_edges_octree; - bool display_surface; - bool display_all_edges; - bool display_control_edges; - double sharp_edges_angle_lower_bound; - double sharp_edges_angle_upper_bound; - bool is_octree_initialized; - int selected_edge; - int selected_facet; - bool is_dirty; - GLint list_id; - Connection_map connection_map; -}; - -#endif // _POLYHEDRAL_SURFACE_H diff --git a/Surface_mesher/demo/Surface_mesher/surface.h b/Surface_mesher/demo/Surface_mesher/surface.h deleted file mode 100644 index 62e4b597a24..00000000000 --- a/Surface_mesher/demo/Surface_mesher/surface.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _SURFACE_H -#define _SURFACE_H - -#include -#include -#include - -#include "viewer.h" - -class Surface : public QObject -{ - Q_OBJECT -protected: - Surface(QObject* parent) - { - viewer = parent->findChild("viewer"); - - if(viewer) - connect(this, SIGNAL(changed()), viewer, SLOT(updateGL())); - viewer->set_surface(this); - } -public Q_SLOTS: - virtual bool open(const QString& filename) = 0; - virtual void close() = 0; - virtual void draw() = 0; - virtual void get_bbox(float&, float&, float&, - float&, float&, float&) = 0; - virtual void drawWithNames() {}; - virtual void postSelection(const QPoint&) {}; -Q_SIGNALS: - void changed(); - -protected: - Viewer* viewer; -}; - -#endif // _SURFACE_H diff --git a/Surface_mesher/demo/Surface_mesher/surface_mesher.qrc b/Surface_mesher/demo/Surface_mesher/surface_mesher.qrc deleted file mode 100644 index 9592cad50a0..00000000000 --- a/Surface_mesher/demo/Surface_mesher/surface_mesher.qrc +++ /dev/null @@ -1,13 +0,0 @@ - - - icons/bbox-red.png - icons/bbox.png - icons/cgal_logo.xpm - icons/fileopen.png - icons/filesave.png - icons/flip.png - icons/resize.png - icons/surface.png - icons/twosides.png - - diff --git a/Surface_mesher/demo/Surface_mesher/ui/mainwindow.ui b/Surface_mesher/demo/Surface_mesher/ui/mainwindow.ui deleted file mode 100644 index 65b8a528fa8..00000000000 --- a/Surface_mesher/demo/Surface_mesher/ui/mainwindow.ui +++ /dev/null @@ -1,808 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 1147 - 648 - - - - CGAL Surface mesh generator - - - - :/icons/cgal_logo.xpm:/icons/cgal_logo.xpm - - - true - - - - - - - - 1 - 0 - - - - - - - - - - 0 - 0 - 1147 - 21 - - - - - &File - - - - - - - - - - - &Options - - - - volume - polyhedral - - - - - - - - - - - - - - - - - - - &Edit - - - - polyhedral - - - - - - - - - - - - Actions toolbar - - - Qt::AllToolBarAreas - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - - true - - - Meshing toolbar - - - - volume - - - - TopToolBarArea - - - false - - - - - - - Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea - - - Images options - - - - volume - - - - 1 - - - - - - - - - - 0 - 0 - - - - &Image type - - - - volume - - - - - - - - 0 - 0 - - - - Grayscale image - - - true - - - - - - - - 0 - 0 - - - - Segmented image - - - - - - - - - - &Operations - - - - - - Trilinear interpolation - - - true - - - - - - - Search for seeds - - - true - - - - - - - - - - - 0 - 0 - - - - C&riteria - - - - volume - - - - - - - Manifold - - - - - - - Facets vertices have same index - - - - - - - - - &Sizing bound: - - - spinBox_radius_bound - - - - - - - 5 - - - 9999.989999999999782 - - - - - - - &Distance bound: - - - spinBox_distance_bound - - - - - - - 5 - - - 9999.989999999999782 - - - - - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 0 - - - - - - - - - - - 0 - 0 - - - - Image sub-domaines - - - - volume - - - - 1 - - - - - 10 - 10 - - - - - - - - 0 - 5 - - - - - volume - - - - - - - - - - - :/icons/fileopen.png:/icons/fileopen.png - - - &Open... - - - Ctrl+O - - - - - &Quit - - - Ctrl+Q - - - QAction::QuitRole - - - - - true - - - - :/icons/flip.png:/icons/flip.png - - - &Inverse normals - - - Flip - - - Ctrl+I - - - - volume - polyhedral - - - - - - true - - - - :/icons/bbox.png:/icons/bbox.png - - - Display oc&tree - - - Ctrl+T - - - - polyhedral - - - - - - true - - - true - - - - :/icons/surface.png:/icons/surface.png - - - Display &surface - - - - polyhedral - - - - - - &Options... - - - - polyhedral - - - - - - Piecewise-smooth &subdivision - - - Ctrl+S - - - - polyhedral - - - - - - true - - - true - - - Display &all edges - - - Ctrl+A - - - - polyhedral - - - - - - true - - - false - - - Display &control edges - - - Ctrl+C - - - - polyhedral - - - - - - true - - - - :/icons/bbox-red.png:/icons/bbox-red.png - - - Display edges octree - - - - polyhedral - - - - - - Marching &cubes - - - Marching &cubes - - - - volume - - - - - - Surface &mesher - - - Surface &mesher - - - - volume - - - - - - true - - - true - - - - :/icons/twosides.png:/icons/twosides.png - - - Display facets with &front and back - - - Two-sides - - - Ctrl+F - - - - volume - polyhedral - - - - - - Clone - - - - - true - - - false - - - - :/icons/resize.png:/icons/resize.png - - - Auto-&resize - - - Auto-&resize - - - Automaticaly zoom in or out when the object change. - - - Ctrl+S - - - - volume - polyhedral - - - - - - true - - - true - - - Draw triangles &edges - - - Draw triangles &edges - - - Ctrl+E - - - - volume - - - - - - true - - - false - - - Use &Gouraud shading (marching cube only) - - - Use &Gouraud shading - - - Use Gouraud shading to display the marching cubes. - - - Ctrl+G - - - - volume - - - - - - true - - - Show the whole &triangulation (surface mesher only) - - - Ctrl+T - - - - volume - - - - - - Choose the triangulation edges &color... - - - - volume - - - - - - - :/icons/filesave.png:/icons/filesave.png - - - Export surface mesh to OFF... - - - - volume - - - - - - true - - - true - - - - :/icons/bbox.png:/icons/bbox.png - - - Show the image &bounding box - - - Ctrl+B - - - - volume - - - - - - - :/icons/filesave.png:/icons/filesave.png - - - Save the image as Inrimage... - - - - - - :/icons/fileopen.png:/icons/fileopen.png - - - Open directory... - - - - - - Values_list - QWidget -

    values_list.h
    - 1 - - - Viewer - QWidget -
    viewer.h
    -
    - - - viewer - grayLevelRadioButton - labellizedRadioButton - manifoldCheckBox - sameIndexCheckBox - spinBox_radius_bound - spinBox_distance_bound - - - - - - - labellizedRadioButton - toggled(bool) - sameIndexCheckBox - setDisabled(bool) - - - 130 - 172 - - - 139 - 414 - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/ui/optionsdialog.ui b/Surface_mesher/demo/Surface_mesher/ui/optionsdialog.ui deleted file mode 100644 index 2ea13d120e1..00000000000 --- a/Surface_mesher/demo/Surface_mesher/ui/optionsdialog.ui +++ /dev/null @@ -1,128 +0,0 @@ - - OptionDialog - - - - 0 - 0 - 210 - 167 - - - - Set options - - - :/icons/cgal_logo.xpm - - - - - - Sharp edges angle bounds - - - - - - - - &Lower bound - - - angle_lower_bound - - - - - - - 180.000000000000000 - - - - - - - &Upper bound - - - angle_upper_bound - - - - - - - 180.000000000000000 - - - - - - - - - - - - Qt::Vertical - - - - 20 - 0 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok - - - - - - - - - - - buttonBox - accepted() - OptionDialog - accept() - - - 227 - 215 - - - 157 - 90 - - - - - buttonBox - rejected() - OptionDialog - reject() - - - 243 - 221 - - - 252 - 90 - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/ui/raw_image.ui b/Surface_mesher/demo/Surface_mesher/ui/raw_image.ui deleted file mode 100644 index e270d1de917..00000000000 --- a/Surface_mesher/demo/Surface_mesher/ui/raw_image.ui +++ /dev/null @@ -1,454 +0,0 @@ - - Raw_image_dialog - - - - 0 - 0 - 585 - 342 - - - - Open raw image - - - - - - Image &value type - - - - - - Short (16 bits) - - - - - - - Float - - - - - - - Int (32 bits) - - - - - - - Double - - - - - - - Signed - - - - - - - char (8 bits) - - - - - - - - - - Image dimensions - - - - - - - - &Dimensions: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - dim_x - - - - - - - &Spacing: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - spacing_x - - - - - - - x: - - - 100000000 - - - - - - - y: - - - 100000000 - - - - - - - z: - - - 100000000 - - - - - - - vx: - - - 5 - - - 1.000000000000000 - - - - - - - vy: - - - 5 - - - 1.000000000000000 - - - - - - - vz: - - - 5 - - - 1.000000000000000 - - - - - - - &Offset: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - offset - - - - - - - bytes - - - 999999999 - - - - - - - Image size: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - 0 - - - - - - - File size: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - 0 - - - - - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Open - - - - - - - int_bt - short_bt - signed_bt - float_bt - double_bt - dim_x - dim_y - dim_z - spacing_x - spacing_y - spacing_z - offset - buttonBox - - - - - float_bt - toggled(bool) - signed_bt - setDisabled(bool) - - - 47 - 112 - - - 553 - 94 - - - - - double_bt - toggled(bool) - signed_bt - setDisabled(bool) - - - 564 - 127 - - - 564 - 94 - - - - - buttonBox - accepted() - Raw_image_dialog - accept() - - - 191 - 316 - - - 183 - 313 - - - - - buttonBox - rejected() - Raw_image_dialog - reject() - - - 253 - 319 - - - 252 - 312 - - - - - dim_x - valueChanged(int) - Raw_image_dialog - update_image_size() - - - 178 - 187 - - - 99 - 141 - - - - - dim_z - valueChanged(int) - Raw_image_dialog - update_image_size() - - - 473 - 178 - - - 441 - 142 - - - - - char_bt - clicked() - Raw_image_dialog - update_image_size() - - - 71 - 52 - - - 137 - 3 - - - - - short_bt - clicked() - Raw_image_dialog - update_image_size() - - - 117 - 81 - - - 49 - 6 - - - - - float_bt - clicked() - Raw_image_dialog - update_image_size() - - - 137 - 111 - - - 67 - -5 - - - - - int_bt - clicked() - Raw_image_dialog - update_image_size() - - - 358 - 49 - - - 584 - 52 - - - - - dim_y - valueChanged(int) - Raw_image_dialog - update_image_size() - - - 332 - 186 - - - 271 - 142 - - - - - double_bt - clicked() - Raw_image_dialog - update_image_size() - - - 514 - 119 - - - 581 - 116 - - - - - - update_image_size() - - diff --git a/Surface_mesher/demo/Surface_mesher/ui/values_list.ui b/Surface_mesher/demo/Surface_mesher/ui/values_list.ui deleted file mode 100644 index 9e7e4372813..00000000000 --- a/Surface_mesher/demo/Surface_mesher/ui/values_list.ui +++ /dev/null @@ -1,118 +0,0 @@ - - Values_list - - - - 0 - 0 - 429 - 632 - - - - Form - - - - - - QFrame::StyledPanel - - - 1 - - - QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::NoEditTriggers|QAbstractItemView::SelectedClicked - - - true - - - QAbstractItemView::ExtendedSelection - - - 0 - - - false - - - true - - - false - - - true - - - false - - - 3 - - - - Iso-value - - - - - Color - - - - - Name - - - - - - - - - - ... - - - :/values/plus.png - - - - - - - ... - - - :/values/minus.png - - - Del - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/values_list.cpp b/Surface_mesher/demo/Surface_mesher/values_list.cpp deleted file mode 100644 index b2e8a41e86f..00000000000 --- a/Surface_mesher/demo/Surface_mesher/values_list.cpp +++ /dev/null @@ -1,280 +0,0 @@ -#include "values_list.h" -#include "ui_values_list.h" -#include "colorlisteditor.h" -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) -#include -#endif - -Values_delegate::Values_delegate(QWidget* parent) : QItemDelegate(parent) {} -void Values_delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const -{ - switch(index.column()) - { - case Values_list::Color: { - painter->fillRect(option.rect, index.data().value()); - drawFocus(painter, option, option.rect); - break; - } - default: - QItemDelegate::paint(painter, option, index); - } -} - -QWidget *Values_delegate::createEditor(QWidget *parent, - const QStyleOptionViewItem & option, - const QModelIndex & index) const -{ - if(index.column() == Values_list::Color) - { - return new ColorListEditor(parent); - } - else if(index.column() == Values_list::Value) - { - QLineEdit* lineedit = new QLineEdit(parent); - lineedit->setAutoFillBackground(true); - lineedit->setValidator(new QDoubleValidator(lineedit)); - return lineedit; - } - else return QItemDelegate::createEditor(parent, option, index); -} - -void Values_delegate::setEditorData(QWidget *editor, - const QModelIndex &index) const -{ - if(index.column() == Values_list::Color) - { - ColorListEditor* coloreditor = qobject_cast(editor); - if(coloreditor) - coloreditor->setColor(index.data().value()); - } - else if(index.column() == Values_list::Value) - { - QLineEdit* lineedit = qobject_cast(editor); - if(lineedit) - lineedit->setText(index.data().toString()); - } - else QItemDelegate::setEditorData(editor, index); -} -void Values_delegate::setModelData(QWidget *editor, QAbstractItemModel *model, - const QModelIndex &index) const -{ - if(index.column() == Values_list::Color) - { - ColorListEditor* coloreditor = qobject_cast(editor); - if(coloreditor) - { - model->setData(index, coloreditor->color()); - Q_EMIT new_color(index); - } - } - else if(index.column() == Values_list::Value) - { - QLineEdit* lineedit = qobject_cast(editor); - if(lineedit) - { - model->setData(index, lineedit->text().toDouble()); - Q_EMIT new_value(index); - } - } - else QItemDelegate::setModelData(editor, model, index); -} - -const double Values_list::default_value = 0.0; - -Values_list::Values_list(QWidget* parent): - QWidget(parent) -{ - Ui::Values_list().setupUi(this); - - treeWidget = parent->findChild("treeWidget"); - Q_ASSERT_X(treeWidget, "Values_list constructor", "cannot find widget \"treeWidget\""); - - treeWidget->sortByColumn(Value, Qt::AscendingOrder); - - treeWidget->header()->setSectionsClickable(false); - - - Values_delegate* values_delegate = new Values_delegate(parent); - - treeWidget->setItemDelegate(values_delegate); - connect(values_delegate, SIGNAL(new_value(const QModelIndex&)), - this, SIGNAL(values_changed())); - connect(values_delegate, SIGNAL(new_color(const QModelIndex&)), - this, SIGNAL(colors_changed())); - connect(this->treeWidget->model(), - SIGNAL(dataChanged (const QModelIndex &, const QModelIndex &)), - this, SIGNAL(changed())); - - connect(this, SIGNAL(changed()), - this, SLOT(update_items_cache())); -} - -QColor Values_list::color(const int i) const -{ - if(i < 0 || i > treeWidget->topLevelItemCount()) - return QColor(); - else - return treeWidget->topLevelItem(i)->data(Color, Qt::DisplayRole).value(); -} - -QColor Values_list::color(const QTreeWidgetItem* item) const -{ - return item->data(Color, Qt::DisplayRole).value(); -} - -int Values_list::numberOfValues() const -{ - return treeWidget->topLevelItemCount(); -} - -double Values_list::value(const int i) const -{ - if(i < 0 || i > numberOfValues()) - return 0.; - else - return treeWidget->topLevelItem(i)->data(Value, Qt::DisplayRole).toDouble(); -} - -QString Values_list::name(const int i) const -{ - if(i < 0 || i > treeWidget->topLevelItemCount()) - return QString(); - else - return treeWidget->topLevelItem(i)->data(Name, Qt::DisplayRole).toString(); -} - -bool Values_list::enabled(const int i) const -{ - if(i < 0 || i > treeWidget->topLevelItemCount()) - return false; - else - return treeWidget->topLevelItem(i)->data(Value, Qt::CheckStateRole).toInt() > 0; -} - -bool Values_list::enabled(const QTreeWidgetItem* item) const -{ - return item->data(Value, Qt::CheckStateRole).toInt() > 0; -} - -const QTreeWidgetItem* Values_list::item(const int i) const -{ - if(i < 0 || i > treeWidget->topLevelItemCount()) - return 0; - else - return treeWidget->topLevelItem(i); -} - -void Values_list::save_values(QString filename) const -{ - QSettings settings; - - settings.beginGroup(QUrl::toPercentEncoding(filename)); - settings.beginWriteArray("values"); - for (int i = 0; i < numberOfValues(); ++i) { - settings.setArrayIndex(i); - settings.setValue("value", value(i)); - settings.setValue("color", color(i)); - settings.setValue("name", name(i)); - settings.setValue("enabled", enabled(i)); - } - settings.endArray(); - settings.endGroup(); -} - -void Values_list::load_values(QString filename) -{ - QSettings settings; - - treeWidget->clear(); - settings.beginGroup(QUrl::toPercentEncoding(filename)); - int nb = settings.beginReadArray("values"); - for (int i = 0; i < nb; ++i) { - settings.setArrayIndex(i); - QTreeWidgetItem *newItem = new QTreeWidgetItem(treeWidget); - newItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - newItem->setData(Value, Qt::CheckStateRole, settings.value("enabled").toBool() ? Qt::Checked : Qt::Unchecked); - newItem->setData(Value, Qt::DisplayRole, settings.value("value").toDouble()); - newItem->setData(Color, Qt::DisplayRole, settings.value("color").value()); - newItem->setData(Name, Qt::DisplayRole, settings.value("name").toString()); - } - settings.endArray(); - settings.endGroup(); - update_items_cache(); -} - -void Values_list::on_minusButton_clicked() -{ - Q_FOREACH(QTreeWidgetItem* item, treeWidget->selectedItems()) - { - // treeWidget->invisibleRootItem()->removeChild(item); - delete item; - } - Q_EMIT values_changed(); -} - -void Values_list::on_plusButton_clicked() -{ - addValue(); -} - -void Values_list::addValue(const double i) -{ - QTreeWidgetItem *newItem = new QTreeWidgetItem(treeWidget); - newItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - newItem->setData(Value, Qt::CheckStateRole, Qt::Checked); - newItem->setData(Value, Qt::DisplayRole, i); - QStringList colors = QColor::colorNames(); -#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) - const int color_index = qrand() % colors.size(); -#else -const int color_index = QRandomGenerator::global()->generate() % colors.size(); -#endif - - QColor color = QColor(colors[color_index]); - newItem->setData(Color, Qt::DisplayRole, color); - newItem->setData(Name, Qt::DisplayRole, ""); - Q_EMIT values_changed(); -} - -void Values_list::update_items_cache() { - items_cache.clear(); - for(int i = 0, nb = numberOfValues(); i < nb; ++i) { - items_cache.insert(std::make_pair(value(i), item(i))); - } -} - -const QTreeWidgetItem* Values_list::search(const double value) const -{ - Items_cache::const_iterator it = items_cache.find(value); - if(it != items_cache.end()) { - return it->second; - } - else { - return 0; - } -} - -void Values_list::setHeaderTitle(QString title) -{ - treeWidget->headerItem()->setText(0, title); -} - diff --git a/Surface_mesher/demo/Surface_mesher/values_list.h b/Surface_mesher/demo/Surface_mesher/values_list.h deleted file mode 100644 index 03649fea0f0..00000000000 --- a/Surface_mesher/demo/Surface_mesher/values_list.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef _VALUES_LIST_H -#define _VALUES_LIST_H - -#include -#include -#include -#include -#include - -class QTreeWidget; -class QTreeWidgetItem; - -class Values_delegate : public QItemDelegate -{ - Q_OBJECT -public: - Values_delegate(QWidget* parent); - -Q_SIGNALS: - void new_color(const QModelIndex&) const; - void new_value(const QModelIndex&) const; - -protected: - void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const; - QWidget *createEditor(QWidget *parent, - const QStyleOptionViewItem & option, - const QModelIndex & index) const; - void setEditorData(QWidget *editor, - const QModelIndex &index) const; - void setModelData(QWidget *editor, QAbstractItemModel *model, - const QModelIndex &index) const; -}; - -class Values_list : public QWidget -{ - Q_OBJECT -public: - enum Field { Value = 0 , Color = 1, Name = 2}; - Values_list(QWidget* parent); - - // const accessors - int numberOfValues() const; - QColor color(const int i) const; - QColor color(const QTreeWidgetItem* i) const; - double value(const int i) const; - QString name(const int i) const; - bool enabled(const int i) const; - bool enabled(const QTreeWidgetItem* i) const; - const QTreeWidgetItem* item(const int i) const; - const QTreeWidgetItem* search(const double value) const; - -public Q_SLOTS: - void save_values(QString) const; - void load_values(QString); - void on_plusButton_clicked(); - void on_minusButton_clicked(); - - // setters - void addValue(const double v = Values_list::default_value); - - void setHeaderTitle(QString); - -private Q_SLOTS: - void update_items_cache(); - -Q_SIGNALS: - void changed(); - void colors_changed(); - void values_changed(); -private: - QTreeWidget* treeWidget; - typedef std::map Items_cache; - Items_cache items_cache; - - static const double default_value; -}; - -#endif // _VALUES_LIST_H - diff --git a/Surface_mesher/demo/Surface_mesher/values_list.qrc b/Surface_mesher/demo/Surface_mesher/values_list.qrc deleted file mode 100644 index 8a78bb1688a..00000000000 --- a/Surface_mesher/demo/Surface_mesher/values_list.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - icons/minus.png - icons/plus.png - - diff --git a/Surface_mesher/demo/Surface_mesher/viewer.cpp b/Surface_mesher/demo/Surface_mesher/viewer.cpp deleted file mode 100644 index 70d0ebe6cd4..00000000000 --- a/Surface_mesher/demo/Surface_mesher/viewer.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "viewer.h" -#include "surface.h" -#include -#include - -Viewer::Viewer(QWidget* parent) - : CGAL::QGLViewer(parent), surface(0) -{ - // Do not store state in a file - setStateFileName(""); -} - -void Viewer::init() -{ - setBackgroundColor(Qt::white); - glLineStipple(5, 0xaaaa); - glDisable(GL_LINE_STIPPLE); - - // anti-aliasing - glEnable(GL_BLEND); - glEnable(GL_LINE_SMOOTH); - glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -} - -QString Viewer::helpString() const -{ - return "" - "

    Surface mesher demo

    \n" - "

    No help availlable for now.

    "; -} - -void Viewer::interpolateToFitBoundingBox(double xmin, double ymin, double zmin, - double xmax, double ymax, double zmax) -{ - QAction* auto_resize = parent()->parent()->findChild("actionAuto_resize"); - Q_ASSERT_X(auto_resize, "Viewer::interpolateToFitBoundingBox", "cannot find action \"actionAuto_resize\""); - if(auto_resize && auto_resize->isChecked()) - { - CGAL::qglviewer::Camera new_camera = *(camera ()); - new_camera.fitBoundingBox(CGAL::qglviewer::Vec(xmin, ymin, zmin), - CGAL::qglviewer::Vec(xmax, ymax, zmax)); - camera()->interpolateTo(*new_camera.frame(), 1.); - } -} - -void Viewer::draw() -{ - if(surface) - surface->draw(); -} - -void Viewer::drawWithNames() -{ - if(surface) - surface->drawWithNames(); -} -void Viewer::postSelection(const QPoint& p) -{ - if(surface) - surface->postSelection(p); -} - -void Viewer::set_surface(Surface* s) -{ - surface = s; -} - diff --git a/Surface_mesher/demo/Surface_mesher/viewer.h b/Surface_mesher/demo/Surface_mesher/viewer.h deleted file mode 100644 index 8c40a6a6612..00000000000 --- a/Surface_mesher/demo/Surface_mesher/viewer.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _VIEWER_H -#define _VIEWER_H - -#include -#include - -class Surface; - -class Viewer : public CGAL::QGLViewer -{ - Q_OBJECT -public: - Viewer(QWidget* parent); - - void set_surface(Surface*); - -public Q_SLOTS: - void interpolateToFitBoundingBox(double, double, double, double, double, double); - -protected : - virtual void init(); - virtual void draw(); - virtual void drawWithNames(); - virtual void postSelection(const QPoint&); - virtual QString helpString() const; - - Surface* surface; -}; - -#endif // _VIEWER_H diff --git a/Surface_mesher/demo/Surface_mesher/volume.cpp b/Surface_mesher/demo/Surface_mesher/volume.cpp deleted file mode 100644 index 62424155ccd..00000000000 --- a/Surface_mesher/demo/Surface_mesher/volume.cpp +++ /dev/null @@ -1,1613 +0,0 @@ -#include - -#include "volume.h" - -#include // std::sort -#include -#include - -#include - -#include "viewer.h" -#include "mainwindow.h" -#include "values_list.h" - -#include "File_XT.h" // format XT from Total/ELF - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Raw_image_dialog.h" -#include -// #include -#include -#include -#include -#include -#include - -struct Threshold : public CGAL::cpp98::unary_function { - double isovalue; - bool is_identity; - - Threshold(double isovalue) : isovalue(isovalue), is_identity(false) {} - - result_type operator()(FT value) - { - if(is_identity) - return static_cast(value); - else if(value >= isovalue) - return 1; - else - return 0; - } -}; - -class Classify_from_isovalue_list : - public CGAL::cpp98::unary_function -{ - typedef std::pair Isovalue; - typedef std::vector Isovalues; - boost::shared_ptr isovalues; - bool is_identity; - - struct Sort_isovalues : CGAL::cpp98::binary_function - { - bool operator()(const Isovalue& isoval1, const Isovalue& isoval2) - { - return isoval1.first < isoval2.first; - } - }; -public: - Classify_from_isovalue_list(Values_list * list) - : is_identity(false) - { - isovalues = boost::shared_ptr(new Isovalues(list->numberOfValues())); - for(int i = 0, nbs = list->numberOfValues(); i < nbs; ++i ) - (*isovalues)[i] = std::make_pair(list->value(i), i); - std::sort(isovalues->begin(), isovalues->end(), Sort_isovalues()); - } - - void set_identity(bool b) { - is_identity = b; - } - - result_type operator()(FT value) - { - if(is_identity) { - return static_cast(value); - } - result_type result = 0; -// std::cerr << "isovalues: "; - for(result_type i = 1, end = static_cast(isovalues->size()); i <= end; ++i) - { -// std::cerr << (*isovalues)[i-1] << ", "; - if(value >= (*isovalues)[i-1].first && - i >= result) - { - result = i; - } - } -// if(result>1) -// std::cerr << "result = " << (int)result << "/" << list->numberOfValues() << std::endl; -// else -// std::cerr << std::endl; - if(result>0) - return (*isovalues)[result-1].second + 1; - else - return 0; - } -}; - -class Generate_surface_identifiers : - public CGAL::cpp98::binary_function -{ - Values_list* list; - bool labellized; - -public: - Generate_surface_identifiers(Values_list* list) - : list(list), labellized(false) {}; - - void set_labellized_image(bool b) - { - labellized = b; - } - - result_type operator()(const Classify_from_isovalue_list::result_type& a, - const Classify_from_isovalue_list::result_type& b) - { - if(labellized) - return list->search((std::max)(a, b)); - else - return list->item((std::min)(a, b)); - } -}; - -// class Classify_from_isovalue_list : -// public CGAL::cpp98::unary_function -// { -// typedef std::pair Isovalue; -// typedef std::vector Isovalues; -// boost::shared_ptr isovalues; - -// struct Sort_isovalues : CGAL::cpp98::binary_function -// { -// bool operator()(const Isovalue& isoval1, const Isovalue& isoval2) -// { -// return isoval1.first < isoval2.first; -// } -// }; -// public: -// Classify_from_isovalue_list(Isovalues_list * list) -// { -// isovalues = boost::shared_ptr(new Isovalues(list->numberOfIsoValues())); -// for(int i = 0, nbs = list->numberOfIsoValues(); i < nbs; ++i ) -// (*isovalues)[i] = std::make_pair(list->isovalue(i), list->item(i)); -// std::sort(isovalues->begin(), isovalues->end(), Sort_isovalues()); -// } - -// result_type operator()(FT value) -// { -// int result = 0; -// // std::cerr << "isovalues: "; -// for(int i = 1, end = isovalues->size(); i <= end; ++i) -// { -// // std::cerr << (*isovalues)[i-1] << ", "; -// if(value >= (*isovalues)[i-1].first && -// i >= result) -// { -// result = i; -// } -// } -// if(result>1) -// std::cerr << boost::format("result = %1%/%2%\n") % result % isovalues->size(); -// if(result>0) -// return (*isovalues)[result-1].second; -// else -// return 0; -// } -// }; -Volume::Volume(MainWindow* mw) : - Surface(mw), - m_sm_angle(30), - m_sm_radius(0), - m_sm_distance(0), - m_relative_precision(0.000000001), - m_view_surface(false), - m_triangulation_color(QColor(Qt::green)), - m_inverse_normals(false), - two_sides(false), - del(), - c2t3(del), - mw(mw), - lists_draw_surface(), - lists_draw_surface_is_valid(false), -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - list_draw_marching_cube(0), - list_draw_marching_cube_is_valid(false), - lists_draw_surface_mc(), -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - m_view_mc(false) -{ - spinBox_radius_bound = mw->findChild("spinBox_radius_bound"); - spinBox_distance_bound = mw->findChild("spinBox_distance_bound"); - Q_ASSERT_X(spinBox_radius_bound && spinBox_distance_bound, - "Volume::Volume()", "Cannot find spinboxes!"); - - values_list = mw->values; - - connect(spinBox_radius_bound, SIGNAL(valueChanged(double)), - this, SLOT(set_radius_bound(double))); - connect(spinBox_distance_bound, SIGNAL(valueChanged(double)), - this, SLOT(set_distance_bound(double))); - - connect(mw->actionSurface_mesher, SIGNAL(triggered()), - this, SLOT(display_surface_mesher_result())); - - connect(mw->actionInverse_normals, SIGNAL(toggled(bool)), - this, SLOT(set_inverse_normals(bool))); - m_inverse_normals = mw->actionInverse_normals->isChecked(); - - connect(mw->actionDisplay_front_and_back, SIGNAL(toggled(bool)), - this, SLOT(set_two_sides(bool))); - two_sides = mw->actionDisplay_front_and_back->isChecked(); - - connect(mw->actionDraw_triangles_edges, SIGNAL(toggled(bool)), - this, SLOT(set_draw_triangles_edges(bool))); - draw_triangles_edges = mw->actionDraw_triangles_edges->isChecked(); - - connect(mw->actionUse_Gouraud_shading, SIGNAL(toggled(bool)), - this, SLOT(set_use_gouraud(bool))); - use_gouraud = mw->actionUse_Gouraud_shading->isChecked(); - - connect(mw->actionShow_the_image_bounding_box, SIGNAL(toggled(bool)), - this, SLOT(set_show_bbox(bool))); - show_bbox = mw->actionShow_the_image_bounding_box->isChecked(); - - connect(mw->actionShow_triangulation, SIGNAL(toggled(bool)), - this, SLOT(set_draw_triangulation(bool))); - m_draw_triangulation = mw->actionShow_triangulation->isChecked(); - - connect(mw->actionTriangulation_edges_color, SIGNAL(triggered()), - this, SLOT(set_triangulation_edges_color())); - - connect(this, SIGNAL(new_bounding_box(double, double, double, double, double, double)), - mw->viewer, SLOT(interpolateToFitBoundingBox(double, double, double, double, double, double))); - - connect(values_list, SIGNAL(values_changed()), - this, SLOT(changed_parameters())); - connect(values_list, SIGNAL(changed()), - mw->viewer, SLOT(updateGL())); - connect(this, SIGNAL(changed()), - this, SLOT(check_can_export_off())); - - connect(mw->labellizedRadioButton, SIGNAL(toggled(bool)), - this, SLOT(labellizedToogled(bool))); - - mw->actionExport_surface_mesh_to_OFF->setEnabled(false); - connect(mw->actionExport_surface_mesh_to_OFF, SIGNAL(triggered()), - this, SLOT(export_off())); - - connect(mw->actionSave, SIGNAL(triggered()), - this, SLOT(save_image_to_inr())); - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - connect(mw->actionMarching_cubes, SIGNAL(triggered()), - this, SLOT(display_marchin_cube())); -#endif -} - -void Volume::set_inverse_normals(const bool b) { - m_inverse_normals = b; - - list_draw_marching_cube = 0; // Invalidate the display list for the - // marching cube. See gl_draw_marchingcube() - // for an explanation. - - Q_EMIT changed(); -} - -void Volume::set_two_sides(const bool b) { - two_sides = b; - Q_EMIT changed(); -} - -void Volume::set_draw_triangles_edges(const bool b) { - draw_triangles_edges = b; - Q_EMIT changed(); -} - -void Volume::set_draw_triangulation(const bool b) { - m_draw_triangulation = b; - Q_EMIT changed(); -} - -void Volume::set_triangulation_edges_color() { - const QColor color = QColorDialog::getColor(m_triangulation_color, mw); - if (color.isValid()) { - m_triangulation_color = color; - Q_EMIT changed(); - } -} - -void Volume::set_use_gouraud(const bool b) { - use_gouraud = b; - Q_EMIT changed(); -} - -void Volume::set_show_bbox(const bool b) { - show_bbox = b; - Q_EMIT changed(); -} - -void Volume::only_in() -{ - mw->show_only("volume"); -#ifndef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - mw->actionMarching_cubes->setVisible(false); -#endif -} - -#ifdef CGAL_USE_VTK - -#include - -#include -#include -#include -#include -#include - -Volume::~Volume() -{ - if(vtk_reader) vtk_reader->Delete(); - if(vtk_image) vtk_image->Delete(); - if(dicom_reader) dicom_reader->Delete(); - if(executive) executive->Delete(); - if(smoother) smoother->Delete(); -} - -bool Volume::opendir(const QString& dirname) -{ - bool result = true; - if(!fileinfo.isReadable()) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Cannot read directory %1!").arg(dirname)); - status_message(tr("Opening of directory %1 failed!").arg(dirname)); - result = false; - } - else - { - dicom_reader = vtkDICOMImageReader::New(); - dicom_reader->SetDirectoryName(dirname.toUtf8()); - - executive = - vtkDemandDrivenPipeline::SafeDownCast(dicom_reader->GetExecutive()); - if (executive) - { - executive->SetReleaseDataFlag(0, 0); // where 0 is the port index - } - - smoother = vtkImageGaussianSmooth::New(); - smoother->SetStandardDeviations(1., 1., 1.); - smoother->SetInputConnection(dicom_reader->GetOutputPort()); - smoother->Update(); - vtk_image = smoother->GetOutput(); - vtk_image->Print(std::cerr); - m_image = CGAL::read_vtk_image_data(vtk_image); - if(m_image.image() == 0) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Error with file %1/:\nunknown file format!").arg(dirname)); - status_message(tr("Opening of file %1/ failed!").arg(dirname)); - result = false; - } - else - { - status_message(tr("File %1/ successfully opened.").arg(dirname)); - finish_open(); - result = true; - } - // if(executive) executive->Delete(); - // dicom_reader->Delete(); - // smoother->Delete(); - } - return result; -} - -bool Volume::open_vtk(const QString& filename) -{ - only_in(); - - fileinfo.setFile(filename); - - if(fileinfo.isDir()) - { - return opendir(filename); - } - - if(!fileinfo.isReadable()) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Cannot read file %1!").arg(filename)); - status_message(tr("Opening of file %1 failed!").arg(filename)); - return false; - } - else - { - vtk_reader = vtkImageReader::New(); - vtk_reader->SetFileName(filename.toUtf8()); - vtk_reader->SetDataScalarTypeToUnsignedChar(); - vtk_reader->SetDataExtent(0, 249, 0, 249, 0, 124); - vtk_reader->SetDataSpacing(1., 1., 1.); - vtk_reader->SetFileDimensionality(3); - vtk_reader->Update(); - vtk_reader->Print(std::cerr); - vtk_image = vtk_reader->GetOutput(); - vtk_image->Print(std::cerr); - m_image = CGAL::read_vtk_image_data(vtk_image); - if(m_image.image() == NULL) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Error with file %1:\nunknown file format!").arg(filename)); - status_message(tr("Opening of file %1 failed!").arg(filename)); - return false; - } - else - { - status_message(tr("File %1 successfully opened.").arg(filename)); - finish_open(); - return true; - } - } -} - -// Total 3D images (XT format, that is the old Inrimage format, 1994. -bool Volume::open_xt(const QString& filename) -{ - only_in(); - - fileinfo.setFile(filename); - - if(fileinfo.isDir()) - { - return false; - } - - if(!fileinfo.isReadable()) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Cannot read file %1!").arg(filename)); - status_message(tr("Opening of file %1 failed!").arg(filename)); - return false; - } - else - { - long dimx, dimy, dimz; - long word_dim; - long header_size; - const char* filename_stl = qPrintable(filename); - CGAL::Total::lire_longueur_entete(filename_stl, &header_size); - CGAL::Total::lire_nb_octet(filename_stl, &word_dim); - CGAL::Total::lire_longueur_trace(filename_stl, &dimx); - CGAL::Total::lire_nb_trace(filename_stl, &dimy); - CGAL::Total::lire_nb_plan(filename_stl, &dimz); - - vtkImageReader* vtk_reader = vtkImageReader::New(); - vtk_reader->SetFileName(filename_stl); - switch(word_dim) { - case 8: - vtk_reader->SetDataScalarTypeToUnsignedChar(); - break; - case 16: - vtk_reader->SetDataScalarTypeToUnsignedShort(); - break; - default: - return false; - } - vtk_reader->SetHeaderSize(header_size); - vtk_reader->SetDataExtent(1, int(dimx), 1, int(dimy), 1, int(dimz)); - vtk_reader->SetDataSpacing(1., 1., 1.); - vtk_reader->SetFileDimensionality(3); - vtk_reader->Update(); - vtk_reader->Print(std::cerr); - vtkImageData* vtk_image = vtk_reader->GetOutput(); - vtk_image->Print(std::cerr); - m_image = CGAL::read_vtk_image_data(vtk_image); - if(m_image.image() != NULL) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Error with file %1:\nunknown file format!").arg(filename)); - status_message(tr("Opening of file %1 failed!").arg(filename)); - return false; - } - else - { - status_message(tr("File %1 successfully opened.").arg(filename)); - finish_open(); - } - return true; - } -} - -#else // CGAL_USE_VTK -Volume::~Volume() -{ -} - -bool Volume::opendir(const QString&) -{ - return false; -} - -bool Volume::open_xt(const QString&) -{ - return false; -} -#endif // CGAL_USE_VTK - -bool Volume::open(const QString& filename) -{ - only_in(); - - fileinfo.setFile(filename); - - if(fileinfo.isDir()) - { - return opendir(filename); - } - - if(!fileinfo.isReadable()) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Cannot read file %1!").arg(filename)); - } - else - { - if(m_image.read(filename.toStdString().c_str())) - { - status_message(tr("File %1 successfully opened.").arg(filename)); - finish_open(); - return true; - } - else if(open_xt(filename)) { - return true; - } - else - { - QSettings settings; - settings.beginGroup(QUrl::toPercentEncoding(fileinfo.absoluteFilePath())); - if( settings.value("is_raw").toBool() && - m_image.read_raw(filename.toStdString().c_str(), - settings.value("dim_x").toInt(), - settings.value("dim_y").toInt(), - settings.value("dim_z").toInt(), - settings.value("spacing_x").toDouble(), - settings.value("spacing_y").toDouble(), - settings.value("spacing_z").toDouble(), - settings.value("offset").toInt()) ) - { - status_message(tr("File %1 successfully opened.").arg(filename)); - finish_open(); - return true; - } - else if(QMessageBox::warning(mw, mw->windowTitle(), - tr("Error with file %1:\n" - "unknown file format!\n" - "\n" - "Open it as a raw image?").arg(filename), - QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) - { - Raw_image_dialog raw_dialog; - raw_dialog.label_file_size->setText(QString("%1 B").arg(fileinfo.size())); - if( raw_dialog.exec() && - m_image.read_raw(filename.toStdString().c_str(), - raw_dialog.dim_x->value(), - raw_dialog.dim_y->value(), - raw_dialog.dim_z->value(), - raw_dialog.spacing_x->value(), - raw_dialog.spacing_y->value(), - raw_dialog.spacing_z->value(), - raw_dialog.offset->value()) ) - { - status_message(tr("File %1 successfully opened.").arg(filename)); - QSettings settings; - settings.beginGroup(QUrl::toPercentEncoding(fileinfo.absoluteFilePath())); - settings.setValue("is_raw", true); - settings.setValue("dim_x", raw_dialog.dim_x->value()); - settings.setValue("dim_y", raw_dialog.dim_y->value()); - settings.setValue("dim_z", raw_dialog.dim_z->value()); - settings.setValue("spacing_x", raw_dialog.spacing_x->value()); - settings.setValue("spacing_y", raw_dialog.spacing_y->value()); - settings.setValue("spacing_z", raw_dialog.spacing_z->value()); - settings.setValue("offset", raw_dialog.offset->value()); - settings.endGroup(); - finish_open(); - return true; - } - } - } - } - status_message(tr("Opening of file %1 failed!").arg(filename)); - return false; -} - -void Volume::finish_open() -{ - m_image.finish_open(); - mw->viewer->camera()->setSceneBoundingBox(CGAL::qglviewer::Vec(0, 0, 0), - CGAL::qglviewer::Vec(m_image.xmax(), - m_image.ymax(), - m_image.zmax())); - - mw->viewer->showEntireScene(); - values_list->load_values(fileinfo.absoluteFilePath()); - load_image_settings(fileinfo.absoluteFilePath()); - changed_parameters(); - Q_EMIT changed(); -} - -void Volume::export_off() -{ - QFileDialog filedialog(mw, tr("Export surface to file")); - filedialog.setFileMode(QFileDialog::AnyFile); - - filedialog.setNameFilter(tr("OFF files (*.off);;" - "All files (*)")); - - filedialog.setAcceptMode(QFileDialog::AcceptSave); - filedialog.setDefaultSuffix("off"); - if(filedialog.exec()) - { - const QString filename = filedialog.selectedFiles().front(); - std::cerr << "Saving to file \"" << filename.toLocal8Bit().data() << "\"..."; - std::ofstream out(filename.toUtf8()); - CGAL::output_surface_facets_to_off(out, c2t3); - if(!out) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Export to the OFF file %1 failed!").arg(filename)); - status_message(tr("Export to the OFF file %1 failed!").arg(filename)); - std::cerr << " failed!\n"; - } - else - { - std::cerr << " done.\n"; - status_message(tr("Successfull export to the OFF file %1.").arg(filename)); - } - } -} - -void Volume::save_image_to_inr() -{ - QFileDialog filedialog(mw, tr("Export image to Inrimage format")); - filedialog.setFileMode(QFileDialog::AnyFile); - - filedialog.setNameFilter(tr("Inrimage files (*.inr);;" - "Compressed Inrimage files (*.inr.gz)")); - - - filedialog.setAcceptMode(QFileDialog::AcceptSave); - filedialog.setDefaultSuffix("inr.gz"); - if(filedialog.exec()) - { - const QString filename = filedialog.selectedFiles().front(); - std::cerr << "Saving image to file \"" << filename.toLocal8Bit().data() << "\"..."; - const int result = ::_writeImage(m_image.image(), filename.toUtf8()); - if(result != ImageIO_NO_ERROR) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Export to the Inrimage file %1 failed!").arg(filename)); - status_message(tr("Export to the Inrimage file %1 failed!").arg(filename)); - std::cerr << " failed!\n"; - } - else - { - std::cerr << " done.\n"; - status_message(tr("Successfull export to the Inrimage file %1.").arg(filename)); - } - } -} - -void Volume::check_can_export_off() -{ - mw->actionExport_surface_mesh_to_OFF->setEnabled(m_view_surface);// || m_view_mc); -} - -void Volume::status_message(QString string) -{ - std::cerr << qPrintable(string) << std::endl; - mw->statusBar()->showMessage(string); -} - -void Volume::busy() const -{ - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); -} - -void Volume::not_busy() const -{ - QApplication::restoreOverrideCursor(); -} - -void Volume::display_marchin_cube() -{ -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - if(m_surface_mc.empty()) - { - QElapsedTimer total_time; - total_time.start(); - - values_list->save_values(fileinfo.absoluteFilePath()); - - unsigned int nx = m_image.xdim(); - unsigned int ny = m_image.ydim(); - unsigned int nz = m_image.zdim(); - if(nx * ny * nz == 0) - { - status_message("No volume loaded."); - return; - } - - mc_timer.reset(); - busy(); - status_message("Marching cubes..."); - - mc_timer.start(); - m_surface_mc.clear(); - - if(mc.ntrigs()!=0) - mc.clean_all(); - mc.set_resolution(nx,ny,nz); - mc.init_all(); - mc.set_ext_data(static_cast(m_image.image()->data)); - - nbs_of_mc_triangles.resize(values_list->numberOfValues()); - - for(int value_id = 0; - value_id < values_list->numberOfValues(); - ++value_id) - { - status_message(tr("Marching cubes, isovalue #%1...").arg(value_id)); - - // set data -// for(unsigned int i=0;i 0) - mc.init_temps(); - mc.run(values_list->value(value_id), - m_image.vx(), - m_image.vy(), - m_image.vz()); - mc.clean_temps(); - - std::vector facets; - mc.get_facets(facets); - - mc_timer.stop(); - const unsigned int begin = value_id == 0 ? 0 : nbs_of_mc_triangles[value_id-1]; - const unsigned int nbt = facets.size() / 9; - for(unsigned int i=begin;iitem(value_id))); - } - nbs_of_mc_triangles[value_id]=m_surface_mc.size(); - mc_timer.start(); - } - mc_timer.stop(); - not_busy(); - mc_total_time = total_time.elapsed(); - - // invalidate the display list - lists_draw_surface_mc_is_valid = false; - list_draw_marching_cube_is_valid = false; - } - CGAL::Bbox_3 bbox(0,0,0,0,0,0); - for(std::vector::const_iterator - it = m_surface_mc.begin(), end = m_surface_mc.end(); - it != end; ++it) - { - bbox = bbox + it->get<0>().bbox(); - } - - m_view_mc = true; - m_view_surface = false; - Q_EMIT changed(); - if(!m_surface_mc.empty()) - { - Q_EMIT new_bounding_box(bbox.xmin(), - bbox.ymin(), - bbox.zmin(), - bbox.xmax(), - bbox.ymax(), - bbox.zmax()); - } - status_message(tr("Marching cubes done. %2 facets in %1s (CPU time), total time is %3s.") - .arg(mc_timer.time()) - .arg(m_surface_mc.size()) - .arg(mc_total_time/1000.)); - - save_image_settings(fileinfo.absoluteFilePath()); -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE -} - -void Volume::display_surface_mesher_result() -{ - if(m_surface.empty() || // Either the surface is not computed. - m_view_surface) // Or it is computed and displayed, and one want - // to recompute it. - { - QElapsedTimer total_time; - total_time.start(); - - values_list->save_values(fileinfo.absoluteFilePath()); - - std::size_t nx = m_image.xdim(); - std::size_t ny = m_image.ydim(); - std::size_t nz = m_image.zdim(); - if(nx * ny * nz == 0) - { - status_message("No volume loaded."); - return; - } - - m_surface.clear(); - sm_timer.reset(); - busy(); - - status_message("Surface meshing..."); - - sm_timer.start(); - - c2t3.clear(); - del.clear(); - Sphere bounding_sphere(m_image.center(),m_image.radius()*m_image.radius()); - - Classify_from_isovalue_list classify(values_list); - Generate_surface_identifiers generate_ids(values_list); - - m_image.set_interpolation(mw->interpolationCheckBox->isChecked()); - if(mw->labellizedRadioButton->isChecked()) { - std::cerr << "Labellized image\n"; - } - m_image.set_labellized(mw->labellizedRadioButton->isChecked()); - classify.set_identity(mw->labellizedRadioButton->isChecked()); - generate_ids.set_labellized_image(mw->labellizedRadioButton->isChecked()); - - // definition of the surface - Surface_3 surface(m_image, bounding_sphere, m_relative_precision); -// Threshold threshold(m_image.isovalue()); - - // surface mesh traits class - typedef CGAL::Surface_mesher::Implicit_surface_oracle_3 Oracle; - Oracle oracle(classify, generate_ids); - - if(mw->searchSeedsCheckBox->isChecked()) - { - typedef std::vector > Seeds; - Seeds seeds; - { - std::cerr << "Search seeds...\n"; - std::set domains; - search_for_connected_components(std::back_inserter(seeds), - CGAL::inserter(domains), - classify); - std::cerr << "Found " << seeds.size() << " seed(s).\n"; - - if(mw->labellizedRadioButton->isChecked() && - values_list->numberOfValues() == 0) - { - Q_FOREACH(unsigned char label, domains) { - if(label != 0) { - values_list->addValue(label); - } - } - } - } - std::ofstream seeds_out("seeds.off"); - std::ofstream segments_out("segments.txt"); - seeds_out.precision(18); - seeds_out << "OFF\n" << seeds.size() << " 0 0\n"; - segments_out.precision(18); - for(Seeds::const_iterator it = seeds.begin(), end = seeds.end(); - it != end; ++it) - { - seeds_out << it->first << std::endl; - CGAL::Random_points_on_sphere_3 random_points_on_sphere_3(it->second); - Oracle::Intersect_3 intersect = oracle.intersect_3_object(); - for(int i = 0; i < 20; ++i) - { - const Point_3 test = it->first + (*random_points_on_sphere_3++ - CGAL::ORIGIN); - CGAL::Object o = intersect(surface, Segment_3(it->first, test)); - if (const Point_3* intersection = CGAL::object_cast(&o)) { - segments_out << "2 " << it->first << " " << *intersection << std::endl; - del.insert(*intersection); - } - else - { - std::cerr << - boost::format("Error. Segment (%1%, %2%) does not intersect the surface! values=(%3%, %4%)\n") - % it->first % test - % surface(it->first) % surface(test); - } - } - } - } - else { - oracle.construct_initial_points_object()(surface, - CGAL::inserter(c2t3.triangulation()), - 20); - } - - std::ofstream points_out("initial-points.off"); - points_out.precision(18); - points_out << "OFF\n" << c2t3.triangulation().number_of_vertices() << " 0 0\n"; - for(const Tr::Vertex& v : - CGAL::make_range(c2t3.triangulation().vertices_begin(), - c2t3.triangulation().vertices_end())) - { - points_out << v.point() << std::endl; - } - - std::cerr << boost::format("Number of initial points: %1%\n") % del.number_of_vertices(); - - // defining meshing criteria - typedef CGAL::Surface_mesher::Refine_criterion Criterion; - CGAL::Surface_mesher::Curvature_size_criterion - curvature_size_criterion (m_sm_distance); - CGAL::Surface_mesher::Uniform_size_criterion - uniform_size_criterion (m_sm_radius); - CGAL::Surface_mesher::Aspect_ratio_criterion - aspect_ratio_criterion (m_sm_angle); - CGAL::Surface_mesher::Vertices_on_the_same_psc_element_criterion - vertices_on_the_same_psc_element_criterion(surface); - - std::vector criterion_vector; - criterion_vector.push_back(&aspect_ratio_criterion); - criterion_vector.push_back(&uniform_size_criterion); - criterion_vector.push_back(&curvature_size_criterion); - if(mw->sameIndexCheckBox->isChecked()) { - criterion_vector.push_back(&vertices_on_the_same_psc_element_criterion); - std::cerr << "vertices_on_the_same_psc_element_criterion is activated.\n"; - } - - typedef CGAL::Surface_mesher::Standard_criteria Criteria; - Criteria criteria(criterion_vector); - std::cerr << "Surface_mesher... angle=" << m_sm_angle << ", radius= " << m_sm_radius - << ", distance=" << m_sm_distance << "\n"; - - typedef CGAL::Surface_mesher_generator::type Surface_mesher_manifold; - - typedef CGAL::Surface_mesher_generator::type Surface_mesher_non_manifold; - - if(mw->manifoldCheckBox->isChecked()) { - // meshing surface - std::cerr << "manifold criteria is activated.\n"; -// make_surface_mesh(c2t3, surface, oracle, criteria, -// CGAL::Manifold_tag(), 0); - Surface_mesher_manifold manifold_mesher(c2t3, surface, oracle, criteria); - manifold_mesher.refine_mesh(); - } - else { -// m_view_surface = true; - Surface_mesher_non_manifold non_manifold_mesher(c2t3, surface, oracle, criteria); -#if 0 - int nb_steps = 0; -// direct_draw = true; - non_manifold_mesher.init(); - while(!non_manifold_mesher.is_algorithm_done()) { - CGAL::Null_mesh_visitor null_visitor; - non_manifold_mesher.one_step(null_visitor); - if(++nb_steps % 1000 == 0) { - CGAL::Timer timer; - std::cerr << "(process events..."; - timer.start(); - list_draw_marching_cube_is_valid = false; - lists_draw_surface_is_valid = false; - for(Tr::Finite_cells_iterator - cit = del.finite_cells_begin(), - end = del.finite_cells_end(); - cit != end; ++cit) - { - cit->info() = classify(surface(cit->circumcenter())); - } -// Q_EMIT changed(); - qApp->processEvents(); - timer.stop(); - std::cerr << timer.time() << " secondes)\n"; - } - } -#else - non_manifold_mesher.refine_mesh(); -#endif - } - sm_timer.stop(); - not_busy(); - direct_draw = false; - - for(Tr::Finite_cells_iterator - cit = del.finite_cells_begin(), - end = del.finite_cells_end(); - cit != end; ++cit) - { - cit->info() = classify(surface(cit->circumcenter())); - } - // get output surface - for(C2t3::Facet_iterator - fit = c2t3.facets_begin(), end = c2t3.facets_end(); - fit != end; ++fit) - { - const Tr::Cell_handle& cell = fit->first; - const int index = fit->second; - - // here "left" means nothing - const Point_3 left_circumcenter = cell->circumcenter(); - const Point_3 right_circumcenter = cell->neighbor(index)->circumcenter(); - - const Triangle_3 t = - Triangle_3(cell->vertex(del.vertex_triple_index(index, 0))->point(), - cell->vertex(del.vertex_triple_index(index, 1))->point(), - cell->vertex(del.vertex_triple_index(index, 2))->point()); - const Vector u = t[1] - t[0]; - const Vector v = t[2] - t[0]; - Vector n = CGAL::cross_product(u,v); - n = n / std::sqrt(n*n); - if(mw->labellizedRadioButton->isChecked()) - { - m_surface.push_back(Facet_(t, - n, - values_list->search((std::max)(surface(left_circumcenter), - surface(right_circumcenter))))); - } - else { - m_surface.push_back(Facet_(t,n,cell->vertex(del.vertex_triple_index(index, 0))->point().element_index())); - } - } - - // invalidate the display list - lists_draw_surface_is_valid = false; - sm_total_time = total_time.elapsed(); - } - - CGAL::Bbox_3 bbox(0,0,0,0,0,0); - for(std::vector::const_iterator - it = m_surface.begin(), end = m_surface.end(); - it != end; ++it) - { - bbox = bbox + it->get<0>().bbox(); - } - - // toggle visualization - m_view_mc = false; - m_view_surface = true; - Q_EMIT changed(); - if(!m_surface.empty()) - { - Q_EMIT new_bounding_box(bbox.xmin(), - bbox.ymin(), - bbox.zmin(), - bbox.xmax(), - bbox.ymax(), - bbox.zmax()); - } - status_message(tr("Surface meshing done. %1 facets in %2s (CPU time), total time is %3s.") - .arg(m_surface.size()) - .arg(sm_timer.time()) - .arg(sm_total_time/1000.)); - save_image_settings(fileinfo.absoluteFilePath()); -} - -void Volume::gl_draw_image_bbox(const float line_width, - const unsigned char red, - const unsigned char green, - const unsigned char blue) -{ - const _image* image_ptr = m_image.image(); - if(image_ptr == NULL) - return; - - glLineWidth(line_width); - glColor3ub(red,green,blue); - glBegin(GL_LINES); - - const double xmax = (image_ptr->xdim - 1.0)*(image_ptr->vx); - const double ymax = (image_ptr->ydim - 1.0)*(image_ptr->vy); - const double zmax = (image_ptr->zdim - 1.0)*(image_ptr->vz); - - glVertex3d(0.0,0.0,0.0); - glVertex3d(0.0,ymax,0.0); - - glVertex3d(0.0,ymax,0.0); - glVertex3d(0.0,ymax,zmax); - - glVertex3d(0.0,ymax,zmax); - glVertex3d(0.0,0.0,zmax); - - glVertex3d(0.0,0.0,zmax); - glVertex3d(0.0,0.0,0.0); - - glVertex3d(xmax,0.0,0.0); - glVertex3d(xmax,ymax,0.0); - - glVertex3d(xmax,ymax,0.0); - glVertex3d(xmax,ymax,zmax); - - glVertex3d(xmax,ymax,zmax); - glVertex3d(xmax,0.0,zmax); - - glVertex3d(xmax,0.0,zmax); - glVertex3d(xmax,0.0,0.0); - - glVertex3d(0.0,0.0,0.0); - glVertex3d(xmax,0.0,0.0); - - glVertex3d(0.0,0.0,zmax); - glVertex3d(xmax,0.0,zmax); - - glVertex3d(0.0,ymax,zmax); - glVertex3d(xmax,ymax,zmax); - - glVertex3d(0.0,ymax,0.0); - glVertex3d(xmax,ymax,0.0); - - glEnd(); -} - -void Volume::draw() -{ - float ambient[] = { 0.25f, - 0.20725f, - 0.20725f, - 0.922f }; - float diffuse[] = { 1.0f, - 0.829f, - 0.829f, - 0.922f }; - - float specular[] = { 0.296648f, - 0.296648f, - 0.296648f, - 0.522f }; - - float emission[] = { 0.3f, - 0.3f, - 0.3f, - 1.0f }; - float shininess[] = { 11.264f }; - - // apply - ::glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, ambient); - ::glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); - ::glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, specular); - ::glMaterialfv( GL_FRONT_AND_BACK, GL_SHININESS, shininess); - ::glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, emission); - - ::glEnable(GL_LINE_SMOOTH); - - if(two_sides) - ::glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); - else - ::glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); // default - - // draw surface mesh - if(m_view_surface) - { - ::glEnable(GL_LIGHTING); - ::glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - ::glColor3f(0.2f, 0.2f, 1.f); - ::glEnable(GL_POLYGON_OFFSET_FILL); - ::glPolygonOffset(3.0f,-3.0f); - gl_draw_surface(); - - if(draw_triangles_edges) - { - ::glDisable(GL_LIGHTING); - ::glLineWidth(1.); - ::glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); - ::glColor3ub(0,0,0); - ::glDisable(GL_POLYGON_OFFSET_FILL); - gl_draw_surface(); - } - } - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - // draw MC surface mesh - if(m_view_mc) - { - ::glEnable(GL_LIGHTING); - ::glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - ::glColor3f(0.2f, 0.2f, 1.f); - ::glEnable(GL_POLYGON_OFFSET_FILL); - ::glPolygonOffset(3.0f,-3.0f); - gl_draw_surface_mc(); - - if(draw_triangles_edges) - { - ::glDisable(GL_LIGHTING); - ::glLineWidth(1.); - ::glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); - ::glColor3ub(0,0,0); - ::glDisable(GL_POLYGON_OFFSET_FILL); - gl_draw_surface_mc(); - } - } -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - - if(show_bbox) { - ::glDisable(GL_LIGHTING); - gl_draw_image_bbox(3.0f,0,0,0); - } - - if(!m_view_mc && m_draw_triangulation) - { - // draw the triangualtion - ::glColor3d(m_triangulation_color.redF(), - m_triangulation_color.greenF(), - m_triangulation_color.blueF()); - ::glLineWidth(1.0); - ::glBegin(GL_LINES); - for(Tr::Finite_edges_iterator - eit = del.finite_edges_begin(), - end = del.finite_edges_end(); - eit != end; ++eit) - { - const Point_3 p1 = eit->first->vertex(eit->second)->point(); - const Point_3 p2 = eit->first->vertex(eit->third)->point(); - ::glVertex3d(p1.x(),p1.y(),p1.z()); - ::glVertex3d(p2.x(),p2.y(),p2.z()); - } - ::glEnd(); - } -} - -void Volume::set_radius_bound(double d) -{ - m_sm_radius = FT(d); - changed_parameters(); -} - -void Volume::set_distance_bound(double d) -{ - m_sm_distance = FT(d); - changed_parameters(); -} - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE -void Volume::gl_draw_surface_mc() -{ - if(use_gouraud) - { - gl_draw_marchingcube(); - return; - } - - if(lists_draw_surface_mc_is_valid) - { - for(int i = 0, nbs = values_list->numberOfValues(); i < nbs; ++i ) - { - if(values_list->enabled(i)) - { - mw->viewer->qglColor(values_list->color(i)); - ::glCallList(lists_draw_surface_mc[i]); - } - } - } - else - { - lists_draw_surface_mc.resize(values_list->numberOfValues(), 0); - for(int i = 0, nbs = values_list->numberOfValues(); i < nbs; ++i ) - { - if(!lists_draw_surface_mc[i]) - { - lists_draw_surface_mc[i] = ::glGenLists(1); - } - - std::cerr << boost::format("(Re-)Generating list #%1% for marching cube surface #%2%" - " in gl_draw_surface(), ()\n") - % lists_draw_surface_mc[i] - % i; - - mw->viewer->qglColor(values_list->color(i)); - - if(lists_draw_surface_mc[i]) // If - ::glNewList(lists_draw_surface_mc[i], // lists_draw_surface[i]==0 then something - values_list->enabled(i) // got wrong in the list generation. - ? GL_COMPILE_AND_EXECUTE - : GL_COMPILE); - - - gl_draw_surface(m_surface_mc.begin(), - m_surface_mc.end(), - values_list->item(i)); - - if(lists_draw_surface_mc[i]) // If lists_draw_surface[i]==0 then - { // something got wrong in the list - ::glEndList(); // generation. - } - } - lists_draw_surface_mc_is_valid = (::glGetError() == GL_NO_ERROR); - } -} -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - -void Volume::gl_draw_surface() -{ -// if(mw->labellizedRadioButton->isChecked()) { -// mw->viewer->qglColor(::Qt::blue); -// gl_draw_surface(m_surface.begin(), -// m_surface.end(), -// 0); -// } -// else - if(direct_draw) { - ::glBegin(GL_TRIANGLES); - unsigned int counter = 0; - for(Tr::Finite_cells_iterator - cit = del.finite_cells_begin(), end = del.finite_cells_end(); - cit != end; ++cit) - { - for(int facet_index = 0; facet_index < 4; ++facet_index) - { - const Tr::Cell_handle& facet_cell = cit; - if(c2t3.face_status(facet_cell, facet_index) == C2t3::NOT_IN_COMPLEX) { - continue; - } - const Point_3& a = facet_cell->vertex(del.vertex_triple_index(facet_index, 0))->point(); - const Point_3& b = facet_cell->vertex(del.vertex_triple_index(facet_index, 1))->point(); - const Point_3& c = facet_cell->vertex(del.vertex_triple_index(facet_index, 2))->point(); - Vector n = CGAL::cross_product(b-a,c-a); - n = n / std::sqrt(n*n); // unit normal - if(m_inverse_normals) { - ::glNormal3d(-n.x(),-n.y(),-n.z()); - } else { - ::glNormal3d(n.x(),n.y(),n.z()); - } - ::glColor3d(values_list->color(values_list->search(facet_cell->info())).redF(), - values_list->color(values_list->search(facet_cell->info())).greenF(), - values_list->color(values_list->search(facet_cell->info())).blueF()); - ::glVertex3d(a.x(),a.y(),a.z()); - ::glVertex3d(b.x(),b.y(),b.z()); - ::glVertex3d(c.x(),c.y(),c.z()); - ++counter; - } - ::glEnd(); - } - return; - } - if(!direct_draw && lists_draw_surface_is_valid) - { - for(int i = 0, nbs = values_list->numberOfValues(); i < nbs; ++i ) - { - if(values_list->enabled(i)) - { - ::glColor3d(values_list->color(i).redF(), - values_list->color(i).greenF(), - values_list->color(i).blueF()); - ::glCallList(lists_draw_surface[i]); - } - } - } - else - { - lists_draw_surface.resize(values_list->numberOfValues(), 0); - for(int i = 0, nbs = values_list->numberOfValues(); i < nbs; ++i ) - { - if(!lists_draw_surface[i]) - { - lists_draw_surface[i] = ::glGenLists(1); - } - - std::cerr << boost::format("(Re-)Generating list #%1% for surface #%2%" - " in gl_draw_surface(), ()\n") - % lists_draw_surface[i] - % i; - - ::glColor3d(values_list->color(i).redF(), - values_list->color(i).greenF(), - values_list->color(i).blueF()); - - if(!direct_draw && lists_draw_surface[i]) // If - ::glNewList(lists_draw_surface[i], // lists_draw_surface[i]==0 - values_list->enabled(i) // then something got wrong - ? GL_COMPILE_AND_EXECUTE // in the list generation. - : GL_COMPILE); - - if(!mw->labellizedRadioButton->isChecked()) - { - gl_draw_surface(m_surface.begin(), - m_surface.end(), - values_list->item(i)); - } - else - { - const auto volume_index = static_cast(values_list->value(i)); - - ::glBegin(GL_TRIANGLES); - unsigned int counter = 0; - for(C2t3::Facet_iterator - fit = c2t3.facets_begin(), end = c2t3.facets_end(); - fit != end; ++fit) - { - Tr::Cell_handle facet_cell = fit->first; - int facet_index = fit->second; - Tr::Cell_handle opposite_cell = facet_cell->neighbor(facet_index); - int opposite_index = opposite_cell->index(facet_cell); - - if( facet_cell->info() != volume_index ) { - if( opposite_cell->info() == volume_index ) { - std::swap(facet_cell, opposite_cell); - std::swap(facet_index, opposite_index); - } - else - continue; // go to next facet - } - const Point_3& a = opposite_cell->vertex(del.vertex_triple_index(opposite_index, 0))->point(); - const Point_3& b = opposite_cell->vertex(del.vertex_triple_index(opposite_index, 1))->point(); - const Point_3& c = opposite_cell->vertex(del.vertex_triple_index(opposite_index, 2))->point(); - Vector n = CGAL::cross_product(b-a,c-a); - n = n / std::sqrt(n*n); // unit normal - if(m_inverse_normals) { - ::glNormal3d(-n.x(),-n.y(),-n.z()); - } else { - ::glNormal3d(n.x(),n.y(),n.z()); - } - ::glVertex3d(a.x(),a.y(),a.z()); - ::glVertex3d(b.x(),b.y(),b.z()); - ::glVertex3d(c.x(),c.y(),c.z()); - ++counter; - } - ::glEnd(); - std::cerr << boost::format("(c2t3) number of facets: %1%\n") - % counter; - } - - if(!direct_draw && lists_draw_surface[i]) - // If lists_draw_surface[i]==0 then - { // something got wrong in the list - ::glEndList(); // generation. - } - } - lists_draw_surface_is_valid = (::glGetError() == GL_NO_ERROR); - } -} - -template -void Volume::gl_draw_surface(Iterator begin, Iterator end, const QTreeWidgetItem* i) -{ - ::glBegin(GL_TRIANGLES); - unsigned int counter = 0; - for(Iterator it = begin; it != end; ++it) - { - const Facet_& f = *it; - - if(f.get<2>() != i) continue; - - const Vector& n = f.get<1>(); - - if(m_inverse_normals) - ::glNormal3d(-n.x(),-n.y(),-n.z()); - else - ::glNormal3d(n.x(),n.y(),n.z()); - - const Triangle_3& t = f.get<0>(); - const Point_3& a = t[0]; - const Point_3& b = t[1]; - const Point_3& c = t[2]; - - ::glVertex3d(a.x(),a.y(),a.z()); - ::glVertex3d(b.x(),b.y(),b.z()); - ::glVertex3d(c.x(),c.y(),c.z()); - ++counter; - } - ::glEnd(); - std::cerr << boost::format("number of facets: %1%\n") - % counter; -} - -void Volume::changed_parameters() -{ - m_surface.clear(); -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - m_surface_mc.clear(); -#endif - list_draw_marching_cube_is_valid = false; - lists_draw_surface_is_valid = false; - c2t3.clear(); - del.clear(); - m_view_mc = m_view_surface = false; - Q_EMIT changed(); -} - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE -void Volume::gl_draw_one_marching_cube_vertex(int i) -{ - if(!m_inverse_normals) - glArrayElement(i); - else - { - const Vertex* const vertex = mc.vert(i); - ::glNormal3d(-vertex->nx, -vertex->ny, -vertex->nz); - ::glVertex3d(vertex->x, vertex->y, vertex->z); - } -} - -void Volume::gl_draw_marchingcube() -{ - if(list_draw_marching_cube_is_valid) - ::glCallList(list_draw_marching_cube); - else - { - if(!list_draw_marching_cube) - list_draw_marching_cube = ::glGenLists(1); - std::cerr << boost::format("(Re-)Generating list #%1% for" - " gl_draw_marchingcube()\n") - % list_draw_marching_cube; - - if(list_draw_marching_cube) // If list_draw_marching_cube==0 then - ::glNewList(list_draw_marching_cube, // something got wrong in the list - GL_COMPILE_AND_EXECUTE); // generation. - - ::glVertexPointer(3, GL_DOUBLE, sizeof(Vertex), mc.vertices()); - ::glNormalPointer(GL_DOUBLE, sizeof(Vertex), &(mc.vertices()->nx)); - ::glEnableClientState(GL_VERTEX_ARRAY); - - // because of that conditionnal, the display list has to be - // reconstructed each time m_inverse_normals is toggled. - if(!m_inverse_normals) - ::glEnableClientState(GL_NORMAL_ARRAY); - - for(int i = 0, nbs = values_list->numberOfValues(); i < nbs; ++i) - { - const int begin = i == 0 ? 0 : nbs_of_mc_triangles[i-1]; - const int end = nbs_of_mc_triangles[i]; - mw->viewer->qglColor(values_list->color(i)); - ::glBegin(GL_TRIANGLES); - for(int i = begin; i < end; ++i) - { - const MC_Triangle* const trig = mc.trig(i); - gl_draw_one_marching_cube_vertex(trig->v1); - gl_draw_one_marching_cube_vertex(trig->v2); - gl_draw_one_marching_cube_vertex(trig->v3); - } - ::glEnd(); - } - if(list_draw_marching_cube > 0) // If list_draw_marching_cube==0 then - { // something got wrong in the list - ::glEndList(); // generation. - list_draw_marching_cube_is_valid = (::glGetError() == GL_NO_ERROR); - } - if(!list_draw_marching_cube_is_valid) - { - CGAL::Qt::opengl_check_errors(); - } - } -} -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - -void Volume::save_image_settings(QString filename) -{ - QSettings settings; - settings.beginGroup(QUrl::toPercentEncoding(filename)); - settings.setValue("labellized", mw->labellizedRadioButton->isChecked()); - settings.endGroup(); -} - -void Volume::load_image_settings(QString filename) -{ - QSettings settings; - settings.beginGroup(QUrl::toPercentEncoding(filename)); - mw->labellizedRadioButton->setChecked(settings.value("labellized").toBool()); - settings.endGroup(); -} - -void Volume::labellizedToogled(bool toggled) -{ - if(toggled) { - values_list->setHeaderTitle(tr("Label")); - } - else { - values_list->setHeaderTitle(tr("Iso-Value")); - } -} - diff --git a/Surface_mesher/demo/Surface_mesher/volume.h b/Surface_mesher/demo/Surface_mesher/volume.h deleted file mode 100644 index 09195f02d07..00000000000 --- a/Surface_mesher/demo/Surface_mesher/volume.h +++ /dev/null @@ -1,392 +0,0 @@ -#ifndef _VOLUME_H -#define _VOLUME_H - -#include -#include -#include - - -#include "surface.h" -#include "binary_image.h" - -#include -#include -#include -#include - -#include -#include -#include // std::back_inserter - -#include -#include - -#ifdef CGAL_USE_VTK -class vtkImageReader; -class vtkImageData; -class vtkDICOMImageReader; -class vtkDemandDrivenPipeline; -class vtkImageGaussianSmooth; -#endif // CGAL_USE_VTK - -class QTreeWidgetItem; - -// kernel -// #include -#include -typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel1; - -#include -struct Kernel : public Kernel1 { - typedef CGAL::Point_with_psc_localisation Point_3; -}; - -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point_3; -typedef Kernel::Sphere_3 Sphere; -typedef Kernel::Vector_3 Vector; -typedef Kernel::Triangle_3 Triangle_3; -typedef Kernel::Segment_3 Segment_3; - -// typedef CGAL::Triple Facet; - -typedef boost::tuple Facet_; - - -typedef CBinary_image_3 Binary_image; - -class QTreeWidgetItem; - -// surface mesher -// #define CGAL_MESHES_NO_OUTPUT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef CGAL::Surface_mesh_vertex_base_3 Vb; -typedef CGAL::Triangulation_cell_base_with_info_3 Cb1; -typedef CGAL::Delaunay_triangulation_cell_base_3 Cb2; -typedef CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3 Cb3; -typedef CGAL::Surface_mesh_cell_base_3 Cb; -typedef CGAL::Triangulation_data_structure_3 Tds; -typedef CGAL::Delaunay_triangulation_3 Tr; -typedef CGAL::Surface_mesh_complex_2_in_triangulation_3 C2t3; -typedef CGAL::Implicit_surface_3 Surface_3; - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE -#include -#endif - -class MainWindow; -class QDoubleSpinBox; -class Viewer; -class Values_list; - -class Volume : public Surface -{ - Q_OBJECT -public: - Volume(MainWindow* mw); - ~Volume(); - -private: - Binary_image m_image; - - // options - FT m_sm_angle; - FT m_sm_radius; - FT m_sm_distance; - double m_relative_precision; - - // visualization - bool m_view_surface; - bool m_draw_triangulation; - QColor m_triangulation_color; - bool m_inverse_normals; - bool two_sides; - bool draw_triangles_edges; - bool use_gouraud; - bool show_bbox; - - std::vector m_surface; - Tr del; // 3D-Delaunay triangulation - C2t3 c2t3; // 2D complex in 3D triangulation - - MainWindow* mw; - QFileInfo fileinfo; - Values_list* values_list; - QDoubleSpinBox* spinBox_radius_bound; - QDoubleSpinBox* spinBox_distance_bound; - - bool direct_draw; // do not use display lists - std::vector lists_draw_surface; - bool lists_draw_surface_is_valid; - GLint list_draw_marching_cube; - bool list_draw_marching_cube_is_valid; - - CGAL::Timer sm_timer; - int sm_total_time; - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - std::vector m_surface_mc; - MarchingCubes mc ; - std::vector nbs_of_mc_triangles; - std::vector lists_draw_surface_mc; - bool lists_draw_surface_mc_is_valid; - CGAL::Timer mc_timer; - int mc_total_time; -public: - void gl_draw_surface_mc(); - void gl_draw_marchingcube(); -private: - void gl_draw_one_marching_cube_vertex(int); - -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - - bool m_view_mc; // that boolean is here even with if - // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - // is not defined. - -#ifdef CGAL_USE_VTK - vtkImageReader* vtk_reader; - vtkImageData* vtk_image; - vtkDICOMImageReader* dicom_reader; - vtkDemandDrivenPipeline* executive; - vtkImageGaussianSmooth* smoother; -#endif // CGAL_USE_VTK - -public Q_SLOTS: -void display_marchin_cube(); - -private: - template - void gl_draw_surface(Iterator begin, Iterator end, const QTreeWidgetItem* = 0); - void gl_draw_image_bbox(const float line_width, - const unsigned char red, - const unsigned char green, - const unsigned char blue); - - template - void search_for_connected_components(PointsOutputIterator, - DomainsOutputIterator, - TransformOperator); - -public: - void gl_draw_surface(); - -Q_SIGNALS: - - void new_bounding_box(double, double, double, double, double, double); - -public Q_SLOTS: - void only_in(); - void set_inverse_normals(const bool); - void set_two_sides(const bool); - void set_draw_triangles_edges(const bool); - void set_triangulation_edges_color(); - void set_draw_triangulation(const bool); - void set_use_gouraud(const bool); - void set_show_bbox(const bool); - bool open(const QString& filename); -#ifdef CGAL_USE_VTK - bool open_vtk(const QString& filename); -#endif - bool open_xt(const QString& filename); - bool opendir(const QString& dirname); - void finish_open(); - void export_off(); - void save_image_to_inr(); - void check_can_export_off(); - void draw(); - void get_bbox(float& /*xmin*/, float& /*ymin*/, float& /*zmin*/, - float& /*xmax*/, float& /*ymax*/, float& /*zmax*/) {} - void close() {} - void display_surface_mesher_result(); - void set_radius_bound(double); - void set_distance_bound(double); - void changed_parameters(); - - void labellizedToogled(bool); - - void save_image_settings(QString); - void load_image_settings(QString); -private: - void status_message(QString); - void busy() const; - void not_busy() const; -}; - -template -void Volume::search_for_connected_components(PointsOutputIterator it, - DomainsOutputIterator dom_it, - TransformOperator transform) -{ - const std::size_t nx = m_image.xdim(); - const std::size_t ny = m_image.ydim(); - const std::size_t nz = m_image.zdim(); - - const double max_v = (std::max)((std::max)(m_image.vx(), - m_image.vy()), - m_image.vz()); - - typedef unsigned char Marker; - typedef typename TransformOperator::result_type Label; - - boost::multi_array visited(boost::extents[nx][ny][nz]); - typedef boost::tuple - Indices; - typedef std::queue Indices_queue; - typedef std::vector Border_vector; - - int number_of_connected_components = 0; - for(std::size_t i=0; i0) - continue; - const Label current_label = transform(m_image.value(i, j, k)); - *dom_it++ = current_label; - if(current_label == Label()) { - visited[i][j][k] = 3; - continue; - } - - // if we reach here, (i, j, k) is a new connected component - ++number_of_connected_components; - std::cerr << boost::format("Found new connected component (#%5%) " - "at voxel (%1%, %2%, %3%), value=%4%, volume id=%6%\n") - % i % j % k - % m_image.value(i, j, k) - % number_of_connected_components - % (int)current_label; - - int nb_voxels = 0; - - Indices_queue queue; - Indices indices(i, j ,k, 0); - queue.push(indices); - - Border_vector border; - - /* - * First pass is a BFS to retrieve all the connected component, and - * its border. - * Second pass is a BFS initialized with all voxel of the border. - * The last voxel of that BFS is used as the seed. - */ - Marker pass = 1; // pass will be equal to 2 in second pass - - Indices bbox_min = indices; - Indices bbox_max = indices; - - while(!queue.empty()) // walk through the connected component - { - Indices indices = queue.front(); - queue.pop(); - - // warning: those indices i, j and k are local to the while loop - const std::size_t i = boost::get<0>(indices); - const std::size_t j = boost::get<1>(indices); - const std::size_t k = boost::get<2>(indices); - const std::size_t depth = boost::get<3>(indices); - - if(visited[i][j][k] < pass) - { - visited[i][j][k] = pass; - if(pass == 1 ) - { - ++nb_voxels; - boost::get<0>(bbox_min) = (std::min)(i, boost::get<0>(bbox_min)); - boost::get<0>(bbox_max) = (std::max)(i, boost::get<0>(bbox_max)); - boost::get<1>(bbox_min) = (std::min)(j, boost::get<1>(bbox_min)); - boost::get<1>(bbox_max) = (std::max)(j, boost::get<1>(bbox_max)); - boost::get<2>(bbox_min) = (std::min)(k, boost::get<2>(bbox_min)); - boost::get<2>(bbox_max) = (std::max)(k, boost::get<2>(bbox_max)); - } - - static const int neighbors_offset[6][3] = { { +1, 0, 0 }, - { -1, 0, 0 }, - { 0, +1, 0 }, - { 0, -1, 0 }, - { 0, 0, +1 }, - { 0, 0, -1 } }; - bool voxel_is_on_border = false; - - // Visit neighbors. - // (i_n, j_n, k_n) are indices of neighbors. - for(int n = 0; n < 6; ++n) - { - const ptrdiff_t i_n = i + neighbors_offset[n][0]; - const ptrdiff_t j_n = j + neighbors_offset[n][1]; - const ptrdiff_t k_n = k + neighbors_offset[n][2]; - if(i_n < 0 || i_n >= static_cast(nx) || - j_n < 0 || j_n >= static_cast(ny) || - k_n < 0 || k_n >= static_cast(nz)) - { - voxel_is_on_border = true; - continue; - } - else - { - if(transform(m_image.value(i_n, j_n, k_n)) == current_label) - { - if(visited[i_n][j_n][k_n] < pass) { - Indices indices(i_n, j_n, k_n, depth+1); - queue.push(indices); - } - } - else - voxel_is_on_border = true; - } - } // end for neighbors - - if(pass == 1 && voxel_is_on_border) - border.push_back(indices); - } // end if voxel not already visited - - if(queue.empty()) { - if(pass == 1) - { // End of first pass. Begin second pass with the voxels of - // the border. - for(typename Border_vector::const_iterator - border_it = border.begin(), border_end = border.end(); - border_it != border_end; ++border_it) - queue.push(*border_it); - pass = 2; - } - else // end of second pass, return the last visited voxel - { -// if(nb_voxels >= 100) - { - *it++ = std::make_pair(m_image.point(i, j, k), (depth+1)*max_v); - std::cerr << boost::format("Found seed %5%, which is voxel (%1%, %2%, %3%), value=%4%\n") - % i % j % k % m_image.value(i, j, k) % m_image.point(i, j, k); - } - } - } // end if queue.empty() - } // end while !queue.empty() (with local indices i, j, k) - - std::cerr << boost::format("There was %1% voxel(s) in that component.\n" - "The bounding box is (%2% %3% %4%, %5% %6% %7%).\n" - "%8% voxel(s) on border\n") - % nb_voxels - % boost::get<0>(bbox_min) % boost::get<1>(bbox_min) % boost::get<2>(bbox_min) - % boost::get<0>(bbox_max) % boost::get<1>(bbox_max) % boost::get<2>(bbox_max) - % border.size(); - } // end for i,j,k -} // end function Volume::search_for_connected_components() - -#endif // _VOLUME_H diff --git a/Surface_mesher/doc/Surface_mesher/PackageDescription.txt b/Surface_mesher/doc/Surface_mesher/PackageDescription.txt index 90efa88c31c..bf46b3a6eba 100644 --- a/Surface_mesher/doc/Surface_mesher/PackageDescription.txt +++ b/Surface_mesher/doc/Surface_mesher/PackageDescription.txt @@ -38,7 +38,6 @@ \cgalPkgDependsOn{\ref PkgTriangulation3} \cgalPkgBib{cgal:ry-smg} \cgalPkgLicense{\ref licensesGPL} -\cgalPkgDemo{Surface Mesh Generator,surface_mesher.zip} \cgalPkgShortInfoEnd \cgalPkgDescriptionEnd diff --git a/Surface_mesher/include/CGAL/Surface_mesher/Intersection_data_structure_3.h b/Surface_mesher/include/CGAL/Surface_mesher/Intersection_data_structure_3.h index 52f158a2918..453d4db1212 100644 --- a/Surface_mesher/include/CGAL/Surface_mesher/Intersection_data_structure_3.h +++ b/Surface_mesher/include/CGAL/Surface_mesher/Intersection_data_structure_3.h @@ -20,7 +20,6 @@ #include #include -#include #include #include @@ -144,7 +143,6 @@ public: void create_data_structure() { - using boost::bind; using boost::make_transform_iterator; max_width = CGAL_NTS max BOOST_PREVENT_MACRO_SUBSTITUTION diff --git a/Surface_sweep_2/test/Surface_sweep_2/cgal_test_base b/Surface_sweep_2/test/Surface_sweep_2/cgal_test_base index 59f380da802..52f282475ee 100755 --- a/Surface_sweep_2/test/Surface_sweep_2/cgal_test_base +++ b/Surface_sweep_2/test/Surface_sweep_2/cgal_test_base @@ -28,21 +28,33 @@ fi configure() { - echo "Configuring... " + echo "Configuring... " - rm CMakeCache.txt + rm CMakeCache.txt + if [ -f "$INIT_FILE" ] + then + if eval 'cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \ + -DCGAL_DIR="$CGAL_DIR" \ + -DCGAL_CXX_FLAGS:STRING="$CGAL_CXX_FLAGS $TESTSUITE_CXXFLAGS" \ + -DCGAL_EXE_LINKER_FLAGS="$CGAL_EXE_LINKER_FLAGS $TESTSUITE_LDFLAGS" \ + .' ; then + echo " successful configuration" >> $ERRORFILE + else + echo " ERROR: configuration" >> $ERRORFILE + fi + else + if eval 'cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \ + -DCGAL_DIR="$CGAL_DIR" \ + -DCGAL_CXX_FLAGS:STRING="$TESTSUITE_CXXFLAGS" \ + -DCGAL_EXE_LINKER_FLAGS="$TESTSUITE_LDFLAGS" \ + -DCMAKE_BUILD_TYPE=NOTFOUND \ + .' ; then - if eval 'cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \ - -DCGAL_DIR="$CGAL_DIR" \ - -DCGAL_CXX_FLAGS:STRING="$TESTSUITE_CXXFLAGS" \ - -DCGAL_EXE_LINKER_FLAGS="$TESTSUITE_LDFLAGS" \ - -DCMAKE_BUILD_TYPE=NOTFOUND \ - .' ; then - - echo " successful configuration" >> $ERRORFILE - else - echo " ERROR: configuration" >> $ERRORFILE - fi + echo " successful configuration" >> $ERRORFILE + else + echo " ERROR: configuration" >> $ERRORFILE + fi + fi } compile() 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 a5af1b6c1f0..4b2569c1607 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 @@ -40,8 +40,6 @@ guarantee the combinatorial validity of the resulting data structure. template< typename VertexBase, typename FaceBase > class Triangulation_data_structure_2 { public: - - /// \name Types /// @{ @@ -60,10 +58,9 @@ public: /// @} -/// \name +/// \name Ranges /// \cgalAdvancedBegin -/// In addition to the interface documented in the concept, -/// the class offers the following types. +/// In addition to the interface documented in the concept, the class offers the following types. /// \cgalAdvancedEnd /// @{ @@ -87,24 +84,24 @@ typedef Compact_container Face_range; /// @{ /*! -Returns a reference to the container of faces. +returns a reference to the container of faces. */ -Face_range & faces() const; +Face_range& faces() const; /*! -Returns a reference to the container of faces. +returns a reference to the container of faces. */ -Face_range & faces(); +Face_range& faces(); /*! -Returns a reference to the container of vertices. +returns a reference to the container of vertices. */ -Vertex_range & vertices() const; +Vertex_range& vertices() const; /*! -Returns a reference to the container of vertices. +returns a reference to the container of vertices. */ -Vertex_range & vertices(); +Vertex_range& vertices(); /// @} @@ -112,67 +109,58 @@ Vertex_range & vertices(); /// @{ /*! -Joins -the vertices that are endpoints of the edge `(f,i)`, and returns -a vertex handle to common vertex (see -Fig.\ \ref figtdssplitjoin). +joins the vertices that are endpoints of the edge `(f,i)`, and returns a vertex handle to common vertex +(see Fig.\ \ref figtdssplitjoin). + \pre `f` must be different from `Face_handle()` and `i` must be `0`, `1` or `2`. */ Vertex_handle join_vertices(Face_handle f, int i); /*! -Joins -the vertices that are endpoints of the edge `e`, and returns -a vertex handle to common vertex. +joins the vertices that are endpoints of the edge `e`, and returns a vertex handle to common vertex. */ Vertex_handle join_vertices(Edge e); /*! -Joins -the vertices that are endpoints of the edge `*eit`, and returns -a vertex handle to common vertex. +joins the vertices that are endpoints of the edge `*eit`, and returns a vertex handle to common vertex. */ Vertex_handle join_vertices(Edge_iterator eit); /*! -Joins -the vertices that are endpoints of the edge `*ec`, and returns -a vertex handle to common vertex. +joins the vertices that are endpoints of the edge `*ec`, and returns a vertex handle to common vertex. */ Vertex_handle join_vertices(Edges_circulator ec); /*! -Splits the vertex `v` into two vertices `v1` and -`v2`. The common faces `f` and `g` of `v1` and -`v2` are created after (in the counter-clockwise sense) the -faces `f1` and `f2`. The 4-tuple `(v1,v2,f,g)` is -returned (see Fig. \ref figtdssplitjoin). +splits the vertex `v` into two vertices `v1` and `v2`. + +The common faces `f` and `g` of `v1` and `v2` are created after (in the counter-clockwise sense) the +faces `f1` and `f2`. The 4-tuple `(v1,v2,f,g)` is returned (see Fig. \ref figtdssplitjoin). + \pre `dimension()` must be equal to `2`, `f1` and `f2` must be different from `Face_handle()` and `v` must be a vertex of both `f1` and `f2`. */ -boost::tuples::tuple -split_vertex(Vertex_handle v, Face_handle f1, Face_handle -f2); +boost::tuples::tuple +split_vertex(Vertex_handle v, Face_handle f1, Face_handle f2); /*! -Inserts -a degree two vertex and two faces adjacent to it that have two common -edges. The edge defined by the face handle `f` and the integer -`i` is duplicated. It returns a handle to the vertex created -(see Fig. \ref figtdsirdeg2). +inserts a degree two vertex and two faces adjacent to it that have two common edges. + +The edge defined by the face handle `f` and the integer `i` is duplicated. It returns a handle +to the vertex created (see Fig. \ref figtdsirdeg2). */ -Vertex_handle insert_degree_2(Face_handle f, int i); +Vertex_handle insert_degree_2(Face_handle f, int i); // @fixme Missing from SDG concept. Remove from here? Picture in Apollonius and SDG? /*! -Removes a degree 2 -vertex and the two faces adjacent to it. The two edges of the star of -`v` that are not incident to it are collapsed -(see Fig. \ref figtdsirdeg2). +removes a degree 2 vertex and the two faces adjacent to it. + +The two edges of the star of `v` that are not incident to it are collapsed (see Fig. \ref figtdsirdeg2). + \pre The degree of `v` must be equal to 2. */ -void remove_degree_2(Vertex_handle v); +void remove_degree_2(Vertex_handle v); // @fixme Missing from SDG concept. Remove from here? Picture in Apollonius and SDG? /// @} }; /* end Triangulation_data_structure_2 */ + } /* end namespace CGAL */ diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h index 613eea9a70d..90a4a4cf2d8 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h @@ -229,7 +229,7 @@ otherwise `Vertex_handle()` is returned. \pre The optional argument `v` is a vertex of `tds_src` or is `Vertex_handle()`. */ template -Vertex_handle tds.copy_tds(const TDS_src& tds_src, typename TDS_src::Vertex_handle v, const ConvertVertex& convert_vertex, const ConvertFace& convert_face); +Vertex_handle copy_tds(const TDS_src& tds_src, typename TDS_src::Vertex_handle v, const ConvertVertex& convert_vertex, const ConvertFace& convert_face); /*! Swaps the triangulation data structure and `tds1`. diff --git a/TDS_2/doc/TDS_2/TDS_2.txt b/TDS_2/doc/TDS_2/TDS_2.txt index 79080f93963..2444eb1fb60 100644 --- a/TDS_2/doc/TDS_2/TDS_2.txt +++ b/TDS_2/doc/TDS_2/TDS_2.txt @@ -74,7 +74,7 @@ equivalent to a two-dimensional triangulated sphere. This rules extends to lower dimensional triangulation data structure arising in degenerate cases or when the triangulations -have less than three vertices. +have fewer than three vertices. A one dimensional triangulation structure maintains a set of vertices and edges which forms a ring topologically equivalent to a \f$ 1\f$-sphere. diff --git a/TDS_3/include/CGAL/Triangulation_data_structure_3.h b/TDS_3/include/CGAL/Triangulation_data_structure_3.h index 7c01149ab44..29d4372c58d 100644 --- a/TDS_3/include/CGAL/Triangulation_data_structure_3.h +++ b/TDS_3/include/CGAL/Triangulation_data_structure_3.h @@ -3669,7 +3669,7 @@ is_valid(bool verbose, int level ) const { if ( number_of_vertices() < 2 ) { if (verbose) - std::cerr << "less than 2 vertices but dimension 0" << std::endl; + std::cerr << "fewer than 2 vertices but dimension 0" << std::endl; CGAL_triangulation_assertion(false); return false; } diff --git a/Testsuite/include/CGAL/Testsuite/Triangulation_23/test_move_semantic.h b/Testsuite/include/CGAL/Testsuite/Triangulation_23/test_move_semantic.h new file mode 100644 index 00000000000..3254fb6571f --- /dev/null +++ b/Testsuite/include/CGAL/Testsuite/Triangulation_23/test_move_semantic.h @@ -0,0 +1,69 @@ +// Copyright (c) 2021 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) : Laurent Rineau +// + + +#include + +namespace CGAL { + namespace Testsuite { + namespace Triangulation_23 { + template + void test_move_semantic(Tr source_tr) { + const auto dimension = source_tr.dimension(); + const auto nb_of_vertices = source_tr.number_of_vertices(); + auto check_triangulation_validity = [&](const Tr& tr) { + assert(tr.is_valid()); + assert(tr.number_of_vertices() == nb_of_vertices); + assert(tr.dimension() == dimension); + }; + auto check_moved_from_triangulation = [](const Tr& tr_copy) { + assert(tr_copy.dimension() == -2); + assert(tr_copy.number_of_vertices() + 1 == 0); + }; + auto check_empty_triangulation = [](const Tr& tr_copy2) { + assert(tr_copy2.dimension() == -1); + assert(tr_copy2.number_of_vertices() == 0); + }; + // move constructor + { + Tr tr_copy(source_tr); + check_triangulation_validity(tr_copy); + + Tr tr_move_constructed(std::move(tr_copy)); + check_triangulation_validity(tr_move_constructed); + check_moved_from_triangulation(tr_copy); + + Tr tr_copy2(source_tr); + Tr tr_move_constructed2(std::move(tr_copy2)); + check_moved_from_triangulation(tr_copy2); + tr_copy2.clear(); + check_empty_triangulation(tr_copy2); + + Tr tr_copy3(source_tr); + Tr tr_move_constructed3(std::move(tr_copy3)); + check_moved_from_triangulation(tr_copy3); + tr_copy3 = source_tr; + check_triangulation_validity(tr_copy3); + } + // move-assignment + { + Tr tr_copy4(source_tr); + Tr tr_move_assigned; + tr_move_assigned = std::move(tr_copy4); + check_triangulation_validity(tr_move_assigned); + check_moved_from_triangulation(tr_copy4); + } + }; + } + } +} diff --git a/Testsuite/test/collect_cgal_testresults_from_cmake b/Testsuite/test/collect_cgal_testresults_from_cmake index 1aa8768de40..2587aca5edb 100755 --- a/Testsuite/test/collect_cgal_testresults_from_cmake +++ b/Testsuite/test/collect_cgal_testresults_from_cmake @@ -9,8 +9,8 @@ if [ -z "${CGAL_TEST_PLATFORM}" ]; then - - CGAL_TEST_PLATFORM=`dirname $PWD` + + CGAL_TEST_PLATFORM=`dirname $PWD` echo "CGAL_TEST_PLATFORM not in the environment, setting it to ${CGAL_TEST_PLATFORM}" fi @@ -24,7 +24,6 @@ GENERAL_BUILD_LOGFILE='' PLATFORM_BUILD_LOGFILE='' TEST_REPORT='' RESULT_FILE='' -shared_or_static='' #print_testresult # print result on stdout @@ -53,12 +52,12 @@ print_testresult() then RESULT="w" else - if grep -E -q 'NOTICE: .*(need|require|incompatible).*and.*will not be' CompilerOutput_$1 - then - RESULT="r" + if grep -E -q 'NOTICE: .*(need|require|incompatible).*and.*will not be' CompilerOutput_$1 + then + RESULT="r" else RESULT="y" - fi + fi fi fi TIMING=`awk '/^ # Running time: / {print $4}' < ErrorOutput_$1` @@ -67,81 +66,19 @@ print_testresult() echo "$2 $RESULT" } - -parse_shared_or_static() -{ - if [ -f "${PLATFORM_BUILD_LOGFILE}" ] ; then - - if grep "Building shared libraries" ${PLATFORM_BUILD_LOGFILE} >/dev/null 2>&1; then - shared_or_static='shared' - else - shared_or_static='static' - fi - - else - shared_or_static='shared' - fi -} - parse_flags_and_third_party_choices() { - grep -e "^-- USING " ${PLATFORM_BUILD_LOGFILE} >> $RESULT_FILE + grep -e "^-- USING " ${PLATFORM_BUILD_LOGFILE} >> $RESULT_FILE echo "------------" >> $RESULT_FILE } -parse_lib_building_results() -{ - libname=$1 - target=$2 - - if [ ! -e "${libname}_${shared_or_static}" ]; then - mkdir "${libname}_${shared_or_static}" - fi - - y_or_no='n' - - configured='' - - if [ -f "${PLATFORM_BUILD_LOGFILE}" ]; then - - if grep -q "Built target ${target}" ${PLATFORM_BUILD_LOGFILE} ; then - y_or_no='y' - fi - - marker_beg=`grep -e "${target}.dir/depend$" ${PLATFORM_BUILD_LOGFILE} | head -1` - - if [ -n "${marker_beg}" ]; then - - configured='y' - - if [ ! "$target" = "CGAL" ]; then - cat ${PLATFORM_BUILD_LOGFILE} | sed -n "\|${marker_beg}|,\|depend$| p" >> ${libname}_${shared_or_static}/$TEST_REPORT - fi - - # Test if there is a warning in the build log. - if [ "$y_or_no" = "y" ]; then - # See the comment line 38. - if grep -i -E -q '(^|[^a-zA-Z_,:-])warning' ${libname}_${shared_or_static}/$TEST_REPORT ; then - y_or_no='w' - fi - fi - fi - fi - - if [ -z "${configured}" ] ; then - y_or_no='r' - echo "Not configured!" >> ${libname}_${shared_or_static}/$TEST_REPORT - fi - - echo ${libname}_${shared_or_static} $y_or_no >> $RESULT_FILE -} output_main_logs() { [ -e Installation ] || mkdir "Installation" - + INSTALLATION_TEST_REPORT="Installation/$TEST_REPORT" - + echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" echo " General Build Log " >> "$INSTALLATION_TEST_REPORT" echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" @@ -149,9 +86,9 @@ output_main_logs() if [ -f "${GENERAL_BUILD_LOGFILE}" ] ; then cat "${GENERAL_BUILD_LOGFILE}" >> "$INSTALLATION_TEST_REPORT" else - echo "Not found!" >> "$INSTALLATION_TEST_REPORT" + echo "Not found!" >> "$INSTALLATION_TEST_REPORT" fi - + echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" echo " Platform-specific Build Log " >> "$INSTALLATION_TEST_REPORT" echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" @@ -159,9 +96,9 @@ output_main_logs() if [ -f "${PLATFORM_BUILD_LOGFILE}" ] ; then cat "${PLATFORM_BUILD_LOGFILE}" >> "$INSTALLATION_TEST_REPORT" else - echo "Not found!" >> "$INSTALLATION_TEST_REPORT" + echo "Not found!" >> "$INSTALLATION_TEST_REPORT" fi - + if [ -f "$HOME/.autocgal_with_cmake_rc" ] ; then echo "" >> "$INSTALLATION_TEST_REPORT" echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" @@ -179,7 +116,7 @@ output_main_logs() cat "$HOME/.autocgalrc" >> "$INSTALLATION_TEST_REPORT" fi fi - + if [ -f "../setup" ] ; then echo "" >> "$INSTALLATION_TEST_REPORT" echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" @@ -188,8 +125,8 @@ output_main_logs() echo "" >> "$INSTALLATION_TEST_REPORT" cat "../setup" >> "$INSTALLATION_TEST_REPORT" fi - - + + echo "" >> "$INSTALLATION_TEST_REPORT" echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" echo " CMakeCache.txt" >> "$INSTALLATION_TEST_REPORT" @@ -198,9 +135,9 @@ output_main_logs() if [ -f "../CMakeCache.txt" ] ; then cat "../CMakeCache.txt" >> "$INSTALLATION_TEST_REPORT" else - echo "Not found!" >> "$INSTALLATION_TEST_REPORT" + echo "Not found!" >> "$INSTALLATION_TEST_REPORT" fi - + echo "" >> "$INSTALLATION_TEST_REPORT" echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" echo " include/CGAL/compiler_config.h" >> "$INSTALLATION_TEST_REPORT" @@ -209,9 +146,9 @@ output_main_logs() if [ -f "../include/CGAL/compiler_config.h" ] ; then cat "../include/CGAL/compiler_config.h" >> "$INSTALLATION_TEST_REPORT" else - echo "Not found!" >> "$INSTALLATION_TEST_REPORT" + echo "Not found!" >> "$INSTALLATION_TEST_REPORT" fi - + echo "" >> "$INSTALLATION_TEST_REPORT" echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" echo " CGALConfig.cmake" >> "$INSTALLATION_TEST_REPORT" @@ -220,9 +157,9 @@ output_main_logs() if [ -f "../CGALConfig.cmake" ] ; then cat "../CGALConfig.cmake" >> "$INSTALLATION_TEST_REPORT" else - echo "Not found!" >> "$INSTALLATION_TEST_REPORT" + echo "Not found!" >> "$INSTALLATION_TEST_REPORT" fi - + echo "" >> "$INSTALLATION_TEST_REPORT" echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" echo " CMakeError.log" >> "$INSTALLATION_TEST_REPORT" @@ -231,9 +168,9 @@ output_main_logs() if [ -f "../CMakeFiles/CMakeError.log" ] ; then cat "../CMakeFiles/CMakeError.log" >> "$INSTALLATION_TEST_REPORT" else - echo "Not found!" >> "$INSTALLATION_TEST_REPORT" + echo "Not found!" >> "$INSTALLATION_TEST_REPORT" fi - + echo "" >> "$INSTALLATION_TEST_REPORT" echo "---------------------------------------------------------------" >> "$INSTALLATION_TEST_REPORT" echo " CMakeOutput.log" >> "$INSTALLATION_TEST_REPORT" @@ -242,9 +179,9 @@ output_main_logs() if [ -f "../CMakeFiles/CMakeOutput.log" ] ; then cat "../CMakeFiles/CMakeOutput.log" >> "$INSTALLATION_TEST_REPORT" else - echo "Not found!" >> "$INSTALLATION_TEST_REPORT" + echo "Not found!" >> "$INSTALLATION_TEST_REPORT" fi - + } echo "---------------------------------------------------------------" @@ -271,17 +208,10 @@ echo "CGAL_TEST_PLATFORM ${CGAL_TEST_PLATFORM}" >> "$RESULT_FILE" echo "General installation log file: ${GENERAL_BUILD_LOGFILE}" >> "$RESULT_FILE" echo "Host-specific installation log file: ${PLATFORM_BUILD_LOGFILE}" >> "$RESULT_FILE" -parse_shared_or_static - -output_main_logs +output_main_logs parse_flags_and_third_party_choices -parse_lib_building_results "libCGAL" "CGAL" -parse_lib_building_results "libCGALCore" "CGAL_Core" -parse_lib_building_results "libCGALimageIO" "CGAL_ImageIO" -parse_lib_building_results "libCGALQt5" "CGAL_Qt5" - for DIR in $TEST_DIRECTORIES ; do if [ -d "$DIR" ] ; then echo " $DIR ..." diff --git a/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt b/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt index f797bcd0657..915f08fa948 100644 --- a/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt +++ b/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt @@ -18,7 +18,7 @@ endif() # Use Eigen for Mesh_3 find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) find_package(TBB QUIET) include(CGAL_TBB_support) @@ -37,7 +37,7 @@ create_single_source_cgal_program( "tetrahedral_remeshing_with_features.cpp") create_single_source_cgal_program( "tetrahedral_remeshing_of_one_subdomain.cpp") create_single_source_cgal_program( "tetrahedral_remeshing_from_mesh.cpp") create_single_source_cgal_program( "mesh_and_remesh_polyhedral_domain_with_features.cpp" ) -target_link_libraries(mesh_and_remesh_polyhedral_domain_with_features PUBLIC CGAL::Eigen_support) +target_link_libraries(mesh_and_remesh_polyhedral_domain_with_features PUBLIC CGAL::Eigen3_support) if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support) target_link_libraries(mesh_and_remesh_polyhedral_domain_with_features PRIVATE CGAL::TBB_support) endif() diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/FMLS.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/FMLS.h index abc0b02c4be..500279aad4b 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/FMLS.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/FMLS.h @@ -382,11 +382,17 @@ private: minMax[3 + j] = PN[6 * i + j]; } for (std::size_t i = 0; i < 3; i++) { - minMax[i] -= 0.001f; - minMax[3 + i] += 0.001f; + minMax[i] *= 0.99; + minMax[3 + i] *= 1.01; } + for (std::size_t i = 0; i < 3; i++) + { res[i] = (std::size_t)ceil((minMax[3 + i] - minMax[i]) / cellSize); + if(res[1] == 0) + res[i] = 1; + } + std::size_t LUTSize = res[0] * res[1] * res[2]; LUT.resize(LUTSize); LUT.assign(LUTSize, 0); @@ -463,7 +469,7 @@ private: { if (vp[j] < 0) p[j] = 0; - if (vp[j] >= res[j]) + else if (vp[j] >= res[j]) p[j] = res[j] - 1; else p[j] = static_cast(std::floor(vp[j])); 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 526d9dd7d82..4ce1fe25af0 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 @@ -219,7 +219,7 @@ public: Vertex_handle infinite_vertex = triangulation.infinite_vertex(); bool v0_updated = false; - for (const Cell_handle ch : find_incident) + for (const Cell_handle& ch : find_incident) { if (invalid_cells.find(ch) == invalid_cells.end()) //valid cell { @@ -445,7 +445,7 @@ bool is_valid_collapse(const typename C3t3::Edge& edge, c3t3.triangulation().finite_incident_cells(v0, std::back_inserter(cells_to_check)); - for (const Cell_handle ch : cells_to_check) + for (const Cell_handle& ch : cells_to_check) { if (!ch->has_vertex(v1)) { @@ -478,7 +478,7 @@ bool is_valid_collapse(const typename C3t3::Edge& edge, c3t3.triangulation().finite_incident_cells(v1, std::back_inserter(cells_to_check)); - for (const Cell_handle ch : cells_to_check) + for (const Cell_handle& ch : cells_to_check) { if (!ch->has_vertex(v0)) { @@ -792,7 +792,7 @@ collapse(const typename C3t3::Cell_handle ch, std::vector cells_to_remove; boost::unordered_set invalid_cells; - for(const Cell_handle c : inc_cells) + for(const Cell_handle& c : inc_cells) { const int v0_id = c->index(vh0); const int v1_id = c->index(vh1); @@ -838,7 +838,7 @@ collapse(const typename C3t3::Cell_handle ch, const Vertex_handle infinite_vertex = tr.infinite_vertex(); bool v0_updated = false; - for (const Cell_handle c : find_incident) + for (const Cell_handle& c : find_incident) { if (invalid_cells.find(c) == invalid_cells.end())//valid cell { @@ -856,7 +856,7 @@ collapse(const typename C3t3::Cell_handle ch, = { { {{0,1}}, {{0,2}}, {{0,3}}, {{1,2}}, {{1,3}}, {{2,3}} } }; //vertex indices in cells const Vertex_handle vkept = vh0; const Vertex_handle vdeleted = vh1; - for (const Cell_handle c : cells_to_update) + for (const Cell_handle& c : cells_to_update) { for (const std::array& ei : edges) { @@ -886,7 +886,7 @@ collapse(const typename C3t3::Cell_handle ch, // update complex facets //Update the vertex before removing it - for (const Cell_handle c : cells_to_update) + for (const Cell_handle& c : cells_to_update) { if (invalid_cells.find(c) == invalid_cells.end()) //valid cell { @@ -1005,7 +1005,7 @@ bool is_cells_set_manifold(const C3t3&, } boost::unordered_map edges; - for (const std::pair& fvv : facets) + for (const auto& fvv : facets) { if (fvv.second != 1) continue; @@ -1021,7 +1021,7 @@ bool is_cells_set_manifold(const C3t3&, } } - for (const std::pair& evv : edges) + for (const auto& evv : edges) if (evv.second != 2) return false; 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 d22d6fdf65c..7c784af9820 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/smooth_vertices.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/smooth_vertices.h @@ -162,7 +162,7 @@ private: } } - for (const std::pair& fn : fnormals) + for (const auto& fn : fnormals) { if(fn.second != CGAL::NULL_VECTOR) continue; @@ -347,7 +347,7 @@ private: v->set_point(typename Tr::Point(pv + frac * move)); bool valid_try = true; - for (const typename Tr::Cell_handle ci : inc_cells) + for (const typename Tr::Cell_handle& ci : inc_cells) { if (CGAL::POSITIVE != CGAL::orientation(point(ci->vertex(0)->point()), point(ci->vertex(1)->point()), diff --git a/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt b/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt index 69ffa77d16c..e6a8b631884 100644 --- a/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt +++ b/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt @@ -29,8 +29,8 @@ create_single_source_cgal_program( # Tests using Mesh_3 require Eigen find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) -include(CGAL_Eigen_support) -if(NOT TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(NOT TARGET CGAL::Eigen3_support) message( STATUS "This project requires the Eigen library, and will not be compiled.") return() @@ -39,9 +39,9 @@ endif() create_single_source_cgal_program( "test_mesh_and_remesh_polyhedral_domain_with_features.cpp") target_link_libraries(test_mesh_and_remesh_polyhedral_domain_with_features - PUBLIC CGAL::Eigen_support) + PUBLIC CGAL::Eigen3_support) if(CGAL_ImageIO_USE_ZLIB) create_single_source_cgal_program("test_mesh_and_remesh_image.cpp") - target_link_libraries(test_mesh_and_remesh_image PUBLIC CGAL::Eigen_support) + target_link_libraries(test_mesh_and_remesh_image PUBLIC CGAL::Eigen3_support) endif() diff --git a/Three/include/CGAL/Three/Scene_draw_interface.h b/Three/include/CGAL/Three/Scene_draw_interface.h index 09237363ad1..daac76b2d6f 100644 --- a/Three/include/CGAL/Three/Scene_draw_interface.h +++ b/Three/include/CGAL/Three/Scene_draw_interface.h @@ -63,13 +63,13 @@ public: * \return true if the TextItem is visible. */ virtual bool testDisplayId(double x, double y, double z, CGAL::Three::Viewer_interface* viewer) = 0; - ///\brief displays all the vertices ids if there are less than max_textItems. + ///\brief displays all the vertices ids if there are fewer than max_textItems. virtual void printVertexIds() = 0; - ///\brief displays all the edges ids if there are less than max_textItems. + ///\brief displays all the edges ids if there are fewer than max_textItems. virtual void printEdgeIds() = 0; - ///\brief displays all the faces ids if there are less than max_textItems. + ///\brief displays all the faces ids if there are fewer than max_textItems. virtual void printFaceIds() = 0; - ///\brief displays all the primitive ids if there are less than max_textItems. + ///\brief displays all the primitive ids if there are fewer than max_textItems. virtual void printAllIds() = 0; //!\brief moves the camera orthogonally to the picked face. diff --git a/Triangulation/applications/Triangulation/CMakeLists.txt b/Triangulation/applications/Triangulation/CMakeLists.txt index 3c3de41bc4e..57cb2de2f90 100644 --- a/Triangulation/applications/Triangulation/CMakeLists.txt +++ b/Triangulation/applications/Triangulation/CMakeLists.txt @@ -20,7 +20,7 @@ if(NOT Boost_FOUND) endif() find_package(Eigen3 3.1.0) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) # include for local directory include_directories(BEFORE include) @@ -31,6 +31,6 @@ include_directories(BEFORE include) # ########################################################## create_single_source_cgal_program("points_to_RT_to_off.cpp") -target_link_libraries(points_to_RT_to_off PUBLIC CGAL::Eigen_support) +target_link_libraries(points_to_RT_to_off PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("points_to_DT_to_off.cpp") -target_link_libraries(points_to_DT_to_off PUBLIC CGAL::Eigen_support) +target_link_libraries(points_to_DT_to_off PUBLIC CGAL::Eigen3_support) diff --git a/Triangulation/benchmark/Triangulation/CMakeLists.txt b/Triangulation/benchmark/Triangulation/CMakeLists.txt index 79c84e05cb7..54d7db39a3f 100644 --- a/Triangulation/benchmark/Triangulation/CMakeLists.txt +++ b/Triangulation/benchmark/Triangulation/CMakeLists.txt @@ -9,13 +9,13 @@ find_package(CGAL REQUIRED COMPONENTS Core) include(${CGAL_USE_FILE}) find_package(Eigen3 3.1.0) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) include_directories(BEFORE "include") create_single_source_cgal_program("delaunay.cpp") - target_link_libraries(delaunay PUBLIC CGAL::Eigen_support) + target_link_libraries(delaunay PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("Td_vs_T2_and_T3.cpp") - target_link_libraries(Td_vs_T2_and_T3 PUBLIC CGAL::Eigen_support) + target_link_libraries(Td_vs_T2_and_T3 PUBLIC CGAL::Eigen3_support) else() message( diff --git a/Triangulation/doc/Triangulation/CGAL/Regular_triangulation.h b/Triangulation/doc/Triangulation/CGAL/Regular_triangulation.h index 7e552c06494..54d9f9d9a73 100644 --- a/Triangulation/doc/Triangulation/CGAL/Regular_triangulation.h +++ b/Triangulation/doc/Triangulation/CGAL/Regular_triangulation.h @@ -123,6 +123,53 @@ type `Weighted_point`. template< typename ForwardIterator > std::ptrdiff_t insert(ForwardIterator s, ForwardIterator e); +/*! +inserts the weighted point `p` in the triangulation on the +condition that the vertex `star_center` appears +in the conflict zone of `p` (that is, `p` would appear +in the star of `star_center` after the insertion). + +If the insertion of `p` creates a new vertex, this vertex is returned. +Otherwise, a default constructed handle is returned. + +If the dimension of the triangulation is `0` and if `p` coincides +with an existing vertex and has a greater weight, +then `p` replaces it as vertex of the triangulation +and this vertex is returned. + +If `p` coincides with an already existing vertex, with both point and +weights being equal, then this vertex is returned and the triangulation +remains unchanged. + +By convention, if the insertion of `p` would increase the dimension +of the triangulation, it is inserted. + +Prior to the actual insertion, `p` is located in the triangulation; +`start` is used as a starting place for locating `p`. + +\sa `Regular_triangulation::compute_conflict_zone()` +*/ +Vertex_handle insert_if_in_star(const Weighted_point& p, Vertex_handle star_center, + Full_cell_handle start = Full_cell_handle()); + +/*! +Same as the above `insert_if_in_star()`, but uses a vertex as starting place for the search. +*/ +Vertex_handle insert_if_in_star(const Weighted_point& p, Vertex_handle star_center, + Vertex_handle hint); + +/*! +inserts the weighted point `p` in the triangulation. + +This function is similar to the above `insert_if_in_star()` function, +but takes as additional parameters the return values of the location query +of `p`. + +\sa `Triangulation::locate()`. +*/ +Vertex_handle insert_if_in_star(const Weighted_point& p, Vertex_handle star_center, Locate_type lt, + const Face& f, const Facet& ft, Full_cell_handle s); + /// @} /// \name Queries diff --git a/Triangulation/examples/Triangulation/CMakeLists.txt b/Triangulation/examples/Triangulation/CMakeLists.txt index 0294d48817b..4d6587a7f27 100644 --- a/Triangulation/examples/Triangulation/CMakeLists.txt +++ b/Triangulation/examples/Triangulation/CMakeLists.txt @@ -15,8 +15,8 @@ endif() find_package(CGAL REQUIRED) find_package(Eigen3 3.1.0) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("barycentric_subdivision.cpp") create_single_source_cgal_program("delaunay_triangulation.cpp") create_single_source_cgal_program("convex_hull.cpp") @@ -34,7 +34,7 @@ if(TARGET CGAL::Eigen_support) triangulation triangulation_data_structure_dynamic triangulation_data_structure_static) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() else() message( diff --git a/Triangulation/include/CGAL/Regular_triangulation.h b/Triangulation/include/CGAL/Regular_triangulation.h index fddb395c036..86075657b06 100644 --- a/Triangulation/include/CGAL/Regular_triangulation.h +++ b/Triangulation/include/CGAL/Regular_triangulation.h @@ -974,7 +974,8 @@ Regular_triangulation // => we don't insert it if (!in_conflict) { - m_hidden_points.push_back(p); + if(only_if_this_vertex_is_in_the_cz == Vertex_handle()) + m_hidden_points.push_back(p); return Vertex_handle(); } else diff --git a/Triangulation/test/Triangulation/CMakeLists.txt b/Triangulation/test/Triangulation/CMakeLists.txt index 38538a731ea..a21d7eab39a 100644 --- a/Triangulation/test/Triangulation/CMakeLists.txt +++ b/Triangulation/test/Triangulation/CMakeLists.txt @@ -15,8 +15,8 @@ endif() find_package(CGAL REQUIRED) find_package(Eigen3 3.1.0) -include(CGAL_Eigen_support) -if(TARGET CGAL::Eigen_support) +include(CGAL_Eigen3_support) +if(TARGET CGAL::Eigen3_support) include_directories(BEFORE "include") create_single_source_cgal_program("test_triangulation.cpp") @@ -27,7 +27,7 @@ if(TARGET CGAL::Eigen_support) create_single_source_cgal_program("test_insert_if_in_star.cpp") foreach(target test_triangulation test_delaunay test_regular test_tds test_torture test_insert_if_in_star) - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() else() diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h index 0a26f8ee02d..eae059ac51e 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h @@ -39,7 +39,7 @@ public: /*! A function object whose `operator()` computes the intersection of two segments. -`Object_2 operator()(Segment_2 s1, Segment_2 s2);` +`boost:optional > operator()(Segment_2 s1, Segment_2 s2);` Returns the intersection of `s1` and `s2`. */ typedef unspecified_type Intersect_2; @@ -113,4 +113,3 @@ compute_squared_distance_2_object(); /// @} }; /* end ConstrainedTriangulationTraits_2 */ - diff --git a/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt b/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt index 009f3845620..37544f3f199 100644 --- a/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt +++ b/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt @@ -165,7 +165,7 @@ Infinite vertex and infinite faces This extends to lower dimensional triangulations arising in degenerate cases or when the triangulations -as less than three vertices. +has fewer than three vertices. Including the infinite faces, a one dimensional triangulation is a ring of edges and vertices diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h index 1ec49ab1581..32317818174 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h @@ -1710,23 +1710,34 @@ compute_intersection(const Gt& gt, const typename Gt::Point_2& pd, typename Gt::Point_2& pi) { - typename Gt::Intersect_2 compute_intersec=gt.intersect_2_object(); - typename Gt::Construct_segment_2 - construct_segment=gt.construct_segment_2_object(); - Object result = compute_intersec(construct_segment(pa,pb), - construct_segment(pc,pd)); + typedef typename Gt::Point_2 Point_2; + + typename Gt::Intersect_2 compute_intersec = gt.intersect_2_object(); + typename Gt::Construct_segment_2 construct_segment = gt.construct_segment_2_object(); + + auto // CGAL::cpp11::result_of::type + result = compute_intersec(construct_segment(pa,pb), + construct_segment(pc,pd)); + + #ifdef CGAL_CDT_2_DEBUG_INTERSECTIONS - typename Gt::Segment_2 s; - if(assign(s, result)) { - std::cerr << CGAL::internal::cdt_2_indent_level - << "compute_intersection: " << s << '\n'; - } - if(assign(pi, result)) { - std::cerr << CGAL::internal::cdt_2_indent_level - << "compute_intersection: " << pi << '\n'; + typedef typename Gt::Segment_2 Segment_2; + if(result){ + if (const Segment_2* s = boost::get(&*result)){ + std::cerr << CGAL::internal::cdt_2_indent_level + << "compute_intersection: " << *s << '\n'; + }else if(const Point_2* p = boost::get(&*result)) + std::cerr << CGAL::internal::cdt_2_indent_level + << "compute_intersection: " << *p << '\n'; } #endif // CGAL_CDT_2_DEBUG_INTERSECTIONS - return assign(pi, result); + if(result){ + if(const Point_2* p = boost::get(&*result)){ + pi = *p; + return true; + } + } + return false; } diff --git a/Triangulation_2/include/CGAL/Regular_triangulation_2.h b/Triangulation_2/include/CGAL/Regular_triangulation_2.h index f9bf3b1ceb8..49a20bd585d 100644 --- a/Triangulation_2/include/CGAL/Regular_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Regular_triangulation_2.h @@ -22,7 +22,6 @@ #include #include -#include #include #include #include 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 be275140aec..4b739c74f2c 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 @@ -46,14 +46,13 @@ private: class Node { public: explicit Node(Vertex_handle vh, bool input = false) - : vertex_(vh), id(-1), input(input) + : vertex_(vh), input(input) {} const Point& point() const { return vertex_->point(); } Vertex_handle vertex() const { return vertex_; } private: Vertex_handle vertex_; public: - int id; bool input; }; @@ -585,45 +584,58 @@ void Polyline_constraint_hierarchy_2::simplify(Vertex_it uc, Vertex_it wc) { + // TODO: How do we (want to) deal with u == w ??? Vertex_handle u = *uc, v = *vc, w = *wc; typename Sc_to_c_map::iterator uv_sc_iter = sc_to_c_map.find(make_edge(u, v)); - CGAL_assertion_msg( uv_sc_iter != sc_to_c_map.end(), "not a subconstraint" ); + typename Sc_to_c_map::iterator vw_sc_iter = sc_to_c_map.find(make_edge(v, w)); Context_list* uv_hcl = uv_sc_iter->second; - CGAL_assertion_msg((u == w) || (uv_hcl->size() == 1), "more than one constraint passing through the subconstraint" ); - - if(*(uv_hcl->front().current()) != u) { - std::swap(u,w); - uv_sc_iter = sc_to_c_map.find(make_edge(u, v)); - CGAL_assertion_msg( uv_sc_iter != sc_to_c_map.end(), "not a subconstraint" ); - uv_hcl = (*uv_sc_iter).second; - CGAL_assertion_msg((u == w) || (uv_hcl->size() == 1), "more than one constraint passing through the subconstraint" ); - } - // now u,v, and w are ordered along the polyline constraint + Context_list* vw_hcl = vw_sc_iter->second; + // AF: what is input() about??? if(vc.input()){ uc.input() = true; wc.input() = true; } - typename Sc_to_c_map::iterator vw_sc_iter = sc_to_c_map.find(make_edge(v, w)); - CGAL_assertion_msg( vw_sc_iter != sc_to_c_map.end(), "not a subconstraint" ); - Context_list* vw_hcl = vw_sc_iter->second; - CGAL_assertion_msg((u == w) || (vw_hcl->size() == 1), "more than one constraint passing through the subconstraint" ); - Vertex_list* vertex_list = uv_hcl->front().id().vl_ptr(); - CGAL_assertion_msg(vertex_list == vw_hcl->front().id().vl_ptr(), "subconstraints from different polyline constraints" ); - // Remove the list item which points to v - vertex_list->skip(vc.base()); - - if(u != w){ - // Remove the entries for [u,v] and [v,w] - sc_to_c_map.erase(uv_sc_iter); - sc_to_c_map.erase(vw_sc_iter); - delete vw_hcl; - // reuse other context list - sc_to_c_map[make_edge(u,w)] = uv_hcl; - }else{ - sc_to_c_map.erase(uv_sc_iter); - delete vw_hcl; + // Take contexts from the two context lists depending on the orientation of the constraints + // These are the contexts where current is either u or w + // remove from uv_hcl the contexts where current is not u + // remove from vw_hcl the contexts where current is not w + // splice into uv_hcl + typename Context_list::iterator it = uv_hcl->begin(); + while(it != uv_hcl->end()){ + if((*it->current()) != u){ + it = uv_hcl->erase(it); + }else{ + // 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); + vertex_list->skip(vc_in_context.base()); + ++it; + } } + it = vw_hcl->begin(); + while(it != vw_hcl->end()){ + if((*it->current()) != w){ + it = vw_hcl->erase(it); + }else{ + // 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); + vertex_list->skip(vc_in_context.base()); + ++it; + } + } + + uv_hcl->splice(uv_hcl->end(),*vw_hcl); + delete vw_hcl; + + sc_to_c_map.erase(uv_sc_iter); + sc_to_c_map.erase(vw_sc_iter); + + // reuse other context list + sc_to_c_map[make_edge(u,w)] = uv_hcl; } diff --git a/Triangulation_2/include/CGAL/Triangulation_2/internal/Triangulation_2_projection_traits_base_3.h b/Triangulation_2/include/CGAL/Triangulation_2/internal/Triangulation_2_projection_traits_base_3.h index 984d2381035..9a160041dda 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2/internal/Triangulation_2_projection_traits_base_3.h +++ b/Triangulation_2/include/CGAL/Triangulation_2/internal/Triangulation_2_projection_traits_base_3.h @@ -185,7 +185,8 @@ public: CGAL_TIME_PROFILER("Construct Projected_intersect_3") } - Object operator()(const Segment& s1, const Segment& s2) + boost::optional > + operator()(const Segment& s1, const Segment& s2) { CGAL_PROFILER("Projected_intersect_3::operator()") CGAL_TIME_PROFILER("Projected_intersect_3::operator()") @@ -200,12 +201,12 @@ public: const Plane_3 plane_1(s1.source(), u1); const Plane_3 plane_2(s2.source(), u2); - Object planes_intersection = intersection(plane_1, plane_2); - if(planes_intersection.empty()) { + auto planes_intersection = intersection(plane_1, plane_2); + if(! planes_intersection) { std::cerr << "planes_intersection is empty\n"; - return planes_intersection; + return boost::none; } - if(const Line* line = object_cast(&planes_intersection)) + if(const Line* line = boost::get(&*planes_intersection)) { const Point& pi = line->point(0); if(cross_product(normal, pi - s1.source()) @@ -216,25 +217,32 @@ public: { // the intersection of the lines is not inside the segments std::cerr << "intersection not inside\n"; - return Object(); + return boost::none; } else { // Let the plane passing through s1.source() and with normal // the cross product of s1.to_vector() and s2.to_vector(). That // plane should intersect *l, now. - return intersection(*line, Plane_3(s1.source(), - cross_product(s1.to_vector(), - s2.to_vector()))); + auto inter = intersection(*line, Plane_3(s1.source(), + cross_product(s1.to_vector(), + s2.to_vector()))); + if(! inter){ + return boost::none; + } + if(const Point* point = boost::get(&*inter)){ + typedef boost::variant variant_type; + return boost::make_optional(variant_type(*point)); + } } } - if(object_cast(&planes_intersection)) + if(boost::get(&*planes_intersection)) { std::cerr << "coplanar lines\n"; CGAL_error(); - return Object(); + return boost::none; } - return Object(); + return boost::none; } }; // end class Projected_intersect_3 @@ -281,6 +289,33 @@ public: } }; // end class Compare_along_axis +template +class Less_xy_along_axis +{ + // private members + typedef typename Traits::Vector_3 Vector_3; + typedef typename Traits::Point_2 Point; + Vector_3 base1, base2; +public: + Less_xy_along_axis(const Vector_3& base1, const Vector_3& base2) : base1(base1), base2(base2) + { + CGAL_PROFILER("Construct Less_xy_along_axis") + CGAL_TIME_PROFILER("Construct Less_xy_along_axis") + } + + typedef bool result_type; + + bool operator() (const Point &p, const Point &q) const { + + Compare_along_axis cx(base1); + Comparison_result crx = cx(p, q); + if (crx == SMALLER) { return true; } + if (crx == LARGER) { return false; } + Less_along_axis ly(base2); + return ly(p, q); + } +}; // end class Less_xy_along_axis + } // end namespace TriangulationProjectionTraitsCartesianFunctors @@ -345,6 +380,8 @@ public: Less_along_axis Less_x_2; typedef TriangulationProjectionTraitsCartesianFunctors:: Less_along_axis Less_y_2; + typedef TriangulationProjectionTraitsCartesianFunctors:: + Less_xy_along_axis Less_xy_2; typedef TriangulationProjectionTraitsCartesianFunctors:: Projected_orientation_with_normal_3 Orientation_2; @@ -385,6 +422,12 @@ public: return Less_y_2(this->base2()); } + Less_xy_2 + less_xy_2_object() const + { + return Less_xy_2(this->base1(), this->base2()); + } + Compare_x_2 compare_x_2_object() const { diff --git a/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h b/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h index 266c4964e03..679ace59a24 100644 --- a/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h @@ -37,6 +37,7 @@ #include #include #include +#include namespace CGAL { @@ -82,7 +83,14 @@ public: #endif private: - // here is the stack of triangulations which form the hierarchy + void init_hierarchy() { + hierarchy[0] = this; + for(int i=1; i hierarchy_triangulations; std::array hierarchy; boost::rand48 random; @@ -93,13 +101,10 @@ public: Triangulation_hierarchy_2(Triangulation_hierarchy_2&& other) noexcept( noexcept(Tr_Base(std::move(other))) ) : Tr_Base(std::move(other)) + , hierarchy_triangulations(std::move(other.hierarchy_triangulations)) , random(std::move(other.random)) { - hierarchy[0] = this; - for(int i=1; i @@ -107,10 +112,7 @@ public: const Geom_traits& traits = Geom_traits()) : Tr_Base(traits) { - hierarchy[0] = this; - for(int i=1;i(*this) = std::move(other); - hierarchy[0] = this; - for(int i=1; i Triangulation_hierarchy_2:: Triangulation_hierarchy_2(const Geom_traits& traits) : Tr_Base(traits) + , hierarchy_triangulations( + make_filled_array(traits)) { - hierarchy[0] = this; - for(int i=1;i Triangulation_hierarchy_2:: Triangulation_hierarchy_2(const Triangulation_hierarchy_2 &tr) - : Tr_Base() + : Triangulation_hierarchy_2(tr.geom_traits()) { - // create an empty triangulation to be able to delete it ! - hierarchy[0] = this; - for(int i=1;i:: swap(Triangulation_hierarchy_2 &tr) { - Tr_Base* temp; Tr_Base::swap(tr); - for(int i= 1; i -Triangulation_hierarchy_2:: -~Triangulation_hierarchy_2() -{ - clear(); - for(int i= 1; i diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 60d15734b2f..fef579d2ff0 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -17,6 +17,7 @@ #ifdef CGAL_USE_BASIC_VIEWER +#include #include #include @@ -144,6 +145,7 @@ void draw(const CGAL_T2_TYPE& at2, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc=1; const char* argv[2]={"t2_viewer","\0"}; QApplication app(argc,const_cast(argv)); diff --git a/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_triangulation_short_2.h b/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_triangulation_short_2.h index d34268631cf..249b1d9e115 100644 --- a/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_triangulation_short_2.h +++ b/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_triangulation_short_2.h @@ -31,6 +31,7 @@ #include #include #include +#include template @@ -281,6 +282,15 @@ _test_cls_triangulation_short_2( const Triangul &) assert( T2_3_4.number_of_vertices() == 11 ); assert( T2_3_4.is_valid() ); + /****************************/ + /******* MOVE SEMANTIC*******/ + + std::cout << " move constructors and move assignment" << std::endl; + namespace test_tr_23 = CGAL::Testsuite::Triangulation_23; + test_tr_23::test_move_semantic(T0_1); + test_tr_23::test_move_semantic(T1_5); + test_tr_23::test_move_semantic(T2_8); + test_tr_23::test_move_semantic(T2_3); /*********************************************/ /****** FINITE/INFINITE VERTICES/FACES *******/ diff --git a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt index ddd0963b4a9..1c4f8aade5d 100644 --- a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt @@ -20,7 +20,7 @@ set(CMAKE_AUTOMOC ON) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS OpenGL Xml) +find_package(Qt5 QUIET COMPONENTS OpenGL) if(Qt5_FOUND) add_definitions(-DQT_NO_KEYWORDS) @@ -70,7 +70,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) 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 Qt5::Xml) + target_link_libraries(T3_demo PRIVATE Qt5::OpenGL) if(TARGET CGAL::TBB_support) target_link_libraries(T3_demo PUBLIC CGAL::TBB_support) endif() diff --git a/Triangulation_3/demo/Triangulation_3/T3_demo.cpp b/Triangulation_3/demo/Triangulation_3/T3_demo.cpp index 7b70c57dd07..aef465639ff 100644 --- a/Triangulation_3/demo/Triangulation_3/T3_demo.cpp +++ b/Triangulation_3/demo/Triangulation_3/T3_demo.cpp @@ -13,18 +13,17 @@ #include "MainWindow.h" #include +#include int main(int argc, char** argv) { + CGAL::Qt::init_ogl_context(2, 1); + QApplication app(argc, argv); app.setOrganizationDomain("inria.fr"); app.setOrganizationName("INRIA"); app.setApplicationName("3D Triangulation Demo"); - //for windows -#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) - app.setAttribute(Qt::AA_UseDesktopOpenGL); -#endif MainWindow mw; mw.show(); diff --git a/Triangulation_3/examples/Triangulation_3/CMakeLists.txt b/Triangulation_3/examples/Triangulation_3/CMakeLists.txt index 5453babb101..f7942bdfd5d 100644 --- a/Triangulation_3/examples/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/examples/Triangulation_3/CMakeLists.txt @@ -53,6 +53,14 @@ if(TARGET CGAL::TBB_support) target_link_libraries(parallel_insertion_in_delaunay_3 PUBLIC CGAL::TBB_support) target_link_libraries(sequential_parallel PUBLIC CGAL::TBB_support) + + if(BUILD_TESTING) + set_property(TEST + execution___of__parallel_insertion_and_removal_in_regular_3 + execution___of__parallel_insertion_in_delaunay_3 + execution___of__sequential_parallel + PROPERTY RUN_SERIAL 1) + endif() else() message(STATUS "NOTICE: a few examples require TBB and will not be compiled.") endif() diff --git a/Triangulation_3/include/CGAL/Regular_triangulation_3.h b/Triangulation_3/include/CGAL/Regular_triangulation_3.h index d927efad23b..34186b034a0 100644 --- a/Triangulation_3/include/CGAL/Regular_triangulation_3.h +++ b/Triangulation_3/include/CGAL/Regular_triangulation_3.h @@ -55,7 +55,6 @@ #include #endif -#include #include #include #include diff --git a/Triangulation_3/include/CGAL/Triangulation_3.h b/Triangulation_3/include/CGAL/Triangulation_3.h index 4e4c5606545..df69bf1f1b6 100644 --- a/Triangulation_3/include/CGAL/Triangulation_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_3.h @@ -53,7 +53,6 @@ #include #include -#include #include #include #include @@ -7294,22 +7293,10 @@ operator==(const Triangulation_3& t1, std::vector V2 (t2.points_begin(), t2.points_end()); std::sort(V1.begin(), V1.end(), - boost::bind( - cmp1, - boost::bind< - typename boost::result_of::type>(cp, _1), - boost::bind< - typename boost::result_of::type>(cp, _2)) - == SMALLER); + [&cmp1, &cp](const Point& p1, const Point& p2){ return cmp1(cp(p1), cp(p2))==SMALLER; }); std::sort(V2.begin(), V2.end(), - boost::bind( - cmp2, - boost::bind< - typename boost::result_of::type>(cp, _1), - boost::bind< - typename boost::result_of::type>(cp, _2)) - == SMALLER); + [&cmp2, &cp](const Point& p1, const Point& p2){ return cmp2(cp(p1), cp(p2))==SMALLER; }); return V1 == V2; } diff --git a/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h b/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h index 0831c09c656..82ed6720199 100644 --- a/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h @@ -51,6 +51,7 @@ #include #include +#include #endif //CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO @@ -92,7 +93,14 @@ public: private: + void init_hierarchy() { + hierarchy[0] = this; + for(int i=1; i hierarchy_triangulations; std::array hierarchy; boost::rand48 random; @@ -111,24 +119,20 @@ public: Triangulation_hierarchy_3(Triangulation_hierarchy_3&& other) noexcept( noexcept(Tr_Base(std::move(other))) ) : Tr_Base(std::move(other)) + , hierarchy_triangulations(std::move(other.hierarchy_triangulations)) , random(std::move(other.random)) { - hierarchy[0] = this; - for(int i=1; i Triangulation_hierarchy_3(InputIterator first, InputIterator last, const Geom_traits& traits = Geom_traits()) : Tr_Base(traits) + , hierarchy_triangulations(make_filled_array(traits)) { - hierarchy[0] = this; - for(int i=1; i(*this) = std::move(other); - hierarchy[0] = this; - for(int i=1; i Triangulation_hierarchy_3:: Triangulation_hierarchy_3(const Geom_traits& traits) : Tr_Base(traits) + , hierarchy_triangulations(make_filled_array(traits)) { - hierarchy[0] = this; - for(int i=1;i Triangulation_hierarchy_3:: Triangulation_hierarchy_3(const Triangulation_hierarchy_3 &tr) : Tr_Base(tr) + , hierarchy_triangulations(tr.hierarchy_triangulations) { - hierarchy[0] = this; - for(int i=1; i:: random_level() { - boost::geometric_distribution<> proba(1.0/ratio); + boost::geometric_distribution<> proba(1.0/double(ratio)); boost::variate_generator > die(random, proba); return (std::min)(die(), (int)maxlevel)-1; diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 11d25a28f29..0c778ca08a7 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -17,6 +17,7 @@ #ifdef CGAL_USE_BASIC_VIEWER +#include #include #include @@ -150,6 +151,7 @@ void draw(const CGAL_T3_TYPE& at3, if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc=1; const char* argv[2]={"t3_viewer","\0"}; QApplication app(argc,const_cast(argv)); diff --git a/Triangulation_3/test/Triangulation_3/CMakeLists.txt b/Triangulation_3/test/Triangulation_3/CMakeLists.txt index 86f7889cdbe..c0c171ac10f 100644 --- a/Triangulation_3/test/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/test/Triangulation_3/CMakeLists.txt @@ -35,6 +35,13 @@ if(TARGET CGAL::TBB_support) test_regular_insert_range_with_info) target_link_libraries(${target} PUBLIC CGAL::TBB_support) endforeach() + if(BUILD_TESTING) + set_property(TEST + execution___of__test_delaunay_3 + execution___of__test_regular_3 + execution___of__test_regular_insert_range_with_info + PROPERTY RUN_SERIAL 1) + endif() endif() if(BUILD_TESTING) 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 f7d4579828c..21178f53eed 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 @@ -31,6 +31,7 @@ #include #include #include +#include // Accessory set of functions to differentiate between // Delaunay::nearest_vertex[_in_cell] and @@ -421,7 +422,8 @@ _test_cls_delaunay_3(const Triangulation &) assert(T1.number_of_vertices() == 0); assert(T1.is_valid()); - + namespace test_tr_23 = CGAL::Testsuite::Triangulation_23; + test_tr_23::test_move_semantic(T0); // Affectation : T1=T0; @@ -454,6 +456,7 @@ _test_cls_delaunay_3(const Triangulation &) assert(T1_0.dimension()==1); assert(T1_0.number_of_vertices()==n); assert(T1_0.is_valid()); + test_tr_23::test_move_semantic(T1_0); std::cout << " Constructor7 " << std::endl; Cls T1_1; n = T1_1.insert(l2.begin(),l2.end()); @@ -514,6 +517,8 @@ _test_cls_delaunay_3(const Triangulation &) assert(T2_0.dimension()==2); assert(T2_0.number_of_vertices()==8); + test_tr_23::test_move_semantic(T2_0); + { Cls Tfromfile; std::cout << " I/O" << std::endl; @@ -562,6 +567,8 @@ _test_cls_delaunay_3(const Triangulation &) assert(T3_0.number_of_vertices()==125); assert(T3_0.dimension()==3); + test_tr_23::test_move_semantic(T3_0); + if (del) { std::cout << " deletion in Delaunay - grid case - (dim 3) " << std::endl; @@ -1194,6 +1201,19 @@ _test_cls_delaunay_3(const Triangulation &) _test_remove_cluster(); } + // Test from issue https://github.com/CGAL/cgal/issues/5396 + { + auto Triangulate = []() -> Triangulation + { + Triangulation tri; + for (int i=0; i<10; i++) + tri.insert(Point(i+1, i+2, i+3)); + + return tri; + }; + auto t = Triangulate(); + auto t2 = std::move(t); + } } #endif // CGAL_TEST_CLS_DELAUNAY_C diff --git a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_regular_3.h b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_regular_3.h index fba2db023fd..ea40d75963e 100644 --- a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_regular_3.h +++ b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_regular_3.h @@ -17,6 +17,8 @@ #include #include #include +#include + template void _test_cls_regular_3(const Triangulation &) @@ -205,6 +207,7 @@ _test_cls_regular_3(const Triangulation &) << T.number_of_vertices() << std::endl; assert(T.is_valid()); assert(T.dimension()==3); + + namespace test_tr_23 = CGAL::Testsuite::Triangulation_23; + test_tr_23::test_move_semantic(T); } - - diff --git a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_triangulation_3.h b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_triangulation_3.h index ded18a9175f..a2afe749131 100644 --- a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_triangulation_3.h +++ b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_triangulation_3.h @@ -23,6 +23,7 @@ #include #include #include +#include template bool check_all_are_finite(Triangulation* tr, const Container& cont) @@ -286,7 +287,8 @@ _test_cls_triangulation_3(const Triangulation &) assert(T1.number_of_vertices() == 0); assert(T1.is_valid()); - + namespace test_tr_23 = CGAL::Testsuite::Triangulation_23; + test_tr_23::test_move_semantic(T0); // Assignment T1=T0; @@ -363,12 +365,14 @@ _test_cls_triangulation_3(const Triangulation &) assert(T2_0.dimension()==1); assert(T2_0.number_of_vertices()==3); + test_tr_23::test_move_semantic(T2_0); v0=T2_0.insert(p4); assert(T2_0.is_valid()); assert(T2_0.dimension()==2); assert(T2_0.number_of_vertices()==4); + test_tr_23::test_move_semantic(T2_0); v0=T2_0.insert(p5); v0=T2_0.insert(p6); @@ -380,6 +384,8 @@ _test_cls_triangulation_3(const Triangulation &) assert(T2_0.dimension()==2); assert(T2_0.number_of_vertices()==8); + test_tr_23::test_move_semantic(T2_0); + if (! del) // to avoid doing the following tests for both Delaunay // and non Delaunay triangulations { @@ -403,6 +409,8 @@ _test_cls_triangulation_3(const Triangulation &) assert( T2_1.dimension()==2 ); assert( T2_1.is_valid() ); + test_tr_23::test_move_semantic(T2_1); + std::cout << " Constructor11 " << std::endl; // 3-dimensional triangulations // This is a simple grid : 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 24e544b3412..4cc31a5b14c 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 @@ -5,7 +5,7 @@ The concept `AdaptationTraits_2` defines the functors required for accessing geometric information in the Delaunay graph that is needed by the -`Voronoi_diagram_2` class. +`CGAL::Voronoi_diagram_2` class. It optionally defines a functor for performing nearest site queries. A tag is provided for determining whether this functor is defined or not. diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 5e32e12d3d4..66f7d364293 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -17,6 +17,7 @@ #ifdef CGAL_USE_BASIC_VIEWER +#include #include #include #include @@ -316,6 +317,7 @@ void draw(const CGAL_VORONOI_TYPE &av2, #endif if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4,3); int argc = 1; const char *argv[2] = {"voronoi_2_viewer", "\0"}; QApplication app(argc, const_cast(argv)); diff --git a/copyright b/copyright index cecd857d055..876931746d3 100644 --- a/copyright +++ b/copyright @@ -124,4 +124,3 @@ R = RU Groningen Width_3 E iostream ETIMU kdtree T - wininst ETIMU diff --git a/wininst/developer_scripts/CGAL.bmp b/wininst/developer_scripts/CGAL.bmp deleted file mode 100644 index ab1c3f16f2d..00000000000 Binary files a/wininst/developer_scripts/CGAL.bmp and /dev/null differ diff --git a/wininst/developer_scripts/DumpLogToFile.nsh b/wininst/developer_scripts/DumpLogToFile.nsh deleted file mode 100644 index ff7bc413e73..00000000000 --- a/wininst/developer_scripts/DumpLogToFile.nsh +++ /dev/null @@ -1,47 +0,0 @@ -# -# From: http://nsis.sourceforge.net/Dump_log_to_file -# - -!define LVM_GETITEMCOUNT 0x1004 -!define LVM_GETITEMTEXT 0x102D - -Function DumpLog - Exch $5 - Push $0 - Push $1 - Push $2 - Push $3 - Push $4 - Push $6 - - FindWindow $0 "#32770" "" $HWNDPARENT - GetDlgItem $0 $0 1016 - StrCmp $0 0 exit - FileOpen $5 $5 "w" - StrCmp $5 "" exit - SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6 - System::Alloc ${NSIS_MAX_STRLEN} - Pop $3 - StrCpy $2 0 - System::Call "*(i, i, i, i, i, i, i, i, i) i \ - (0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1" - loop: StrCmp $2 $6 done - System::Call "User32::SendMessageA(i, i, i, i) i \ - ($0, ${LVM_GETITEMTEXT}, $2, r1)" - System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)" - FileWrite $5 "$4$\r$\n" - IntOp $2 $2 + 1 - Goto loop - done: - FileClose $5 - System::Free $1 - System::Free $3 - exit: - Pop $6 - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Pop $0 - Exch $5 -FunctionEnd \ No newline at end of file diff --git a/wininst/developer_scripts/EnvVarUpdate.nsh b/wininst/developer_scripts/EnvVarUpdate.nsh deleted file mode 100644 index 93fb025721a..00000000000 --- a/wininst/developer_scripts/EnvVarUpdate.nsh +++ /dev/null @@ -1,360 +0,0 @@ -/** - * EnvVarUpdate.nsh - * : Environmental Variables: append, prepend, and remove entries - * - * WARNING: If you use StrFunc.nsh header then include it before this file - * with all required definitions. This is to avoid conflicts - * - * Usage: - * ${EnvVarUpdate} "ResultVar" "EnvVarName" "Action" "RegLoc" "PathString" - * - * Credits: - * Version 1.0 - * * Cal Turney (turnec2) - * * Amir Szekely (KiCHiK) and e-circ for developing the forerunners of this - * function: AddToPath, un.RemoveFromPath, AddToEnvVar, un.RemoveFromEnvVar, - * WriteEnvStr, and un.DeleteEnvStr - * * Diego Pedroso (deguix) for StrTok - * * Kevin English (kenglish_hi) for StrContains - * * Hendri Adriaens (Smile2Me), Diego Pedroso (deguix), and Dan Fuhry - * (dandaman32) for StrReplace - * - * Version 1.1 (compatibility with StrFunc.nsh) - * * techtonik - * - * http://nsis.sourceforge.net/Environmental_Variables:_append%2C_prepend%2C_and_remove_entries - * - */ - - -!ifndef ENVVARUPDATE_FUNCTION -!define ENVVARUPDATE_FUNCTION -!verbose push -!verbose 3 -!include "LogicLib.nsh" -!include "WinMessages.NSH" -!include "StrFunc.nsh" - -; ---- Fix for conflict if StrFunc.nsh is already includes in main file ----------------------- -!macro _IncludeStrFunction StrFuncName - !ifndef ${StrFuncName}_INCLUDED - ${${StrFuncName}} - !endif - !ifndef Un${StrFuncName}_INCLUDED - ${Un${StrFuncName}} - !endif - !define un.${StrFuncName} "${Un${StrFuncName}}" -!macroend - -!insertmacro _IncludeStrFunction StrTok -!insertmacro _IncludeStrFunction StrStr -!insertmacro _IncludeStrFunction StrRep - -; ---------------------------------- Macro Definitions ---------------------------------------- -!macro _EnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString - Push "${EnvVarName}" - Push "${Action}" - Push "${RegLoc}" - Push "${PathString}" - Call EnvVarUpdate - Pop "${ResultVar}" -!macroend -!define EnvVarUpdate '!insertmacro "_EnvVarUpdateConstructor"' - -!macro _unEnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString - Push "${EnvVarName}" - Push "${Action}" - Push "${RegLoc}" - Push "${PathString}" - Call un.EnvVarUpdate - Pop "${ResultVar}" -!macroend -!define un.EnvVarUpdate '!insertmacro "_unEnvVarUpdateConstructor"' -; ---------------------------------- Macro Definitions end------------------------------------- - -;----------------------------------- EnvVarUpdate start---------------------------------------- -!define hklm_all_users 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' -!define hkcu_current_user 'HKCU "Environment"' - -!macro EnvVarUpdate UN - -Function ${UN}EnvVarUpdate - - Push $0 - Exch 4 - Exch $1 - Exch 3 - Exch $2 - Exch 2 - Exch $3 - Exch - Exch $4 - Push $5 - Push $6 - Push $7 - Push $8 - Push $9 - Push $R0 - - /* After this point: - ------------------------- - $0 = ResultVar (returned) - $1 = EnvVarName (input) - $2 = Action (input) - $3 = RegLoc (input) - $4 = PathString (input) - $5 = Orig EnvVar (read from registry) - $6 = Len of $0 (temp) - $7 = tempstr1 (temp) - $8 = Entry counter (temp) - $9 = tempstr2 (temp) - $R0 = tempChar (temp) */ - - ; Step 1: Read contents of EnvVarName from RegLoc - ; - ; R0 = "user" or "system" - - ; Check for empty EnvVarName - ${If} $1 == "" - SetErrors - DetailPrint "ERROR: EnvVarName is blank" - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - - ; Check for valid Action - ${If} $2 != "A" - ${AndIf} $2 != "P" - ${AndIf} $2 != "R" - SetErrors - DetailPrint "ERROR: Invalid Action - must be A, P, or R" - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - - ${If} $3 == HKLM - ReadRegStr $5 ${hklm_all_users} $1 ; Get EnvVarName from all users into $5 - StrCpy $R0 "user" - ${ElseIf} $3 == HKCU - ReadRegStr $5 ${hkcu_current_user} $1 ; Read EnvVarName from current user into $5 - StrCpy $R0 "system" - ${Else} - SetErrors - DetailPrint 'ERROR: Action is [$3] but must be "HKLM" or HKCU"' - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - - IfErrors 0 +4 - MessageBox MB_OK|MB_ICONEXCLAMATION "The $R0 environment variable $1 seems empty, and cannot be modified; set it manually to $4" - DetailPrint "Could not read the $R0 environment variable $1; set it manually to $4" - Goto EnvVarUpdate_Restore_Vars - - ; Check for empty PathString - ${If} $4 == "" - SetErrors - DetailPrint "ERROR: PathString is blank" - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - - ;;khc - here check if length is going to be greater then max string length - ;; and abort if so - also abort if original path empty - may mean - ;; it was too long as well- write message to say set it by hand - Push $6 - Push $7 - Push $8 - StrLen $7 $4 - StrLen $6 $5 - IntOp $8 $6 + $7 - ${If} $5 == "" - ${OrIf} $8 >= ${NSIS_MAX_STRLEN} - SetErrors - MessageBox MB_OK|MB_ICONEXCLAMATION "Current $R0 $1 length ($6) too long to modify in NSIS; set manually if needed" - DetailPrint "Current $R0 $1 length ($6) too long to modify in NSIS; set manually if needed" - Pop $8 - Pop $7 - Pop $6 - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - Pop $8 - Pop $7 - Pop $6 - ;;khc - - ; Make sure we've got some work to do - ${If} $5 == "" - ${AndIf} $2 == "R" - SetErrors - DetailPrint "$1 is empty - Nothing to remove" - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - - ; Step 2: Scrub EnvVar - ; - StrCpy $0 $5 ; Copy the contents to $0 - ; Remove spaces around semicolons (NOTE: spaces before the 1st entry or - ; after the last one are not removed here but instead in Step 3) - ${If} $0 != "" ; If EnvVar is not empty ... - ${Do} - ${${UN}StrStr} $7 $0 " ;" - ${If} $7 == "" - ${ExitDo} - ${EndIf} - ${${UN}StrRep} $0 $0 " ;" ";" ; Remove ';' - ${Loop} - ${Do} - ${${UN}StrStr} $7 $0 "; " - ${If} $7 == "" - ${ExitDo} - ${EndIf} - ${${UN}StrRep} $0 $0 "; " ";" ; Remove ';' - ${Loop} - ${Do} - ${${UN}StrStr} $7 $0 ";;" - ${If} $7 == "" - ${ExitDo} - ${EndIf} - ${${UN}StrRep} $0 $0 ";;" ";" - ${Loop} - - ; Remove a leading or trailing semicolon from EnvVar - StrCpy $7 $0 1 0 - ${If} $7 == ";" - StrCpy $0 $0 "" 1 ; Change ';' to '' - ${EndIf} - StrLen $6 $0 - IntOp $6 $6 - 1 - StrCpy $7 $0 1 $6 - ${If} $7 == ";" - StrCpy $0 $0 $6 ; Change ';' to '' - ${EndIf} - ; DetailPrint "Scrubbed $1: [$0]" ; Uncomment to debug - ${EndIf} - - /* Step 3. Remove all instances of the target path/string (even if "A" or "P") - $6 = bool flag (1 = found and removed PathString) - $7 = a string (e.g. path) delimited by semicolon(s) - $8 = entry counter starting at 0 - $9 = copy of $0 - $R0 = tempChar */ - - ${If} $5 != "" ; If EnvVar is not empty ... - StrCpy $9 $0 - StrCpy $0 "" - StrCpy $8 0 - StrCpy $6 0 - - ${Do} - ${${UN}StrTok} $7 $9 ";" $8 "0" ; $7 = next entry, $8 = entry counter - - ${If} $7 == "" ; If we've run out of entries, - ${ExitDo} ; were done - ${EndIf} ; - - ; Remove leading and trailing spaces from this entry (critical step for Action=Remove) - ${Do} - StrCpy $R0 $7 1 - ${If} $R0 != " " - ${ExitDo} - ${EndIf} - StrCpy $7 $7 "" 1 ; Remove leading space - ${Loop} - ${Do} - StrCpy $R0 $7 1 -1 - ${If} $R0 != " " - ${ExitDo} - ${EndIf} - StrCpy $7 $7 -1 ; Remove trailing space - ${Loop} - ${If} $7 == $4 ; If string matches, remove it by not appending it - StrCpy $6 1 ; Set 'found' flag - ${ElseIf} $7 != $4 ; If string does NOT match - ${AndIf} $0 == "" ; and the 1st string being added to $0, - StrCpy $0 $7 ; copy it to $0 without a prepended semicolon - ${ElseIf} $7 != $4 ; If string does NOT match - ${AndIf} $0 != "" ; and this is NOT the 1st string to be added to $0, - StrCpy $0 $0;$7 ; append path to $0 with a prepended semicolon - ${EndIf} ; - - IntOp $8 $8 + 1 ; Bump counter - ${Loop} ; Check for duplicates until we run out of paths - ${EndIf} - - ; Step 4: Perform the requested Action - ; - ${If} $2 != "R" ; If Append or Prepend - ${If} $6 == 1 ; And if we found the target - DetailPrint "Target is already present in $1. It will be removed and" - ${EndIf} - ${If} $0 == "" ; If EnvVar is (now) empty - StrCpy $0 $4 ; just copy PathString to EnvVar - ${If} $6 == 0 ; If found flag is either 0 - ${OrIf} $6 == "" ; or blank (if EnvVarName is empty) - DetailPrint "$1 was empty and has been updated with the target" - ${EndIf} - ${ElseIf} $2 == "A" ; If Append (and EnvVar is not empty), - StrCpy $0 $0;$4 ; append PathString - ${If} $6 == 1 - DetailPrint "appended to $1" - ${Else} - DetailPrint "Target was appended to $1" - ${EndIf} - ${Else} ; If Prepend (and EnvVar is not empty), - StrCpy $0 $4;$0 ; prepend PathString - ${If} $6 == 1 - DetailPrint "prepended to $1" - ${Else} - DetailPrint "Target was prepended to $1" - ${EndIf} - ${EndIf} - ${Else} ; If Action = Remove - ${If} $6 == 1 ; and we found the target - DetailPrint "Target was found and removed from $1" - ${Else} - DetailPrint "Target was NOT found in $1 (nothing to remove)" - ${EndIf} - ${If} $0 == "" - DetailPrint "$1 is now empty" - ${EndIf} - ${EndIf} - - ; Step 5: Update the registry at RegLoc with the updated EnvVar and announce the change - ; - ClearErrors - ${If} $3 == HKLM - WriteRegExpandStr ${hklm_all_users} $1 $0 ; Write it in all users section - ${ElseIf} $3 == HKCU - WriteRegExpandStr ${hkcu_current_user} $1 $0 ; Write it to current user section - ${EndIf} - - IfErrors 0 +4 - MessageBox MB_OK|MB_ICONEXCLAMATION "Could not write updated $1 to $3" - DetailPrint "Could not write updated $1 to $3" - Goto EnvVarUpdate_Restore_Vars - - ; "Export" our change - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - - EnvVarUpdate_Restore_Vars: - ; - ; Restore the user's variables and return ResultVar - Pop $R0 - Pop $9 - Pop $8 - Pop $7 - Pop $6 - Pop $5 - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Push $0 ; Push my $0 (ResultVar) - Exch - Pop $0 ; Restore his $0 - -FunctionEnd - -!macroend ; EnvVarUpdate UN -!insertmacro EnvVarUpdate "" -!insertmacro EnvVarUpdate "un." -;----------------------------------- EnvVarUpdate end---------------------------------------- - -!verbose pop -!endif diff --git a/wininst/developer_scripts/TextLog.nsh b/wininst/developer_scripts/TextLog.nsh deleted file mode 100644 index d5acf247746..00000000000 --- a/wininst/developer_scripts/TextLog.nsh +++ /dev/null @@ -1,68 +0,0 @@ -# TextLog.nsh v1.1 - 2005-12-26 -# Written by Mike Schinkel [http://www.mikeschinkel.com/blog/] - -Var /GLOBAL __TextLog_FileHandle -Var /GLOBAL __TextLog_FileName -Var /GLOBAL __TextLog_State - -!define LogMsg '!insertmacro LogMsgCall' -!macro LogMsgCall _text - Call LogSetOn - Push "${_text}" - Call LogText - Call LogSetOff -!macroend - - -!define LogText '!insertmacro LogTextCall' -!macro LogTextCall _text - Push "${_text}" - Call LogText -!macroend - -Function LogText - Exch $0 ; pABC -> 0ABC - FileWrite $__TextLog_FileHandle "$0$\r$\n" - Pop $0 ; 0ABC -> ABC -FunctionEnd - -!define LogSetFileName '!insertmacro LogSetFileNameCall' -!macro LogSetFileNameCall _filename - Push "${_filename}" - Call LogSetFileName -!macroend - -Function LogSetFileName - Exch $0 ; pABC -> 0ABC - StrCpy $__TextLog_FileName "$0" - StrCmp $__TextLog_State "open" +1 +3 - Call LogSetOff - Call LogSetOn - Pop $0 ; 0ABC -> ABC -FunctionEnd - -!define LogSetOn '!insertmacro LogSetOnCall' -!macro LogSetOnCall - Call LogSetOn -!macroend - -Function LogSetOn - StrCmp $__TextLog_FileName "" +1 AlreadySet - StrCpy $__TextLog_FileName "$INSTDIR\install.log" -AlreadySet: - StrCmp $__TextLog_State "open" +2 - FileOpen $__TextLog_FileHandle "$__TextLog_FileName" a - FileSeek $__TextLog_FileHandle 0 END - StrCpy $__TextLog_State "open" -FunctionEnd - -!define LogSetOff '!insertmacro LogSetOffCall' -!macro LogSetOffCall - Call LogSetOff -!macroend - -Function LogSetOff - StrCmp $__TextLog_State "open" +1 +2 - FileClose $__TextLog_FileHandle - StrCpy $__TextLog_State "" -FunctionEnd \ No newline at end of file diff --git a/wininst/developer_scripts/WriteEnvStr.nsh b/wininst/developer_scripts/WriteEnvStr.nsh deleted file mode 100644 index 2cc863b3344..00000000000 --- a/wininst/developer_scripts/WriteEnvStr.nsh +++ /dev/null @@ -1,183 +0,0 @@ -# -# Taken from http://nsis.sourceforge.net/Setting_Environment_Variables -# User handling modified by Fernando Cacciola -# Laurent Rineau added un.DeleteEnvStr and adapted it to handle user. -# -!ifndef _WriteEnvStr_nsh -!define _WriteEnvStr_nsh - -# -# Macro definition added by Fernando Cacciola -# -!define WriteEnvStr "!insertmacro WriteEnvStr" -!macro WriteEnvStr name value all_users - Push ${name} - Push ${value} - Push ${all_users} - Call WriteEnvStr -!macroend - -!define un.DeleteEnvStr "!insertmacro un.DeleteEnvStr" -!macro un.DeleteEnvStr name all_users - Push ${name} - Push ${all_users} - Call un.DeleteEnvStr -!macroend - -!include WinMessages.nsh - -!define WriteEnvStr_RegKey_AllUsers 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' - -!define WriteEnvStr_RegKey_CurrentUser 'HKCU "Environment"' - -# -# WriteEnvStr - Writes an environment variable -# Note: Win9x systems requires reboot -# -# Example: -# Push "HOMEDIR" # name -# Push "C:\New Home Dir\" # value -# Push 1 (all users) or 0 (current user only) -# Call WriteEnvStr -# -Function WriteEnvStr - Exch $2 ; $2 all users? - Exch - Exch $1 ; $1 has environment variable value - Exch 2 - Exch $0 ; $0 has environment variable name - Push $3 - - Call IsNT - Pop $3 - StrCmp $3 1 WriteEnvStr_NT - ; Not on NT - StrCpy $3 $WINDIR 2 ; Copy drive of windows (c:) - FileOpen $3 "$3\autoexec.bat" a - FileSeek $3 0 END - FileWrite $3 "$\r$\nSET $0=$1$\r$\n" - FileClose $3 - SetRebootFlag true - Goto WriteEnvStr_done - - WriteEnvStr_NT: - StrCmp $2 1 AllUsers - WriteRegExpandStr ${WriteEnvStr_RegKey_CurrentUser} $0 $1 - Goto Written - AllUsers: - WriteRegExpandStr ${WriteEnvStr_RegKey_AllUsers} $0 $1 - Written: - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - - WriteEnvStr_done: - Pop $3 - Pop $2 - Pop $0 - Pop $1 -FunctionEnd - -# -# un.DeleteEnvStr - Removes an environment variable -# Note: Win9x systems requires reboot -# -# Example: -# Push "HOMEDIR" # name -# Push 1 (all users) or 0 (current user only) -# Call un.DeleteEnvStr -# -Function un.DeleteEnvStr - Exch $1 ; $1 all users? - Exch - Exch $0 ; $0 now has the name of the variable - Push $2 - Push $3 - Push $4 - Push $5 - Push $6 - - Call un.IsNT - Pop $2 - StrCmp $2 1 DeleteEnvStr_NT - ; Not on NT - StrCpy $2 $WINDIR 2 - FileOpen $2 "$2\autoexec.bat" r - GetTempFileName $5 - FileOpen $3 $5 w - StrCpy $0 "SET $0=" - SetRebootFlag true - - DeleteEnvStr_dosLoop: - FileRead $2 $4 - StrLen $6 $0 - StrCpy $6 $4 $6 - StrCmp $6 $0 DeleteEnvStr_dosLoop - StrCmp $6 "" DeleteEnvStr_dosLoopEnd - FileWrite $3 $4 - Goto DeleteEnvStr_dosLoop - - DeleteEnvStr_dosLoopEnd: - FileClose $3 - FileClose $2 - StrCpy $2 $WINDIR 2 - Delete "$2\autoexec.bat" - CopyFiles /SILENT $5 "$2\autoexec.bat" - Delete $5 - Goto DeleteEnvStr_done - - DeleteEnvStr_NT: - StrCmp $1 1 DelAllUsers - DeleteRegValue ${WriteEnvStr_RegKey_CurrentUser} $0 - Goto DelWritten - DelAllUsers: - DeleteRegValue ${WriteEnvStr_RegKey_AllUsers} $0 - DelWritten: - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} \ - 0 "STR:Environment" /TIMEOUT=5000 - - DeleteEnvStr_done: - Pop $6 - Pop $5 - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Pop $0 -FunctionEnd - -!ifndef IsNT_KiCHiK -!define IsNT_KiCHiK - -# -# [un.]IsNT - Pushes 1 if running on NT, 0 if not -# -# Example: -# Call IsNT -# Pop $0 -# StrCmp $0 1 +3 -# MessageBox MB_OK "Not running on NT!" -# Goto +2 -# MessageBox MB_OK "Running on NT!" -# -!macro IsNT UN -Function ${UN}IsNT - Push $0 - ReadRegStr $0 HKLM \ - "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion - StrCmp $0 "" 0 IsNT_yes - ; we are not NT. - Pop $0 - Push 0 - Return - - IsNT_yes: - ; NT!!! - Pop $0 - Push 1 -FunctionEnd -!macroend -!insertmacro IsNT "" -!insertmacro IsNT "un." - -!endif ; IsNT_KiCHiK - -!endif ; _WriteEnvStr_nsh diff --git a/wininst/developer_scripts/cgal.ico b/wininst/developer_scripts/cgal.ico deleted file mode 100644 index 8b074d58e5a..00000000000 Binary files a/wininst/developer_scripts/cgal.ico and /dev/null differ diff --git a/wininst/developer_scripts/cgal_very_small_FFFFFF.bmp b/wininst/developer_scripts/cgal_very_small_FFFFFF.bmp deleted file mode 100644 index 31c859b9ce7..00000000000 Binary files a/wininst/developer_scripts/cgal_very_small_FFFFFF.bmp and /dev/null differ diff --git a/wininst/developer_scripts/default_variants.ini b/wininst/developer_scripts/default_variants.ini deleted file mode 100644 index 3a60f973c27..00000000000 --- a/wininst/developer_scripts/default_variants.ini +++ /dev/null @@ -1,93 +0,0 @@ -[Settings] -NumFields=11 - -[Field 1] -Type=GroupBox -Left=0 -Right=-1 -Top=0 -Bottom=-5 -Text=Select default variants - -[Field 2] -Type=GroupBox -Left=5 -Right=100 -Top=10 -Bottom=-10 -Text=Compilers - -[Field 3] -Type=GroupBox -Left=105 -Right=-5 -Top=10 -Bottom=-10 -Text=Variants - -[Field 4] -Type=CheckBox -Left=10 -Top=22 -Right=95 -Bottom=32 -Text=Visual C++ 7.1 - -[Field 5] -Type=CheckBox -Left=10 -Top=35 -Right=95 -Bottom=45 -Text=Visual C++ 8.0 - -; -- Variants - -[Field 6] -Type=CheckBox -Left=110 -Top=22 -Right=-10 -Bottom=32 -Text=Multithread Debug - -[Field 7] -Type=CheckBox -Left=110 -Right=-15 -Top=35 -Bottom=45 -Text=Multithread - -[Field 8] -Type=CheckBox -Left=110 -Right=-10 -Top=48 -Bottom=58 -Text=Multithread, static runtime - -[Field 9] -Type=CheckBox -Left=110 -Right=-10 -Top=61 -Bottom=71 -Text=Multithread Debug, static runtime - -[Field 10] -Type=CheckBox -Left=110 -Right=-10 -Top=74 -Bottom=84 -Text=Single thread, static runtime - -[Field 11] -Type=CheckBox -Left=110 -Right=-10 -Top=87 -Bottom=97 -Text=Single thread Debug, static runtime - diff --git a/wininst/developer_scripts/environment_variables.ini b/wininst/developer_scripts/environment_variables.ini deleted file mode 100644 index deab1792eae..00000000000 --- a/wininst/developer_scripts/environment_variables.ini +++ /dev/null @@ -1,90 +0,0 @@ -[Settings] -NumFields=10 - -[Field 1] -Type=GroupBox -Left=0 -Right=-1 -Top=0 -Bottom=23 -Text=Select user - -[Field 2] -Type=RadioButton -Left=10 -Right=80 -Top=10 -Bottom=20 -Text=All users -State=0 - -[Field 3] -Type=RadioButton -Left=90 -Right=160 -Top=10 -Bottom=20 -Text=Current user -State=1 - -[Field 4] -Type=GroupBox -Left=0 -Right=-1 -Top=25 -Bottom=-1 -Text=Environment variables to set - -[Field 5] -Type=Label -Left=10 -Right=-10 -Top=40 -Bottom=50 -Text=Directory where CGAL has been installed. - - -[Field 6] -Type=CheckBox -Left=20 -Right=75 -Top=55 -Bottom=65 -Text=CGAL_DIR -State=1 - -[Field 7] -Type=Text -Left=20 -Right=-10 -Top=70 -Bottom=85 -Text= -Flags=READONLY - -[Field 8] -Type=Label -Left=80 -Right=-10 -Top=55 -Bottom=65 -Text= -Flags=DISABLED - -[Field 9] -Type=CheckBox -Left=10 -Right=-10 -Top=95 -Bottom=105 -Text=Add CGAL/auxiliary/gmp/lib to the PATH -State=1 - -[Field 10] -Type=Label -Left=10 -Right=-10 -Top=110 -Bottom=135 -Text=CGAL/auxiliary/gmp/lib contains DLL files. If you do not add this to the PATH, make sure to manually move the DLLs to a directory already in the PATH. -Flags=DISABLED diff --git a/wininst/developer_scripts/fixup_projects.ini b/wininst/developer_scripts/fixup_projects.ini deleted file mode 100644 index af0f5856c55..00000000000 --- a/wininst/developer_scripts/fixup_projects.ini +++ /dev/null @@ -1,27 +0,0 @@ -[Settings] -NumFields=3 - -[Field 1] -Type=GroupBox -Left=0 -Right=-1 -Top=0 -Bottom=-5 -Text=Post-install changes to Visual Studio project files - -[Field 2] -Type=CheckBox -Left=10 -Right=-10 -Top=20 -Bottom=30 -Text=Remove CGAL_USE_GMP from all installed project files -State=1 - -[Field 3] -Type=Label -Left=20 -Right=-10 -Top=35 -Bottom=45 -Text=(because MPFR/GMP has not been installed) diff --git a/wininst/developer_scripts/locate.zip b/wininst/developer_scripts/locate.zip deleted file mode 100644 index 372f1eda265..00000000000 Binary files a/wininst/developer_scripts/locate.zip and /dev/null differ diff --git a/wininst/developer_scripts/script_cgal.nsh b/wininst/developer_scripts/script_cgal.nsh deleted file mode 100644 index 210d2430b2c..00000000000 --- a/wininst/developer_scripts/script_cgal.nsh +++ /dev/null @@ -1,65 +0,0 @@ -;============================ -; Copyright 2007, 2008, 2009 GeometryFactory (France) -; Authors: Andreas Fabri (andreas.fabri@geometryfactrory.com), -; Fernando Cacciola (fernando.cacciola@geometryfactrory.com), -; Laurent Rineau (laurent.rineau@geometryfactory.com) -;============================ -; Some portions of this file have been derived from "boost.nsi", the Boost Windows Installer, contributed by www.boost-consulting.org. -; -; Copyright 2006 Daniel Wallin -; Copyright 2006 Eric Niebler -; Distributed under the Boost Software License, Version 1.0. (See -; accompanying file LICENSE_1_0.txt or copy at -; http://www.boost.org/LICENSE_1_0.txt) -;============================ - -;!define SkipFiles -;!define SkipSetEnvVar -;!define SkipDownload -!define ViaFTP - -Var Platform - -!ifdef ViaFTP - !define DownloadOK "OK" - !define DownloadAborted "cancel" -!else - !define DownloadOK "success" - !define DownloadAborted "cancel" -!endif - -!macro DownloadFileFrom SERVER SRC_FOLDER FILE TGT -!ifndef SkipDownload - !ifdef DebugLog - ${LogMsg} "Downloadimg ${SERVER}${SRC_FOLDER}${FILE} into ${TGT}\${FILE}" - !endif - !ifdef ViaFTP - inetc::get ${SERVER}${SRC_FOLDER}${FILE} ${TGT}\${FILE} - !else - NSISdl::download ${SERVER}${SRC_FOLDER}${FILE} ${TGT}\${FILE} - !endif - Pop $0 - ${If} "$0" == "OK" - DetailPrint "${FILE} downloaded successfully." - ${ElseIf} "$0" == "URL Parts Error" - DetailPrint "${FILE} downloaded successfully." - ${ElseIf} "$0" == "Terminated" - DetailPrint "${FILE} download CANCELLED." - ${ElseIf} "$0" == "Cancelled" - DetailPrint "${FILE} download CANCELLED." - ${Else} - MessageBox MB_OK "Unable to download ${SERVER}${SRC_FOLDER}${FILE}. Error: $0" - DetailPrint "ERROR $0: Unable to download ${SERVER}${SRC_FOLDER}${FILE}." - ${Endif} -!endif -!macroend - -!macro DownloadFile SRC_FOLDER FILE TGT - !insertmacro DownloadFileFrom ${FTP_SRC} ${SRC_FOLDER} ${FILE} ${TGT} -!macroend - -!macro Install_GMP_MPFR_bin PLATFORM - !insertmacro DownloadFile "auxiliary/${PLATFORM}/GMP/5.0.1/" "gmp-all-CGAL-3.9.zip" "$INSTDIR\auxiliary\gmp" - !insertmacro DownloadFile "auxiliary/${PLATFORM}/MPFR/3.0.0/" "mpfr-all-CGAL-3.9.zip" "$INSTDIR\auxiliary\gmp" -!macroend - diff --git a/wininst/developer_scripts/script_cgal.nsi b/wininst/developer_scripts/script_cgal.nsi deleted file mode 100644 index 4ebac61843a..00000000000 --- a/wininst/developer_scripts/script_cgal.nsi +++ /dev/null @@ -1,472 +0,0 @@ -;=========================== -; Copyright 2007, 2008 GeometryFactory (France) -; Author: Andreas Fabri (andreas.fabri@geometryfactrory.com), Fernando Cacciola (fernando.cacciola@geometryfactrory.com) -;============================ -; Some portions of this file have been derived from "boost.nsi", the Boost Windows Installer, contributed by www.boost-consulting.org. -; -; Copyright 2006 Daniel Wallin -; Copyright 2006 Eric Niebler -; Distributed under the Boost Software License, Version 1.0. (See -; accompanying file LICENSE_1_0.txt or copy at -; http://www.boost.org/LICENSE_1_0.txt) -;============================ - - -!include "MUI.nsh" -!include "Sections.nsh" -!include "LogicLib.nsh" -!include "Locate.nsh" -!include "WriteEnvStr.nsh" -!include "EnvVarUpdate.nsh" -!include "x64.nsh" - -;!define DebugLog - -!ifdef DebugLog - !include "TextLog.nsh" -!endif - -!include "script_cgal.nsh" - -!define CGAL_SRC "CGAL-4.8" -!define FTP_SRC "https://cgal.geometryfactory.com/CGAL/precompiled_libs/" - -;-------------------------------- -; General -;-------------------------------- - - ;Name and file - Name "${CGAL_SRC}" - - !ifdef FetchLocal - OutFile "${CGAL_SRC}-Full-Setup.exe" - !else - OutFile "${CGAL_SRC}-Setup.exe" - !endif - - ;Default installation folder: C:\dev\CGAL-4.8 - ; See also .onInit - Installdir "" - - - ;Get installation folder from registry if available - InstallDirRegKey HKCU "Software\${CGAL_SRC}" "" - - BrandingText "The CGAL Project and GeometryFactory - Installer created with NSIS." - - VIProductVersion "4.8.0.0" - VIAddVersionKey "ProductName" "CGAL Windows Installer" - VIAddVersionKey "CompanyName" "The CGAL Project and GeometryFactory" - VIAddVersionKey "LegalCopyright" "© The CGAL Project and GeometryFactory" - VIAddVersionKey "FileDescription" "Windows Installer for CGAL" - VIAddVersionKey "FileVersion" "4.8" - -;-------------------------------- -; Variables -;-------------------------------- - - Var SetCGAL_DIR - Var RegLoc - Var Add_GMP_LIB_DIR_to_PATH - -;-------------------------------- -; Interface Settings -;-------------------------------- - - !define MUI_ICON "cgal.ico" - !define MUI_UNICON "cgal.ico" - !define MUI_HEADERIMAGE - !define MUI_HEADERIMAGE_BITMAP_NOSTRETCH - !define MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH - - !define MUI_HEADERIMAGE_BITMAP "cgal_very_small_FFFFFF.bmp" ; optional - !define MUI_HEADERIMAGE_UNBITMAP "cgal_very_small_FFFFFF.bmp" ; optional - - !define MUI_FINISHPAGE_NOAUTOCLOSE - - !define MUI_ABORTWARNING - - !define MUI_WELCOMEFINISHPAGE_BITMAP Zirkel.bmp - !define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH - !define MUI_UNWELCOMEFINISHPAGE_BITMAP Zirkel.bmp - !define MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH - - !define MUI_COMPONENTSPAGE_SMALLDESC - - !define MUI_WELCOMEPAGE_TEXT "This downloads ${CGAL_SRC} to your machine." - - !define MUI_FINISHPAGE_TITLE "Downloading finished" - - !define MUI_FINISHPAGE_TEXT "You have downloaded CGAL successfully. Please continue the installation, reading the installation instructions." - - !define MUI_FINISHPAGE_LINK "Installation instructions" - - !define MUI_FINISHPAGE_LINK_LOCATION "https://www.cgal.org/download/windows.html" - -;-------------------------------- -; Pages -;-------------------------------- - - !insertmacro MUI_PAGE_WELCOME - !insertmacro MUI_PAGE_LICENSE "${CGAL_SRC}\LICENSE" - - !insertmacro MUI_PAGE_COMPONENTS - - ; A page where the user can specify a default variant configuration (taken from the boost installer) - Page custom VariantsPage - - !insertmacro MUI_PAGE_DIRECTORY - - ; A page where the user can check/uncheck the environment variables - ; used to specify paths in vcproj files to be added. - Page custom envarsPage - - !insertmacro MUI_PAGE_INSTFILES - - !insertmacro MUI_PAGE_FINISH - - !insertmacro MUI_UNPAGE_WELCOME - !insertmacro MUI_UNPAGE_CONFIRM - !insertmacro MUI_UNPAGE_INSTFILES - !insertmacro MUI_UNPAGE_FINISH - -;-------------------------------- -; Languages - - !insertmacro MUI_LANGUAGE "English" - -;-------------------------------- -; Sections -;-------------------------------- - - -;-------------------------------- -Section "!Main CGAL" MAIN_Idx - -!ifndef SkipFiles - SectionIn RO - SetOutPath "$INSTDIR\auxiliary" - File /nonfatal /r "${CGAL_SRC}\auxiliary\*.*" - SetOutPath "$INSTDIR\cmake" - File /r "${CGAL_SRC}\cmake\*.*" - SetOutPath "$INSTDIR\doc_html" - File /r "${CGAL_SRC}\doc_html\*.*" - SetOutPath "$INSTDIR\include" - File /r "${CGAL_SRC}\include\*.*" - SetOutPath "$INSTDIR\lib" - File /r "${CGAL_SRC}\lib\*.*" - SetOutPath "$INSTDIR\scripts" - File /r "${CGAL_SRC}\scripts\*.*" - SetOutPath "$INSTDIR\src" - File /r "${CGAL_SRC}\src\*.*" - SetOutPath "$INSTDIR\demo\icons" - File /r "${CGAL_SRC}\demo\icons\*.*" - SetOutPath "$INSTDIR\demo\resources" - File /r "${CGAL_SRC}\demo\resources\*.*" - - SetOutPath "$INSTDIR" - File "${CGAL_SRC}\AUTHORS" - File "${CGAL_SRC}\CGALConfig.cmake" - File "${CGAL_SRC}\CHANGES.md" - File "${CGAL_SRC}\CMakeLists.txt" - File "${CGAL_SRC}\INSTALL.md" - File "${CGAL_SRC}\LICENSE" - File "${CGAL_SRC}\LICENSE.BSL" - File "${CGAL_SRC}\LICENSE.LGPL" - File "${CGAL_SRC}\LICENSE.GPL" - File "${CGAL_SRC}\LICENSE.RFL" - File "${CGAL_SRC}\VERSION" - File ".\cgal.ico" -!endif - - ; Write uninstall informations - ; http://nsis.sourceforge.net/Add_uninstall_information_to_Add/Remove_Programs - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "DisplayName" "${CGAL_SRC} -- Computational Geometry Algorithms Library, version 4.8" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "UninstallString" "$\"$INSTDIR\Uninstall.exe$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "QuietUninstallString" "$\"$INSTDIR\Uninstall.exe$\" /S" - - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "NoModify" 1 - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "NoRepair" 1 - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "InstallLocation" "$\"$INSTDIR$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "DisplayIcon" "$\"$INSTDIR\cgal.ico$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "Publisher" "The CGAL Project and GeometryFactory" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "URLInfoAbout" "https://www.cgal.org/" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "DisplayedVersion" "4.8.0" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "CGALUninstallRegLoc" "$RegLoc" - - ;Create uninstaller - WriteUninstaller "$INSTDIR\Uninstall.exe" -SectionEnd -;-------------------------------- - -;-------------------------------- -Section "CGAL Examples and Demos" SAMPLES_Idx - -!ifndef SkipFiles - SetOutPath "$INSTDIR\examples" - File /r "${CGAL_SRC}\examples\*.*" - SetOutPath "$INSTDIR\demo" - File /r "${CGAL_SRC}\demo\*.*" -!endif -SectionEnd - -; Download and install GMP and MPFR binaries. -; Depend only on the platform (one variant per platform) -Section "GMP and MPFR precompiled libs" GMP_LIB_Idx - !ifndef FetchLocal - !insertmacro Install_GMP_MPFR_bin "$Platform" - !endif -SectionEnd - - -;-------------------------------- - - -Section /o "HTML Manuals" DOC_Idx - !ifndef FetchLocal - !insertmacro DownloadFileFrom "https://cgal.geometryfactory.com/" "CGAL/4.8/Manual/" "cgal_manual.zip" "$INSTDIR\doc_html" - !endif -SectionEnd - -Section "-Unzip" - - ${locate::Open} "$INSTDIR" "/D=0 /X=zip" $0 - ${If} $0 <> 0 - ${Do} - ${locate::Find} $0 $1 $2 $3 $4 $5 $6 - ${If} "$1" != "" - ZipDLL::extractall $1 $2 - Pop $7 - ${If} "$7" == "success" - Delete $1 - ${EndIf} - ${EndIf} - ${LoopUntil} "$1" == "" - ${EndIf} - ${locate::Close} $0 - ${locate::Unload} - -SectionEnd - -;-------------------------------- -;Uninstaller Section - -Section "Uninstall" - - ;ADD YOUR OWN FILES HERE... - - Delete "$INSTDIR\Uninstall.exe" - - RMDir /r "$INSTDIR" - - ReadRegStr $RegLoc HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" \ - "CGALUninstallRegLoc" - - DeleteRegKey /ifempty HKCU "Software\${CGAL_SRC}" - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CGAL_SRC}" - - ${un.EnvVarUpdate} $0 "PATH" "R" $RegLoc "$INSTDIR\auxiliary\gmp\lib" - ${If} $RegLoc == HKLM - ${un.DeleteEnvStr} "CGAL_DIR" 1 - ${Else} - ${un.DeleteEnvStr} "CGAL_DIR" 0 - ${EndIf} - -SectionEnd - - - - -;-------------------------------- -;Descriptions - - ;Language strings - LangString DESC_MAIN ${LANG_ENGLISH} "The main components of the CGAL Library." - LangString DESC_SAMPLES ${LANG_ENGLISH} "The CGAL demos and examples, for which you need Qt 5 in order to build them (and Qt 3 for some)." - LangString DESC_GMP_LIB ${LANG_ENGLISH} "The precompiled GMP and MPFR libraries (needed for exact constructions)." - LangString DESC_DOC ${LANG_ENGLISH} "The HTML manuals." - LangString DESC_ENVSET ${LANG_ENGLISH} "already set" - - ;Assign language strings to sections - !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${MAIN_Idx} $(DESC_MAIN) - !insertmacro MUI_DESCRIPTION_TEXT ${SAMPLES_Idx} $(DESC_SAMPLES) - !insertmacro MUI_DESCRIPTION_TEXT ${GMP_LIB_Idx} $(DESC_GMP_LIB) - !insertmacro MUI_DESCRIPTION_TEXT ${DOC_Idx} $(DESC_DOC) - !insertmacro MUI_FUNCTION_DESCRIPTION_END - - -;-------------------------------- -; Functions -;-------------------------------- - -Function .onInit - - # Setup the default installation dir - ${If} $InstDir == "" ; /D= was not used on the command line - StrCpy $InstDir "C:\dev\${CGAL_SRC}" - ${EndIf} - - !ifdef DebugLog - ${LogSetFileName} "${CGAL_SRC}_install_log.txt" - ${LogSetOn} - !endif - - StrCpy $Platform "win32" - - # the plugins dir is automatically deleted when the installer exits - InitPluginsDir - File /oname=$PLUGINSDIR\splash.bmp ".\CGAL.bmp" - advsplash::show 1000 600 400 -1 $PLUGINSDIR\splash - - !insertmacro MUI_INSTALLOPTIONS_EXTRACT "variants.ini" - !insertmacro MUI_INSTALLOPTIONS_EXTRACT "environment_variables.ini" - -FunctionEnd - - -Function .onInstSuccess - - ${If} $SetCGAL_DIR != "" - ; RegLoc can be either HKLM (all users) or HKCU (current user). - ${If} $RegLoc == HKLM - ${WriteEnvStr} "CGAL_DIR" $SetCGAL_DIR 1 - ${Else} - ${WriteEnvStr} "CGAL_DIR" $SetCGAL_DIR 0 - ${Endif} - ${EndIf} - - ${If} $Add_GMP_LIB_DIR_to_PATH = 1 - ; Append "$INSTDIR\auxiliary\gmp\lib" to the PATH. - ; RegLoc can be either HKLM (all users) or HKCU (current user). - ; The return value goes to $0 - ${EnvVarUpdate} $0 "PATH" "A" $RegLoc "$INSTDIR\auxiliary\gmp\lib" - ${EndIf} - -FunctionEnd - -Function VariantsPage - - !insertmacro MUI_HEADER_TEXT "Select platform" "Choose the platform for precompiled libraries." - !insertmacro MUI_INSTALLOPTIONS_INITDIALOG "variants.ini" - !insertmacro MUI_INSTALLOPTIONS_SHOW - - !insertmacro MUI_INSTALLOPTIONS_READ $0 "variants.ini" "Field 1" "State" - ${If} $0 = 1 - StrCpy $Platform "win32" - ${Else} - StrCpy $Platform "x64" - ${Endif} - -FunctionEnd - -# Disables the env var checkbox # FN and textbox # FN+1 -!macro UncheckEnvStrCheckbox FN - !insertmacro MUI_INSTALLOPTIONS_WRITE "environment_variables.ini" "Field ${FN}" "State" "0" -!macroend - -!macro CheckEnvStrCheckbox FN - !insertmacro MUI_INSTALLOPTIONS_WRITE "environment_variables.ini" "Field ${FN}" "State" "1" -!macroend - -!macro DisableEnvStrCheckbox FN - !insertmacro MUI_INSTALLOPTIONS_WRITE "environment_variables.ini" "Field ${FN}" "Flags" "DISABLED" -!macroend - -!macro EnableEnvStrCheckbox FN - !insertmacro MUI_INSTALLOPTIONS_WRITE "environment_variables.ini" "Field ${FN}" "Flags" "" -!macroend - -# Disables the env var checkbox # FN -!macro SetEnvStrValueSlot FN VAL - !insertmacro MUI_INSTALLOPTIONS_WRITE "environment_variables.ini" "Field ${FN}" "State" "${VAL}" -!macroend - -!macro SetEnvStrLabel FN VAL - !insertmacro MUI_INSTALLOPTIONS_WRITE "environment_variables.ini" "Field ${FN}" "Text" "${VAL}" -!macroend - - -Function envarsPage - - Push $0 - Push $1 - Push $2 - Push $3 - Push $4 - Push $5 - - - !insertmacro MUI_HEADER_TEXT "Setting Environment Variables" "Choose whether to set or not the following environment variables" - - ReadEnvStr $1 "CGAL_DIR" # $1 = existing value for CGAL_DIR - - !insertmacro SetEnvStrValueSlot 7 $INSTDIR - !insertmacro SetEnvStrValueSlot 7 $INSTDIR - - ${If} $1 != "" - StrCpy $3 "($(DESC_ENVSET): $1 )" - !insertmacro UncheckEnvStrCheckbox 6 - !insertmacro SetEnvStrLabel 8 $3 - ${Endif} - - SectionGetText ${GMP_LIB_Idx} $2 - - SectionGetFlags ${GMP_LIB_Idx} $1 - IntOp $2 $1 & ${SF_SELECTED} - - ${If} $2 == 0 - !insertmacro UncheckEnvStrCheckbox 9 - !insertmacro DisableEnvStrCheckbox 9 - ${Else} - !insertmacro CheckEnvStrCheckbox 9 - !insertmacro EnableEnvStrCheckbox 9 - ${Endif} - - !insertmacro MUI_INSTALLOPTIONS_INITDIALOG "environment_variables.ini" - - !insertmacro MUI_INSTALLOPTIONS_SHOW_RETURN - Pop $0 - ${If} "$0" = "success" - # PROCESSING - Installs selected environment variables - - !insertmacro MUI_INSTALLOPTIONS_READ $3 "environment_variables.ini" "Field 2" "State" # $3=Is ALL USERS selected - - ${If} $3 == 1 - StrCpy $RegLoc "HKLM" - ${Else} - StrCpy $RegLoc "HKCU" - ${EndIf} - - !insertmacro MUI_INSTALLOPTIONS_READ $3 "environment_variables.ini" "Field 6" "State" # CGAL_DIR checkbox - !insertmacro MUI_INSTALLOPTIONS_READ $4 "environment_variables.ini" "Field 7" "State" # CGAL_DIR value - ${If} $3 == 1 - StrCpy $SetCGAL_DIR $4 - ${EndIF} - - !insertmacro MUI_INSTALLOPTIONS_READ $5 "environment_variables.ini" "Field 9" "State" # Add to PATH checkbox - ${If} $5 == 1 - StrCpy $Add_GMP_LIB_DIR_to_PATH 1 - ${EndIF} - - ${EndIf} - - Pop $5 - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Pop $0 - -FunctionEnd diff --git a/wininst/developer_scripts/variants.ini b/wininst/developer_scripts/variants.ini deleted file mode 100644 index 2b838dbff97..00000000000 --- a/wininst/developer_scripts/variants.ini +++ /dev/null @@ -1,19 +0,0 @@ -[Settings] -NumFields=2 - -[Field 1] -Type=RadioButton -Text=32-bits -Left=10 -Right=-10 -Top=2 -Bottom=12 -State=1 - -[Field 2] -Type=RadioButton -Text=64-bits -Left=10 -Right=-10 -Top=15 -Bottom=24 diff --git a/wininst/developer_scripts/zirkel.bmp b/wininst/developer_scripts/zirkel.bmp deleted file mode 100644 index e4ef234b0b2..00000000000 Binary files a/wininst/developer_scripts/zirkel.bmp and /dev/null differ diff --git a/wininst/package_info/wininst/copyright b/wininst/package_info/wininst/copyright deleted file mode 100644 index a35c66ade4c..00000000000 --- a/wininst/package_info/wininst/copyright +++ /dev/null @@ -1,5 +0,0 @@ -Utrecht University (The Netherlands), -ETH Zurich (Switzerland), -INRIA Sophia-Antipolis (France), -Max-Planck-Institute Saarbruecken (Germany), -Tel-Aviv University (Israel). diff --git a/wininst/package_info/wininst/dependencies b/wininst/package_info/wininst/dependencies deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/wininst/package_info/wininst/description.txt b/wininst/package_info/wininst/description.txt deleted file mode 100644 index 083e45cb0e2..00000000000 --- a/wininst/package_info/wininst/description.txt +++ /dev/null @@ -1 +0,0 @@ -Win32-specific installation procedures diff --git a/wininst/package_info/wininst/maintainer b/wininst/package_info/wininst/maintainer deleted file mode 100644 index 4f45ddcd216..00000000000 --- a/wininst/package_info/wininst/maintainer +++ /dev/null @@ -1 +0,0 @@ -Andreas Fabri