Merge remote-tracking branch 'origin/Shape_detection-fix_leaks_in_ransac-danston' into Shape_detection-Region_growing_on_spheres-GF

This commit is contained in:
Dmitry Anisimov 2021-07-08 17:31:45 +02:00
commit ae0a1fd6d0
46 changed files with 621 additions and 318 deletions

View File

@ -6,12 +6,8 @@
The concept `AlphaShapeTraits_2` describes the requirements for the geometric traits The concept `AlphaShapeTraits_2` describes the requirements for the geometric traits
class of the underlying Delaunay triangulation of a basic alpha shape. class of the underlying Delaunay triangulation of a basic alpha shape.
\cgalRefines `DelaunayTriangulationTraits_2` \cgalRefines `DelaunayTriangulationTraits_2`, if the underlying triangulation of the alpha shape is a Delaunay triangulation.
\cgalRefines `Periodic_2DelaunayTriangulationTraits_2`, if the underlying triangulation of the alpha shape is a periodic Delaunay triangulation.
In addition to the requirements described in the concept
::DelaunayTriangulationTraits_2, the geometric traits class of a
Delaunay triangulation plugged in a basic alpha shapes provides the
following.
\cgalHasModel All models of `Kernel`. \cgalHasModel All models of `Kernel`.
\cgalHasModel Projection traits such as `CGAL::Projection_traits_xy_3<K>`. \cgalHasModel Projection traits such as `CGAL::Projection_traits_xy_3<K>`.

View File

@ -7,12 +7,7 @@ The concept `WeightedAlphaShapeTraits_2` describes the requirements
for the geometric traits class for the geometric traits class
of the underlying regular triangulation of a weighted alpha shape. of the underlying regular triangulation of a weighted alpha shape.
\cgalRefines `RegularTriangulationTraits_2` \cgalRefines `RegularTriangulationTraits_2`, if the underlying triangulation of the alpha shape is a regular triangulation.
In addition to the requirements described in the concept
`RegularTriangulationTraits_2`, the geometric traits class of a
regular triangulation plugged in a basic alpha shapes provides the
following.
\cgalHasModel All models of `Kernel`. \cgalHasModel All models of `Kernel`.
\cgalHasModel Projection traits such as `CGAL::Projection_traits_xy_3<K>`. \cgalHasModel Projection traits such as `CGAL::Projection_traits_xy_3<K>`.

View File

@ -7,12 +7,8 @@ The concept `AlphaShapeTraits_3` describes the requirements
for the geometric traits class for the geometric traits class
of the underlying Delaunay triangulation of a basic alpha shape. of the underlying Delaunay triangulation of a basic alpha shape.
\cgalRefines `DelaunayTriangulationTraits_3` \cgalRefines `DelaunayTriangulationTraits_3`, if the underlying triangulation of the alpha shape is a Delaunay triangulation.
\cgalRefines `Periodic_3DelaunayTriangulationTraits_3`, if the underlying triangulation of the alpha shape is a periodic Delaunay triangulation.
In addition to the requirements described in the concept
::DelaunayTriangulationTraits_3, the geometric traits class of a
Delaunay triangulation plugged in a basic alpha shapes provides the
following.
\cgalHasModel All models of `Kernel`. \cgalHasModel All models of `Kernel`.

View File

@ -7,12 +7,8 @@ The concept `FixedAlphaShapeTraits_3` describes the requirements
for the geometric traits class for the geometric traits class
of the underlying Delaunay triangulation of a basic alpha shape with a fixed value alpha. of the underlying Delaunay triangulation of a basic alpha shape with a fixed value alpha.
\cgalRefines `DelaunayTriangulationTraits_3` \cgalRefines `DelaunayTriangulationTraits_3`, if the underlying triangulation of the alpha shape is a Delaunay triangulation.
\cgalRefines `Periodic_3DelaunayTriangulationTraits_3`, if the underlying triangulation of the alpha shape is a periodic Delaunay triangulation.
In addition to the requirements described in the concept
`DelaunayTriangulationTraits_3`, the geometric traits class of a
Delaunay triangulation plugged in a basic alpha shape with fixed alpha
value provides the following.
\cgalHasModel All models of `Kernel`. \cgalHasModel All models of `Kernel`.

View File

@ -6,12 +6,8 @@
The concept `FixedWeightedAlphaShapeTraits_3` describes the requirements The concept `FixedWeightedAlphaShapeTraits_3` describes the requirements
for the geometric traits class of the underlying regular triangulation of a weighted alpha shape with fixed alpha value. for the geometric traits class of the underlying regular triangulation of a weighted alpha shape with fixed alpha value.
\cgalRefines `RegularTriangulationTraits_3` \cgalRefines `RegularTriangulationTraits_3`, if the underlying triangulation of the alpha shape is a regular triangulation.
\cgalRefines `Periodic_3RegularTriangulationTraits_3`, if the underlying triangulation of the alpha shape is a periodic regular triangulation.
In addition to the requirements described in the concept
::RegularTriangulationTraits_3, the geometric traits class of a
regular triangulation plugged in a weighted alpha shape with fixed
alpha value provides the following.
\cgalHasModel All models of `Kernel`. \cgalHasModel All models of `Kernel`.

View File

@ -7,12 +7,8 @@ The concept `WeightedAlphaShapeTraits_3` describes the requirements
for the geometric traits class for the geometric traits class
of the underlying regular triangulation of a weighted alpha shape. of the underlying regular triangulation of a weighted alpha shape.
\cgalRefines `RegularTriangulationTraits_3` \cgalRefines `RegularTriangulationTraits_3`, if the underlying triangulation of the alpha shape is a regular triangulation.
\cgalRefines `Periodic_3RegularTriangulationTraits_3`, if the underlying triangulation of the alpha shape is a periodic regular triangulation.
In addition to the requirements described in the concept
`RegularTriangulationTraits_3`, the geometric traits class of a
regular triangulation plugged in a basic alpha shapes provides the
following.
\cgalHasModel All models of `Kernel`. \cgalHasModel All models of `Kernel`.

View File

@ -102,6 +102,9 @@ CGAL_add_named_parameter(use_angle_smoothing_t, use_angle_smoothing, use_angle_s
CGAL_add_named_parameter(use_area_smoothing_t, use_area_smoothing, use_area_smoothing) CGAL_add_named_parameter(use_area_smoothing_t, use_area_smoothing, use_area_smoothing)
CGAL_add_named_parameter(use_Delaunay_flips_t, use_Delaunay_flips, use_Delaunay_flips) CGAL_add_named_parameter(use_Delaunay_flips_t, use_Delaunay_flips, use_Delaunay_flips)
CGAL_add_named_parameter(do_project_t, do_project, do_project) CGAL_add_named_parameter(do_project_t, do_project, do_project)
CGAL_add_named_parameter(do_split_t, do_split, do_split)
CGAL_add_named_parameter(do_collapse_t, do_collapse, do_collapse)
CGAL_add_named_parameter(do_flip_t, do_flip, do_flip)
CGAL_add_named_parameter(do_orientation_tests_t, do_orientation_tests, do_orientation_tests) CGAL_add_named_parameter(do_orientation_tests_t, do_orientation_tests, do_orientation_tests)
CGAL_add_named_parameter(do_self_intersection_tests_t, do_self_intersection_tests, do_self_intersection_tests) CGAL_add_named_parameter(do_self_intersection_tests_t, do_self_intersection_tests, do_self_intersection_tests)
CGAL_add_named_parameter(error_codes_t, error_codes, error_codes) CGAL_add_named_parameter(error_codes_t, error_codes, error_codes)

View File

@ -2741,6 +2741,7 @@ namespace CartesianKernelFunctors {
{ {
typedef typename K::FT FT; typedef typename K::FT FT;
typedef typename K::Point_2 Point_2; typedef typename K::Point_2 Point_2;
typedef typename K::Segment_2 Segment_2;
public: public:
typedef Point_2 result_type; typedef Point_2 result_type;
@ -2752,6 +2753,17 @@ namespace CartesianKernelFunctors {
midpointC2(p.x(), p.y(), q.x(), q.y(), x, y); midpointC2(p.x(), p.y(), q.x(), q.y(), x, y);
return construct_point_2(x, y); return construct_point_2(x, y);
} }
Point_2
operator()(const Segment_2& s) const
{
typename K::Construct_point_2 construct_point_2;
FT x, y;
const Point_2& p = s.source();
const Point_2& q = s.target();
midpointC2(p.x(), p.y(), q.x(), q.y(), x, y);
return construct_point_2(x, y);
}
}; };
template <typename K> template <typename K>
@ -2759,6 +2771,7 @@ namespace CartesianKernelFunctors {
{ {
typedef typename K::FT FT; typedef typename K::FT FT;
typedef typename K::Point_3 Point_3; typedef typename K::Point_3 Point_3;
typedef typename K::Segment_3 Segment_3;
public: public:
typedef Point_3 result_type; typedef Point_3 result_type;
@ -2770,6 +2783,17 @@ namespace CartesianKernelFunctors {
midpointC3(p.x(), p.y(), p.z(), q.x(), q.y(), q.z(), x, y, z); midpointC3(p.x(), p.y(), p.z(), q.x(), q.y(), q.z(), x, y, z);
return construct_point_3(x, y, z); return construct_point_3(x, y, z);
} }
Point_3
operator()(const Segment_3& s) const
{
const Point_3& p = s.source();
const Point_3& q = s.target();
typename K::Construct_point_3 construct_point_3;
FT x, y, z;
midpointC3(p.x(), p.y(), p.z(), q.x(), q.y(), q.z(), x, y, z);
return construct_point_3(x, y, z);
}
}; };
template <typename K> template <typename K>

View File

@ -16,7 +16,7 @@ The following pages cover advanced installation options:
- \subpage configurationvariables gives information about which CMake variables can be used to help - \subpage configurationvariables gives information about which CMake variables can be used to help
resolve missing dependencies while using the cmake command line tool. resolve missing dependencies while using the cmake command line tool.
- \subpage installation describes the deprecated process of configuring and building \cgal. - \subpage installation describes the process of configuring and installing \cgal.
The following pages cover the structure of the manual and general information about \cgal: The following pages cover the structure of the manual and general information about \cgal:

View File

@ -28,7 +28,7 @@ Older versions of the above listed compilers might work, but no guarantee is pro
In order to configure and build the \cgal examples, demos, or libraries, In order to configure and build the \cgal examples, demos, or libraries,
you need <a href="https://cmake.org/">CMake</a>, a cross-platform "makefile generator". you need <a href="https://cmake.org/">CMake</a>, a cross-platform "makefile generator".
This manual explains only the features of CMake which are needed in order to build \cgal. This manual explains only the features of CMake which are needed in order to use \cgal.
Please refer to the <a href="https://cmake.org/documentation/">CMake documentation</a> Please refer to the <a href="https://cmake.org/documentation/">CMake documentation</a>
for further details. for further details.
@ -84,7 +84,7 @@ and for multi precision floating point numbers.
\cgal combines floating point arithmetic with exact arithmetic \cgal combines floating point arithmetic with exact arithmetic
in order to be efficient and reliable. \cgal has a built-in in order to be efficient and reliable. \cgal has a built-in
number type for that, but \gmp and \mpfr provide a faster number type for that, but \gmp and \mpfr provide a faster
solution, and we recommend to use them. solution, and we recommend using them.
These libraries can be obtained from <A HREF="https://gmplib.org/">`https://gmplib.org/`</A> These libraries can be obtained from <A HREF="https://gmplib.org/">`https://gmplib.org/`</A>
and <A HREF="https://www.mpfr.org/">`https://www.mpfr.org/`</A>. and <A HREF="https://www.mpfr.org/">`https://www.mpfr.org/`</A>.

View File

@ -166,12 +166,17 @@ if no debugging is intended. Users should thus run:
cd CGAL-\cgalReleaseNumber/examples/Triangulation_2 cd CGAL-\cgalReleaseNumber/examples/Triangulation_2
cmake -DCGAL_DIR=$HOME/CGAL-\cgalReleaseNumber -DCMAKE_BUILD_TYPE=Release . # we are here using a release tarball cmake -DCGAL_DIR=$HOME/CGAL-\cgalReleaseNumber -DCMAKE_BUILD_TYPE=Release . # we are here using a release tarball
Note that the package Qt on brew is "keg-only", which means it cannot be "linked" with brew. The package Qt5 on brew is "keg-only", which means it is not "linked" with brew.
You will have to specify the Qt5_DIR by hand to cmake, using something like In order to link against Qt5, you need to run:
-DQt5_DIR=/usr/local/opt/qt/lib/cmake/Qt5 brew link qt@5
where '/usr/local/` is actually your current brew installation directory. After that, you will have to specify the Qt5_DIR by hand to cmake, using something like
-DQt5_DIR=/usr/local/opt/qt5/lib/cmake/Qt5
where '/usr/local/` is actually your current brew installation directory. Check this directory
to be sure where the Qt5 is placed on your machine.
\subsection usage_configuring_cmake_gui Specifying Missing Dependencies \subsection usage_configuring_cmake_gui Specifying Missing Dependencies

View File

@ -19,7 +19,7 @@ summarized below are CMake variables.
\subsection installation_component_selection Component Selection \subsection installation_component_selection Component Selection
The following boolean variables indicate which \cgal components to The following boolean variables indicate which \cgal components to
configure and build. Their values can be ON or OFF. configure and/or build. Their values can be ON or OFF.
| Variable | %Default Value | | Variable | %Default Value |

View File

@ -1,29 +1,29 @@
/*! /*!
\page installation Building %CGAL libraries (non header-only mode) \page installation Installing %CGAL libraries
\cgalAutoToc \cgalAutoToc
\cgalAdvancedBegin \cgalAdvancedBegin
Since \cgal version 5.0, \cgal is header-only be default, which means Since \cgal version 5.0, \cgal is header-only, which means
that there is no need to compile \cgal or its libraries before it can be used. that there is no need to compile \cgal or its libraries before it can be used.
This page is for advanced users that have a good reason to still use the old way. This page is for advanced users that either want to install CGAL on their system, or want to build the examples,
tests and demos that are shipped in a git branch, for example.
If this is not your case, head over back to the page \ref general_intro. If this is not your case, head over back to the page \ref general_intro.
\cgalAdvancedEnd \cgalAdvancedEnd
This page is a step-by-step description of how to configure, build, and (optionally) install \cgal This page is a step-by-step description of how to configure and install \cgal, and (optionally)
in case you do not wish to use the - now enabled by default - header-only mode of \cgal. build examples, tests and demos.
It is assumed that you have downloaded a source archive of \cgal, and are using Linux or macOS. It is assumed that you have downloaded a source archive of \cgal, and are using Linux or macOS.
\section installation_idealworld Quick Installation \section installation_idealworld Quick Installation
Ideally, compiling and installing \cgal, as well as compiling some examples shipped by \cgal is as simple as: Ideally, installing \cgal, as well as compiling some examples shipped by \cgal is as simple as:
cd $HOME/CGAL-\cgalReleaseNumber cd $HOME/CGAL-\cgalReleaseNumber
mkdir build mkdir build
cd build cd build
cmake -DCGAL_HEADER_ONLY=OFF -DCMAKE_BUILD_TYPE=Release .. # configure CGAL cmake .. # configure CGAL
make # build CGAL
make install # install CGAL make install # install CGAL
cd examples/Triangulation_2 # go to an example directory cd examples/Triangulation_2 # go to an example directory
cmake -DCGAL_DIR=$CMAKE_INSTALLED_PREFIX/lib/CGAL -DCMAKE_BUILD_TYPE=Release . # configure the examples cmake -DCGAL_DIR=$CMAKE_INSTALLED_PREFIX/lib/CGAL -DCMAKE_BUILD_TYPE=Release . # configure the examples
@ -34,12 +34,11 @@ This is what this page is about.
\section installation_configwithcmake Configuring CGAL with CMake \section installation_configwithcmake Configuring CGAL with CMake
Before building \cgal, or anything using \cgal, you have to choose the compiler/linker, Before building anything using \cgal, you have to choose the compiler/linker,
set compiler and linker flags, specify which set compiler and linker flags and specify which
third-party libraries you want to use and where they can be found, and third-party libraries you want to use and where they can be found. Gathering
which \cgal libraries you want to build. Gathering
all this information is called <I>configuration</I>. all this information is called <I>configuration</I>.
The end of the process is marked by the generation of a makefile that you can use to build \cgal. The end of the process is marked by the generation of a makefile that you can use to install \cgal.
CMake maintains configuration parameters in so-called <I>cmake variables</I>. Some of the CMake CMake maintains configuration parameters in so-called <I>cmake variables</I>. Some of the CMake
variables represent user choices, such as `CMAKE_BUILD_TYPE`, while others variables represent user choices, such as `CMAKE_BUILD_TYPE`, while others
@ -51,25 +50,19 @@ and finally the configuration and build processes.
\subsection seclibraries CGAL Libraries \subsection seclibraries CGAL Libraries
\cgal is split into four libraries. During configuration, you can select the libraries that \cgal has some optional components. During configuration, you can select the components that
you would like to build by setting a CMake variable of the form <TT>WITH_<library></TT>. By default all you would like to use by setting a CMake variable of the form <TT>WITH_<library></TT>. By default all
are switched `ON`. All activated libraries are to be built after configuration. are switched `ON`, but some have specific dependencies in addition to the essential ones, so if you don't
need those, don't hesitate to switch them `OFF`.
Note that some libraries have specific dependencies in addition to the essential ones. See the page See the page
\ref secessential3rdpartysoftware for more information. \ref secessential3rdpartysoftware for more information.
| Library | CMake Variable | Functionality | Dependencies | | Component | CMake Variable | Functionality | Dependencies |
| :-------- | :------------- | :------------ | :----------- | | :-------- | :------------- | :------------ | :----------- |
| \cgal | none | Main library | \gmp, \mpfr, \boost (headers) | | \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_ImageIO` | `WITH_CGAL_ImageIO` | Utilities to read and write image files | \zlib, \vtk (optional) |
| `CGAL_Qt5` | `WITH_CGAL_Qt5` | `QGraphicsView` support for \qt5-based demos | \qt5 | | `CGAL_Qt5` | `WITH_CGAL_Qt5` | `QGraphicsView` support for \qt5-based demos | \qt5 |
Shared libraries, also called <I>dynamic-link libraries</I>, are built by default
(`.so` on Linux, `.dylib` on macOS). You
can choose to produce static libraries instead, by setting the CMake
variable `BUILD_SHARED_LIBS` to `FALSE`.
\subsection installation_examples CGAL Examples and Demos \subsection installation_examples CGAL Examples and Demos
\cgal is distributed with a large collection of examples and demos. By default, these are <B>not</B> configured along with \cgal is distributed with a large collection of examples and demos. By default, these are <B>not</B> configured along with
@ -84,7 +77,7 @@ might need these \cgal-libraries and thus their dependencies. See the page
\subsection installation_debugrelease Debug vs. Release \subsection installation_debugrelease Debug vs. Release
The CMake variable `CMAKE_BUILD_TYPE` indicates how to build the libraries. The CMake variable `CMAKE_BUILD_TYPE` indicates how to build the executables.
It accepts the values `Debug` or `Release`. Note that the default value is `Debug`, since it is It accepts the values `Debug` or `Release`. Note that the default value is `Debug`, since it is
default value in `CMake`. If you do not plan on debugging, it is important to set the variable default value in `CMake`. If you do not plan on debugging, it is important to set the variable
to `Release` for performance reasons. to `Release` for performance reasons.
@ -98,7 +91,6 @@ There are many more variables that can be used during configuration. The most im
<ul> <ul>
<li> `CMAKE_INSTALL_PREFIX=<dir>` installation directory [/usr/local]</li> <li> `CMAKE_INSTALL_PREFIX=<dir>` installation directory [/usr/local]</li>
<li>`CMAKE_BUILD_TYPE=<Debug|Release>` build type [Release]</li> <li>`CMAKE_BUILD_TYPE=<Debug|Release>` build type [Release]</li>
<li>`BUILD_SHARED_LIBS=<TRUE|FALSE>` shared or static libraries [TRUE]</li>
<li>`CMAKE_C_COMPILER=<program>` C compiler [gcc]</li> <li>`CMAKE_C_COMPILER=<program>` C compiler [gcc]</li>
<li>`CMAKE_CXX_COMPILER=<program>` C++ compiler [g++]</li> <li>`CMAKE_CXX_COMPILER=<program>` C++ compiler [g++]</li>
</ul> </ul>
@ -145,9 +137,6 @@ Providing information and pressing *Configure* goes on until
all entries are grayed. You are now ready to press *Generate*. Once this is all entries are grayed. You are now ready to press *Generate*. Once this is
done, you can quit `cmake-gui`. done, you can quit `cmake-gui`.
Since you intend to build CGAL libraries, you should also ensure that the variable
`CGAL_HEADER_ONLY` has not been set.
If you do not need to debug, you should set the variable `CMAKE_BUILD_TYPE` to `Release`. If you do not need to debug, you should set the variable `CMAKE_BUILD_TYPE` to `Release`.
\subsection installation_configuring_cmd Configuring CGAL with the cmake Command-Line Tool \subsection installation_configuring_cmd Configuring CGAL with the cmake Command-Line Tool
@ -184,7 +173,7 @@ building of a program using \cgal, see Section \ref installation_buildprogram.
\section seccmakeoutofsource Multiple Builds \section seccmakeoutofsource Multiple Builds
While you can choose between release or debug builds, and shared or static libraries, While you can choose between release or debug builds,
it is not possible to generate different variants during a single configuration. You need to run CMake in a it is not possible to generate different variants during a single configuration. You need to run CMake in a
different directory for each variant you are interested in, each with its own selection of configuration parameters. different directory for each variant you are interested in, each with its own selection of configuration parameters.
@ -208,38 +197,23 @@ You can, for example, generate subdirectories `CGAL-\cgalReleaseNumber``/build/d
cd CGAL-\cgalReleaseNumber/build/release cd CGAL-\cgalReleaseNumber/build/release
cmake -DCMAKE_BUILD_TYPE=Release ../.. cmake -DCMAKE_BUILD_TYPE=Release ../..
\section secbuilding Building CGAL
\subsection ssec_installation_build_ex_demos Building Examples and Demos
Let's assume that you have turned on the configuration of examples
(`-DWITH_examples=ON`) and/or demos (`-DWITH_demos=ON`).
The results of a successful configuration are build files that control the build step. The results of a successful configuration are build files that control the build step.
The nature of the build files depends on the generator used during configuration, but in all cases they The nature of the build files depends on the generator used during configuration, but in all cases they
contain several <I>targets</I>, one per library, and a default global target corresponding contain several <I>targets</I>, one per executable, and a default global target corresponding
to all the libraries. to all of them (called `examples` and/or `demos`).
For example, in a \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: You can use the `make` command-line tool for the succeeding build step as follows:
# build all the selected libraries at once # build all the selected examples at once
make make examples
The resulting libraries are placed in the subdirectory `lib` under `<CMAKE_BINARY_DIR>`
(which is `CGAL-\cgalReleaseNumber` in case you run an in-source-configuration).
\cgalAdvancedBegin
The build files produced by CMake are autoconfigured. That
is, if you change any of the dependencies, the build step
automatically goes all the way back to the configuration step. This
way, once the target has been configured the very first time by
invoking cmake, you don't necessarily need to invoke `cmake`
again. Rebuilding will call itself `cmake` and re-generate the
build file whenever needed.
\cgalAdvancedEnd
\subsection ssec_installation_build_ex_demos Building Examples and Demos
If you have turned on the configuration of examples
(`-DWITH_examples=ON`) and/or demos (`-DWITH_demos=ON`), there will be additional
targets named `examples` and `demos`, plus one target for
each example and each demo in the build files.
None of these targets are included by default, so you need to build them explicitly None of these targets are included by default, so you need to build them explicitly
<I>after</I> the \cgal libraries have been successfully built. <I>after</I> the \cgal libraries have been successfully built.
The targets `examples` and `demos` include themselves all the targets The targets `examples` and `demos` include themselves all the targets
@ -259,6 +233,15 @@ If you are interested in the demos or examples of just a particular module, you
When using `UNIX Makefiles`, you can find out the exact name of the example or demo target When using `UNIX Makefiles`, you can find out the exact name of the example or demo target
of a particular package by typing `make help | grep <package>`. of a particular package by typing `make help | grep <package>`.
\cgalAdvancedBegin
The build files produced by CMake are autoconfigured. That
is, if you change any of the dependencies, the build step
automatically goes all the way back to the configuration step. This
way, once the target has been configured the very first time by
invoking cmake, you don't necessarily need to invoke `cmake`
again. Rebuilding will call itself `cmake` and re-generate the
build file whenever needed.
\cgalAdvancedEnd
\section secinstalling Installing CGAL \section secinstalling Installing CGAL
On many platforms, library pieces such as headers, docs and binaries On many platforms, library pieces such as headers, docs and binaries
@ -266,10 +249,10 @@ are expected to be placed in specific locations. A typical example
being `/usr/include` and `/usr/lib`. The process being `/usr/include` and `/usr/lib`. The process
of placing or copying the library elements into its standard location of placing or copying the library elements into its standard location
is sometimes referred to as <I>Installation</I> and it is a is sometimes referred to as <I>Installation</I> and it is a
postprocessing step after the build step. postprocessing step after the configuration step.
CMake carries out the installation by producing a build target named <I>install</I>. CMake carries out the installation by producing a build target named <I>install</I>.
Assuming you have successfully configured and built \cgal as demonstrated in the previous sections, Assuming you have successfully configured \cgal as demonstrated in the previous sections,
the installation simply amounts to: the installation simply amounts to:
# install CGAL # install CGAL
@ -283,7 +266,7 @@ variable explicitly <I>at the configuration time</I> and not when executing the
\cgalAdvancedEnd \cgalAdvancedEnd
The file `CGALConfig.cmake` is installed by default in The file `CGALConfig.cmake` is installed by default in
`$CMAKE_INSTALLED_PREFIX/lib/``CGAL-\cgalReleaseNumber`. `$CMAKE_INSTALLED_PREFIX/lib/cmake/CGAL`.
\section installation_buildprogram Building a Program using CGAL \section installation_buildprogram Building a Program using CGAL
@ -305,7 +288,7 @@ the process of configuring a user's program called `your_program.cpp` amounts to
In order to configure a program, you need to indicate the location of the \cgal configuration file In order to configure a program, you need to indicate the location of the \cgal configuration file
in the CMake variable `CGAL_DIR` (as shown in the example above). in the CMake variable `CGAL_DIR` (as shown in the example above).
If you have installed \cgal, `CGAL_DIR` must afterwards be set to `$CMAKE_INSTALLED_PREFIX/lib/CGAL`. If you have installed \cgal, `CGAL_DIR` must afterwards be set to `$CMAKE_INSTALLED_PREFIX/lib/cmake/CGAL`.
The variable `CGAL_DIR` can also be an environment variable, but setting it manually makes particular sense The variable `CGAL_DIR` can also be an environment variable, but setting it manually makes particular sense
if you have multiple out-of-source builds of \cgal as in Section \ref seccmakeoutofsource. if you have multiple out-of-source builds of \cgal as in Section \ref seccmakeoutofsource.

View File

@ -85653,7 +85653,7 @@ fitting method."
, title = "The {CORE} Library Project" , title = "The {CORE} Library Project"
, edition = "1.2" , edition = "1.2"
, year = 1999 , year = 1999
, url = "https://cs.nyu.edu/exact/core/" , url = "https://www.cs.nyu.edu/exact/doc/core.pdf"
, update = "00.03 devillers" , update = "00.03 devillers"
} }

View File

@ -6,10 +6,10 @@
var current_version_local = '5.3-beta1' var current_version_local = '5.3-beta1'
var all_versions = [ var all_versions = [
'master', 'master',
'5.3-beta1', '5.3',
'latest', 'latest',
'5.2.2', '5.2.3',
'5.1.4', '5.1.5',
'5.0.4', '5.0.4',
'4.14.3', '4.14.3',
'4.13.2', '4.13.2',

View File

@ -6,10 +6,10 @@
var current_version_local = '5.3-beta1' var current_version_local = '5.3-beta1'
var all_versions = [ var all_versions = [
'master', 'master',
'5.3-beta1', '5.3',
'latest', 'latest',
'5.2.2', '5.2.3',
'5.1.4', '5.1.5',
'5.0.4', '5.0.4',
'4.14.3', '4.14.3',
'4.13.2', '4.13.2',

View File

@ -6,10 +6,10 @@
var current_version_local = '5.3-beta1' var current_version_local = '5.3-beta1'
var all_versions = [ var all_versions = [
'master', 'master',
'5.3-beta1', '5.3',
'latest', 'latest',
'5.2.2', '5.2.3',
'5.1.4', '5.1.5',
'5.0.4', '5.0.4',
'4.14.3', '4.14.3',
'4.13.2', '4.13.2',

View File

@ -6,10 +6,10 @@
var current_version_local = '5.3-beta1' var current_version_local = '5.3-beta1'
var all_versions = [ var all_versions = [
'master', 'master',
'5.3-beta1', '5.3',
'latest', 'latest',
'5.2.2', '5.2.3',
'5.1.4', '5.1.5',
'5.0.4', '5.0.4',
'4.14.3', '4.14.3',
'4.13.2', '4.13.2',

View File

@ -236,6 +236,7 @@ template <typename AT_, typename ET, typename E2A>
class Lazy_rep : public Rep, public Depth_base class Lazy_rep : public Rep, public Depth_base
{ {
Lazy_rep (const Lazy_rep&) = delete; // cannot be copied. Lazy_rep (const Lazy_rep&) = delete; // cannot be copied.
Lazy_rep& operator= (const Lazy_rep&) = delete; // cannot be copied.
public: public:
@ -247,6 +248,28 @@ public:
Lazy_rep () Lazy_rep ()
: at(), et(nullptr){} : at(), et(nullptr){}
//move-constructor
Lazy_rep (Lazy_rep&& other)
: at(std::move(other.at)), et(other.et)
{
other.et = nullptr;
this->count = std::move(other.count);
}
//move-assignment
Lazy_rep& operator= (Lazy_rep&& other)
{
if(this->et)
{
delete this->et;
}
this->et = other.et;
other.et = nullptr;
this->at = std::move(other.at);
this->count = std::move(other.count);
return *this;
}
template<class A> template<class A>
Lazy_rep (A&& a) Lazy_rep (A&& a)
: at(std::forward<A>(a)), et(nullptr){} : at(std::forward<A>(a)), et(nullptr){}

View File

@ -2950,6 +2950,7 @@ namespace HomogeneousKernelFunctors {
{ {
typedef typename K::FT FT; typedef typename K::FT FT;
typedef typename K::Point_2 Point_2; typedef typename K::Point_2 Point_2;
typedef typename K::Segment_2 Segment_2;
public: public:
typedef Point_2 result_type; typedef Point_2 result_type;
@ -2963,6 +2964,19 @@ namespace HomogeneousKernelFunctors {
p.hy()*qhw + q.hy()*phw, p.hy()*qhw + q.hy()*phw,
phw * qhw * RT( 2)); phw * qhw * RT( 2));
} }
Point_2
operator()(const Segment_2& s) const
{
typedef typename K::RT RT;
const Point_2& p = s.source();
const Point_2& q = s.target();
const RT& phw = p.hw();
const RT& qhw = q.hw();
return Point_2( p.hx()*qhw + q.hx()*phw,
p.hy()*qhw + q.hy()*phw,
phw * qhw * RT( 2));
}
}; };
template <typename K> template <typename K>
@ -2970,6 +2984,7 @@ namespace HomogeneousKernelFunctors {
{ {
typedef typename K::FT FT; typedef typename K::FT FT;
typedef typename K::Point_3 Point_3; typedef typename K::Point_3 Point_3;
typedef typename K::Segment_3 Segment_3;
public: public:
typedef Point_3 result_type; typedef Point_3 result_type;
@ -2984,6 +2999,20 @@ namespace HomogeneousKernelFunctors {
p.hz()*qhw + q.hz()*phw, p.hz()*qhw + q.hz()*phw,
RT(2) * phw * qhw ); RT(2) * phw * qhw );
} }
Point_3
operator()(const Segment_3& s) const
{
typedef typename K::RT RT;
const Point_3& p = s.source();
const Point_3& q = s.target();
RT phw = p.hw();
RT qhw = q.hw();
return Point_3( p.hx()*qhw + q.hx()*phw,
p.hy()*qhw + q.hy()*phw,
p.hz()*qhw + q.hz()*phw,
RT(2) * phw * qhw );
}
}; };
// TODO ... // TODO ...

View File

@ -12,6 +12,15 @@ Release History
Release date: July 2021 Release date: July 2021
### [General changes](https://doc.cgal.org/5.3/Manual/general_intro.html)
- The support for the compiled version of CGAL is dropped. Only the header-only version is supported.
- On Windows, the type used for `Exact_rational`, in `Epick` and indirectly (through `Lazy_exact_nt`)
`Epeck` may now be `boost::multiprecision::mpq_rational`, as has been the case on other platforms
for several releases. This depends on various options and is added to a list that includes
`mpq_class`, `CGAL::Gmpq`, `leda_rational` and `CGAL::Quotient<CGAL::MP_Float>`.
### [Quadtrees, Octrees, and Orthtrees](https://doc.cgal.org/5.3/Manual/packages.html#PkgOrthtree) (new package) ### [Quadtrees, Octrees, and Orthtrees](https://doc.cgal.org/5.3/Manual/packages.html#PkgOrthtree) (new package)
- This package implements a tree data structure in which each node encloses a hypercubic section - This package implements a tree data structure in which each node encloses a hypercubic section

View File

@ -17,12 +17,12 @@
#define CGAL_VERSION_H #define CGAL_VERSION_H
#ifndef SWIG #ifndef SWIG
#define CGAL_VERSION 5.3-beta2 #define CGAL_VERSION 5.4-dev
#define CGAL_GIT_HASH abcdef #define CGAL_GIT_HASH abcdef
#endif #endif
#define CGAL_VERSION_NR 1050300920 #define CGAL_VERSION_NR 1050400900
#define CGAL_SVN_REVISION 99999 #define CGAL_SVN_REVISION 99999
#define CGAL_RELEASE_DATE 20210630 #define CGAL_RELEASE_DATE 20211206
#include <CGAL/version_macros.h> #include <CGAL/version_macros.h>

View File

@ -1,8 +1,8 @@
set(CGAL_MAJOR_VERSION 5) set(CGAL_MAJOR_VERSION 5)
set(CGAL_MINOR_VERSION 3) set(CGAL_MINOR_VERSION 4)
set(CGAL_BUGFIX_VERSION 0) set(CGAL_BUGFIX_VERSION 0)
include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake) include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake)
set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "5.3-beta2") set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "5.4-dev")
set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}") set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}")
if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0) if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0)

View File

@ -2242,12 +2242,25 @@ template <typename Kernel>
CGAL::Point_2<Kernel> midpoint( const CGAL::Point_2<Kernel>& p, CGAL::Point_2<Kernel> midpoint( const CGAL::Point_2<Kernel>& p,
const CGAL::Point_2<Kernel>& q ); const CGAL::Point_2<Kernel>& q );
/*!
computes the midpoint of the segment `s`.
*/
template <typename Kernel>
CGAL::Point_2<Kernel> midpoint( const CGAL::Segment_2<Kernel>& s);
/*! /*!
computes the midpoint of the segment `pq`. computes the midpoint of the segment `pq`.
*/ */
template <typename Kernel> template <typename Kernel>
CGAL::Point_3<Kernel> midpoint( const CGAL::Point_3<Kernel>& p, const CGAL::Point_3<Kernel>& q ); CGAL::Point_3<Kernel> midpoint( const CGAL::Point_3<Kernel>& p, const CGAL::Point_3<Kernel>& q );
/*!
computes the midpoint of the segment `s`.
*/
template <typename Kernel>
CGAL::Point_3<Kernel> midpoint( const CGAL::Segment_3<Kernel>& s );
/// @} /// @}
/// \defgroup min_vertex_grp CGAL::min_vertex() /// \defgroup min_vertex_grp CGAL::min_vertex()

View File

@ -4996,6 +4996,10 @@ public:
*/ */
Kernel::Point_2 operator()(const Kernel::Point_2& p, Kernel::Point_2 operator()(const Kernel::Point_2& p,
const Kernel::Point_2& q ); const Kernel::Point_2& q );
/*!
computes the midpoint of the segment `s`.
*/
Kernel::Point_2 operator()(const Kernel::Segment_2& s);
/// @} /// @}
@ -5023,6 +5027,11 @@ public:
Kernel::Point_3 operator()(const Kernel::Point_3& p, Kernel::Point_3 operator()(const Kernel::Point_3& p,
const Kernel::Point_3& q ); const Kernel::Point_3& q );
/*!
computes the midpoint of the segment `s`.
*/
Kernel::Point_3 operator()(const Kernel::Segment_3& s);
/// @} /// @}

View File

@ -61,6 +61,8 @@ public:
inline double ymin() const; inline double ymin() const;
inline double xmax() const; inline double xmax() const;
inline double ymax() const; inline double ymax() const;
inline double x_span() const;
inline double y_span() const;
inline double max BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const; inline double max BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const;
inline double min BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const; inline double min BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const;
@ -91,6 +93,14 @@ double
Bbox_2::ymax() const Bbox_2::ymax() const
{ return rep[3]; } { return rep[3]; }
inline double Bbox_2::x_span() const {
return xmax() - xmin();
}
inline double Bbox_2::y_span() const {
return ymax() - ymin();
}
inline inline
bool bool
Bbox_2::operator==(const Bbox_2 &b) const Bbox_2::operator==(const Bbox_2 &b) const

View File

@ -63,6 +63,9 @@ public:
double xmax() const; double xmax() const;
double ymax() const; double ymax() const;
double zmax() const; double zmax() const;
double x_span() const;
double y_span() const;
double z_span() const;
inline double min BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const; inline double min BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const;
inline double max BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const; inline double max BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const;
@ -106,6 +109,18 @@ double
Bbox_3::zmax() const Bbox_3::zmax() const
{ return rep[5]; } { return rep[5]; }
inline double Bbox_3::x_span() const {
return xmax() - xmin();
}
inline double Bbox_3::y_span() const {
return ymax() - ymin();
}
inline double Bbox_3::z_span() const {
return zmax() - zmin();
}
inline inline
bool bool
Bbox_3::operator==(const Bbox_3 &b) const Bbox_3::operator==(const Bbox_3 &b) const

View File

@ -754,6 +754,12 @@ midpoint(const Point_2<K> &p, const Point_2<K> &q)
return internal::midpoint(p, q, K()); return internal::midpoint(p, q, K());
} }
template < class K >
inline typename K::Point_2 midpoint(const Segment_2<K> &s)
{
return internal::midpoint(s, K());
}
template < class K > template < class K >
inline inline
typename K::Point_2 typename K::Point_2

View File

@ -738,6 +738,12 @@ midpoint(const Point_3<K> &p, const Point_3<K> &q)
return internal::midpoint(p, q, K()); return internal::midpoint(p, q, K());
} }
template < class K >
inline typename K::Point_3 midpoint(const Segment_3<K> &s)
{
return internal::midpoint(s, K());
}
template < class K > template < class K >
inline inline
typename K::Point_3 typename K::Point_3

View File

@ -788,6 +788,14 @@ midpoint(const typename K::Point_2 &p,
return k.construct_midpoint_2_object()(p, q); return k.construct_midpoint_2_object()(p, q);
} }
template < class K >
inline
typename K::Point_2
midpoint(const typename K::Segment_2 &s, const K &k)
{
return k.construct_midpoint_2_object()(s);
}
template < class K > template < class K >
inline inline
typename K::Point_2 typename K::Point_2

View File

@ -829,6 +829,14 @@ midpoint(const typename K::Point_3 &p,
return k.construct_midpoint_3_object()(p, q); return k.construct_midpoint_3_object()(p, q);
} }
template < class K >
inline
typename K::Point_3
midpoint(const typename K::Segment_3 &s, const K &k)
{
return k.construct_midpoint_3_object()(s);
}
template < class K > template < class K >
inline inline
typename K::Point_3 typename K::Point_3

View File

@ -24,6 +24,7 @@ _test_fct_constructions_2(const R&)
{ {
typedef typename R::RT RT; typedef typename R::RT RT;
typedef CGAL::Point_2<R> Point; typedef CGAL::Point_2<R> Point;
typedef CGAL::Segment_2<R> Segment;
typedef CGAL::Weighted_point_2<R> Weighted_Point; typedef CGAL::Weighted_point_2<R> Weighted_Point;
typedef CGAL::Triangle_2<R> Triangle; typedef CGAL::Triangle_2<R> Triangle;
typedef CGAL::Vector_2<R> Vector; typedef CGAL::Vector_2<R> Vector;
@ -52,6 +53,7 @@ _test_fct_constructions_2(const R&)
// midpoint // midpoint
assert( CGAL::midpoint( pne, psw) == p); assert( CGAL::midpoint( pne, psw) == p);
assert( CGAL::midpoint( pnw, pse) == p); assert( CGAL::midpoint( pnw, pse) == p);
assert( CGAL::midpoint( Segment{pnw, pse}) == p);
// circumcenter // circumcenter
assert( CGAL::circumcenter( pne, pne ) == pne); assert( CGAL::circumcenter( pne, pne ) == pne);

View File

@ -69,6 +69,7 @@ _test_fct_constructions_3(const R& r)
assert( CGAL::midpoint( p110, p001) == p); assert( CGAL::midpoint( p110, p001) == p);
assert( CGAL::midpoint( p010, p101) == p); assert( CGAL::midpoint( p010, p101) == p);
assert( CGAL::midpoint( p100, p011) == p); assert( CGAL::midpoint( p100, p011) == p);
assert( CGAL::midpoint( Segment{p100, p011}) == p);
// circumcenter // circumcenter
assert( CGAL::circumcenter( p111, p001, p010, p000) == p); assert( CGAL::circumcenter( p111, p001, p010, p000) == p);

View File

@ -39,6 +39,9 @@ int main()
-3000000000000001., -3000000000000001.,
5000000.0000000019, 5000000.0000000019,
7.0000000000000026e+20) ); 7.0000000000000026e+20) );
CGAL::Bbox_2 span{1,2,5,8};
assert( span.x_span() == 4);
assert( span.y_span() == 6);
} }
{ {
@ -70,5 +73,9 @@ int main()
5000000.000000014, 5000000.000000014,
7.0000000000000197e+20, 7.0000000000000197e+20,
15.000000000000027) ); 15.000000000000027) );
CGAL::Bbox_3 span{1,2,3,5,8,11};
assert( span.x_span() == 4);
assert( span.y_span() == 6);
assert( span.z_span() == 8);
} }
} }

View File

@ -19,16 +19,18 @@ LC_CTYPE=en_US.UTF-8
# The script also updates the manual tools. # The script also updates the manual tools.
# "master" alone # "master" alone
0 21 * * Sun cd $HOME/CGAL/create_internal_release && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/master.git --public --do-it --beta 2 || echo ERROR 0 21 * * Sun cd $HOME/CGAL/create_internal_release && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/master.git --do-it || echo ERROR
# "integration" # "integration"
0 21 * * Mon,Tue,Wed,Thu cd $HOME/CGAL/create_internal_release && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/integration.git $HOME/CGAL/branches/empty-dir --do-it || echo ERROR 0 21 * * Mon,Tue,Wed,Thu cd $HOME/CGAL/create_internal_release && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/integration.git $HOME/CGAL/branches/empty-dir --do-it || echo ERROR
# from branch 5.3
0 21 * * Sat cd $HOME/CGAL/create_internal_release-5.3-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.3-branch.git --public --do-it || echo ERROR
# from branch 5.2 # from branch 5.2
0 21 * * Sat cd $HOME/CGAL/create_internal_release-5.2-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.2-branch.git --public --do-it || echo ERROR 0 21 * * Fri cd $HOME/CGAL/create_internal_release-5.2-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.2-branch.git --public --do-it || echo ERROR
# from branch 5.1
0 21 * * Fri cd $HOME/CGAL/create_internal_release-5.1-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.1-branch.git --public --do-it || echo ERROR
## Older stuff ## Older stuff
# from branch 5.1
#0 21 * * Fri cd $HOME/CGAL/create_internal_release-5.1-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.1-branch.git --public --do-it || echo ERROR
# from branch 5.0 # from branch 5.0
#0 21 * * Fri cd $HOME/CGAL/create_internal_release-5.0-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.0-branch.git --public --do-it || echo ERROR #0 21 * * Fri cd $HOME/CGAL/create_internal_release-5.0-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.0-branch.git --public --do-it || echo ERROR
# from branch 4.14 # from branch 4.14

View File

@ -1,75 +1,93 @@
The CGAL Open Source Project is pleased to announce the release 5.0 %The CGAL Open Source Project is pleased to announce the release 5.3 of CGAL, the Computational Geometry Algorithms Library.
of CGAL, the Computational Geometry Algorithms Library.
Besides fixes and general enhancement to existing packages, the Besides fixes and general enhancement to existing packages, the following has changed since CGAL 5.2:
following has changed since CGAL 4.14.2:
### General changes ### [General changes](https://doc.cgal.org/5.3/Manual/general_intro.html)
- CGAL 5.0 is the first release of CGAL that requires a C++ compiler - The support for the compiled version of CGAL is dropped. Only the header-only version is supported.
with the support of C++14 or later. The new list of supported
compilers is:
- Visual C++ 14.0 (from Visual Studio 2015 Update 3) or later,
- Gnu g++ 6.3 or later (on Linux or MacOS),
- LLVM Clang version 8.0 or later (on Linux or MacOS), and
- Apple Clang compiler versions 7.0.2 and 10.0.1 (on MacOS).
- Since CGAL 4.9, CGAL can be used as a header-only library, with
dependencies. Since CGAL 5.0, that is now the default, unless
specified differently in the (optional) CMake configuration.
- The section "Getting Started with CGAL" of the documentation has
been updated and reorganized.
- The minimal version of Boost is now 1.57.0.
- On Windows, the type used for `Exact_rational`, in `Epick` and indirectly (through `Lazy_exact_nt`)
`Epeck` may now be `boost::multiprecision::mpq_rational`, as has been the case on other platforms
for several releases. This depends on various options and is added to a list that includes
`mpq_class`, `CGAL::Gmpq`, `leda_rational` and `CGAL::Quotient<CGAL::MP_Float>`.
### [Polygonal Surface Reconstruction](https://doc.cgal.org/5.0/Manual/packages.html#PkgPolygonalSurfaceReconstruction) (new package) ### [Quadtrees, Octrees, and Orthtrees](https://doc.cgal.org/5.3/Manual/packages.html#PkgOrthtree) (new package)
- This package provides a method for piecewise planar object reconstruction from point clouds. - This package implements a tree data structure in which each node encloses a hypercubic section
The method takes as input an unordered point set sampled from a piecewise planar object of space and each non-leave node has hypercubic children whose edge lengths are half its edge length.
and outputs a compact and watertight surface mesh interpolating the input point set. Such a data structure is known as a quadtree in 2D, an octree in 3D, and is generalized
The method assumes that all necessary major planes are provided (or can be extracted from as an "orthtree" in higher dimensions.
the input point set using the shape detection method described in Point Set Shape Detection,
or any other alternative methods).The method can handle arbitrary piecewise planar objects
and is capable of recovering sharp features and is robust to noise and outliers. See also
the associated [blog entry](https://www.cgal.org/2019/08/05/Polygonal_surface_reconstruction/).
### [Shape Detection](https://doc.cgal.org/5.0/Manual/packages.html#PkgShapeDetection) (major changes) ### [Triangulations on the Sphere](https://doc.cgal.org/5.3/Manual/packages.html#PkgTriangulationOnSphere2) (new package)
- **Breaking change:** The concept `ShapeDetectionTraits` has been renamed to [`EfficientRANSACTraits`](https://doc.cgal.org/5.0/Shape_detection/classEfficientRANSACTraits.html).
- **Breaking change:** The `Shape_detection_3` namespace has been renamed to [`Shape_detection`](https://doc.cgal.org/5.0/Shape_detection/annotated.html).
- Added a new, generic implementation of region growing. This enables for example applying region growing to inputs such as 2D and 3D point sets,
or models of the [`FaceGraph`](https://doc.cgal.org/5.0/BGL/classFaceGraph.html) concept. Learn more about this new algorithm with this [blog entry](https://www.cgal.org/2019/07/30/Shape_detection/).
### [dD Geometry Kernel](https://doc.cgal.org/5.0/Manual/packages.html#PkgKernelD) - This package enables the construction and manipulation of Delaunay triangulations on the 2-sphere.
- A new exact kernel, [`Epeck_d`](https://doc.cgal.org/5.0/Kernel_d/structCGAL_1_1Epeck__d.html), is now available. Triangulations are built incrementally and can be modified by insertion or removal of vertices.
Point location querying and primitives to build the dual Voronoi diagram are provided.
### 2D and 3D Triangulations ### File Input / Output
- **Breaking change:** Several deprecated functions and classes have been - Point set, polygon soup, and polygon mesh file I/O functions have been harmonized and documented:
removed. See the full list of breaking changes in the release - Point set I/O functions can be found in the packages [Point_set_processing_3](https://doc.cgal.org/5.3/Manual/packages.html#PkgPolygonMeshProcessing), and [Point_set_3](https://doc.cgal.org/5.3/Manual/packages.html#PkgPointSet3).
notes. - Polygon mesh I/O functions can be found in the package [BGL](https://doc.cgal.org/5.3/Manual/packages.html#PkgBGL).
- Polygon soup I/O can be found in the package [Stream_support](https://doc.cgal.org/5.3/Manual/packages.html#PkgStreamSupport).
- **Breaking change:** The constructor and the `insert()` function of A comprehensive list of the supported file formats is available in the Stream_support package
`CGAL::Triangulation_2` or `CGAL::Triangulation_3` which take a range [here](https://doc.cgal.org/5.3/Stream_support/index.html#IOstreamSupportedFormats);
of points as argument are now guaranteed to insert the points inversely, the following [page](https://doc.cgal.org/5.3/Stream_support/IOStreamSupportedFileFormats.html)
following the order of `InputIterator`. Note that this change only can be used to find out which CGAL data structures can be used given a specific file format.
affects the base class `CGAL::Triangulation_[23]` and not any
derived class, such as `CGAL::Delaunay_triangulation_[23]`.
### [Requirements](https://doc.cgal.org/5.3/Manual/thirdparty.html)
### [Polygon Mesh Processing](https://doc.cgal.org/latest/Manual/packages.html#PkgPolygonMeshProcessing) - The CMake minimal version is now `3.14`.
- Introduced a [wide range of new functions](https://doc.cgal.org/5.0/Polygon_mesh_processing/index.html#title36) - The GNU compiler g++ versions 6 and 7 are no longer tested. Only version 8.3 or later are supported
related to location of queries on a triangle mesh,
such as [`CGAL::Polygon_mesh_processing::locate(Point, Mesh)`](https://doc.cgal.org/5.0/Polygon_mesh_processing/group__PMP__locate__grp.html#gada09bd8740ba69ead9deca597d53cf15).
The location of a point on a triangle mesh is expressed as the pair of a face and the barycentric
coordinates of the point in this face, enabling robust manipulation of locations
(for example, intersections of two 3D segments living within the same face).
- Added the mesh smoothing function [`smooth_mesh()`](https://doc.cgal.org/5.0/Polygon_mesh_processing/group__PMP__meshing__grp.html#gaa0551d546f6ab2cd9402bea12d8332a3),
which can be used to improve the quality of triangle elements based on various geometric characteristics.
- Added the shape smoothing function [`smooth_shape()`](https://doc.cgal.org/5.0/Polygon_mesh_processing/group__PMP__meshing__grp.html#gaaa083ec78bcecf351e04d1bbf460b4a2),
which can be used to smooth the surface of a triangle mesh, using the mean curvature flow to perform noise removal.
(See also the new entry in the [User Manual](https://doc.cgal.org/5.0/Polygon_mesh_processing/index.html#title8))
### [Point Set Processing](https://doc.cgal.org/latest/Manual/packages.html#PkgPointSetProcessing3) ### [2D and 3D Linear Geometry Kernel](https://doc.cgal.org/5.3/Manual/packages.html#PkgKernel23)
- **Breaking change**: the API using iterators and overloads for optional parameters (deprecated since
CGAL 4.12) has been removed. The current (and now only) API uses ranges and Named Parameters.
See https://www.cgal.org/2019/11/08/cgal50/ for a complete list of changes. - Added `is_translation()`, `is_scaling()`, `is_reflection()`, and `is_rotation()` to the classes
[`Aff_transformation_2`](https://doc.cgal.org/5.3/Kernel_23/classCGAL_1_1Aff__transformation__2.html)
and [`Aff_transformation_3`](https://doc.cgal.org/5.3/Kernel_23/classCGAL_1_1Aff__transformation__3.html),
which enable determining if the transformations use a specialized representation internally.
### [2D Regularized Boolean Set-Operations](https://doc.cgal.org/5.3/Manual/packages.html#PkgBooleanSetOperations2)
- Added documentation for the free functions [`oriented_side(const Point_2& p, ....)`](https://doc.cgal.org/5.3/Boolean_set_operations_2/group__boolean__oriented__side.html)
that accept a point and a polygon.
- Documentation has been improved across the whole package.
### [Polygon Mesh Processing](https://doc.cgal.org/5.3/Manual/packages.html#PkgPolygonMeshProcessing)
- Added the class [`CGAL::Polyhedral_envelope`](https://doc.cgal.org/5.3/Polygon_mesh_processing/structCGAL_1_1Polyhedral__envelope.html),
providing a way to quickly check if a primitive (point, segment, or triangle)
is within a polyhedral envelope around a set of triangles. It is based on the work of
Bolun Wang, Teseo Schneider, Yixin Hu, Marco Attene, and Daniele Panozzo.
"Exact and efficient polyhedral envelope containment check." (ACM Trans. Graph., 39-4, July 2020).
- Added more functions in the [visitor of the corefinement based methods](https://doc.cgal.org/5.3/Polygon_mesh_processing/classPMPCorefinementVisitor.html)
to track all edge creations.
### [Surface Mesh Topology](https://doc.cgal.org/5.3/Manual/packages.html#PkgSurfaceMeshTopologySummary)
- Added the function [`CGAL::Surface_mesh_topology::Curves_on_surface_topology::is_homotopic_to_simple_cycle()`](https://doc.cgal.org/5.3/Surface_mesh_topology/classCGAL_1_1Surface__mesh__topology_1_1Curves__on__surface__topology.html#a8d7c4cba2cf2cff542f5cd93117233db),
which can be used to determine whehter a closed path on a surface mesh can be continously
transformed to a cycle without self intersection.
### [Surface Mesh Simplification](https://doc.cgal.org/5.3/Manual/packages.html#PkgSurfaceMeshSimplification)
- 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`](https://doc.cgal.org/5.3/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Polyhedral__envelope__filter.html),
which enables to perform mesh simplification inside a polyhedral envelope of the input mesh.
### [2D Polyline Simplification](https://doc.cgal.org/5.3/Manual/packages.html#PkgPolylineSimplification2)
- When polylines have common subsequences of vertices, these subsequences may now be simplifified simultaneously.
### [dD Triangulations](https://doc.cgal.org/5.3/Manual/packages.html#PkgTriangulations)
- Added the function [`insert_if_in_star()`](https://doc.cgal.org/5.3/Triangulation/classCGAL_1_1Regular__triangulation.html#aa8df2d138f341939e834bcdd7cb6c71a)
to the class [`CGAL::Regular_triangulation`](https://doc.cgal.org/5.3/Triangulation/classCGAL_1_1Regular__triangulation.html),
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.
### [2D and 3D Alpha Shapes](https://doc.cgal.org/5.3/Manual/packages.html#PkgAlphaShapes2)
- **Breaking change**: 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.
### [Classification](https://doc.cgal.org/5.3/Manual/packages.html#PkgClassification)
- **Breaking change**: the support for TensorFlow has been dropped; the
classifier `CGAL::TensorFlow::Neural_network_classifier` has been removed.

View File

@ -1,130 +1,158 @@
Subject: CGAL 5.1 Released, Computational Geometry Algorithms Library Subject: CGAL 5.3 Released, Computational Geometry Algorithms Library
Content-Type: text/plain; charset="utf-8" Content-Type: text/plain; charset="utf-8"
Body: Body:
The CGAL Open Source Project is pleased to announce the release 5.1 The CGAL Open Source Project is pleased to announce the release 5.3
of CGAL, the Computational Geometry Algorithms Library. of CGAL, the Computational Geometry Algorithms Library.
Besides fixes and general enhancement to existing packages, the following Besides fixes and general enhancement to existing packages, the following
has changed since CGAL 5.0: has changed since CGAL 5.2:
General changes
- The support for the compiled version of CGAL is dropped. Only the
header-only version is supported.
- On Windows, the type used for Exact_rational, in Epick and
indirectly (through Lazy_exact_nt) Epeck may now be
boost::multiprecision::mpq_rational, as has been the case on other
platforms for several releases. This depends on various options and
is added to a list that includes mpq_class, CGAL::Gmpq,
leda_rational and CGAL::Quotient<CGAL::MP_Float>.
Tetrahedral Remeshing (new package) Quadtrees, Octrees, and Orthtrees (new package)
- This package implements a tetrahedral isotropic remeshing algorithm, - This package implements a tree data structure in which each node
that improves the quality of tetrahedra in terms of dihedral angles, encloses a hypercubic section of space and each non-leave node has
while targeting a given edge length. hypercubic children whose edge lengths are half its edge length.
Such a data structure is known as a quadtree in 2D, an octree in 3D,
and is generalized as an “orthtree” in higher dimensions.
See also the associated blog entry: https://www.cgal.org/2021/04/27/Orthtree/
https://www.cgal.org/2020/08/07/Tetrahedral-remeshing/
Surface Mesh Topology (new package) https://doc.cgal.org/5.3/Manual/packages.html#PkgOrthtree
- This package enables the computation of some topological invariants
of surfaces, such as:
- test if two (closed) curves on a combinatorial surface are
homotopic. Users can choose between free homotopy and homotopy
with fixed endpoints;
- test is a curve is contractible;
- compute shortest non-contractible cycles on a surface, with or
without weights on edges.
See also the associated blog entry: Triangulations on the Sphere (new package)
https://www.cgal.org/2020/05/08/Surface_mesh_topology/
Optimal Bounding Box (new package) - This package enables the construction and manipulation of Delaunay
triangulations on the 2-sphere. Triangulations are built
incrementally and can be modified by insertion or removal of
vertices. Point location querying and primitives to build the dual
Voronoi diagram are provided.
- This package implements an optimization algorithm that aims to https://doc.cgal.org/5.3/Manual/packages.html#PkgTriangulationOnSphere2
construct a close approximation of the _optimal bounding box_ of a
mesh or a point set, which is defined as the smallest (in terms of
volume) bounding box that contains a given mesh or point set.
See also the associated blog entry:
https://www.cgal.org/2020/04/20/Optimal_bounding_box/
Installation File Input / Output
- The CGAL_Core library no longer requires Boost.Thread, even if the - Point set, polygon soup, and polygon mesh file I/O functions have
g++ compiler is used. been harmonized and documented:
- Point set I/O functions can be found in the packages
Point_set_processing_3, and Point_set_3.
- Polygon mesh I/O functions can be found in the package BGL.
- Polygon soup I/O can be found in the package Stream_support.
- The minimal supported version of Boost is now 1.66.0. A comprehensive list of the supported file formats is available in the
Stream_support package:
Tutorials https://doc.cgal.org/5.3/Stream_support/index.html#IOstreamSupportedFormats
- Two new, detailed tutorials have been added: Inversely, the following page can be used to find out which CGAL data
- Surface Reconstruction from Point Clouds, which goes over a structures can be used given a specific file format.
typical full processing pipeline in a CGAL environment.
- Geographic Information Systems (GIS), which demonstrates usage
of CGAL data structures and algorithms in the context of a
typical GIS application.
Both tutorials provide complete code. https://doc.cgal.org/5.3/Stream_support/IOStreamSupportedFileFormats.html
See https://doc.cgal.org/5.1/Manual/tutorials.html
Point Set Processing Requirements
- Added wrapper functions for registration, using the Super4PCS and - The CMake minimal version is now 3.14.
ICP algorithms implemented in the third party libraries OpenGR and
libpointmatcher. - The GNU compiler g++ versions 6 and 7 are no longer tested. Only
version 8.3 or later are supported
2D and 3D Linear Geometry Kernel
- Added is_translation(), is_scaling(), is_reflection(), and
is_rotation() to the classes Aff_transformation_2 and
Aff_transformation_3, which enable determining if the
transformations use a specialized representation internally.
2D Regularized Boolean Set-Operations
- Added documentation for the free functions
oriented_side(const Point_2& p, ....) that accept a point and a
polygon.
- Documentation has been improved across the whole package.
Polygon Mesh Processing
- Added the class CGAL::Polyhedral_envelope, providing a way to
quickly check if a primitive (point, segment, or triangle) is within
a polyhedral envelope around a set of triangles. It is based on the
work of Bolun Wang, Teseo Schneider, Yixin Hu, Marco Attene, and
Daniele Panozzo. “Exact and efficient polyhedral envelope
containment check.” (ACM Trans. Graph., 39-4, July 2020).
- Added more functions in the visitor of the corefinement based
methods to track all edge creations.
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.
Surface Mesh Simplification Surface Mesh Simplification
- Added a new simplification method based on the quadric error defined - Added a filtering mechanism so that costly tests get only applied to
by Garland and Heckbert. the next candidate for the edge collapse.
- Added the class Polyhedral_envelope_filter, which enables to perform
dD Spatial Searching mesh simplification inside a polyhedral envelope of the input mesh.
- The kd-tree can now be built in parallel: CGAL::Kd_tree::build() is
given an optional template parameter ConcurrencyTag (default value
remains CGAL::Sequential_tag for backward compatibility).
Intersecting Sequences of dD Iso-oriented Boxes
- Added parallel versions of the functions CGAL::box_intersection_d()
and CGAL::box_self_intersection_d().
Polygon Mesh Processing
- Added the function CGAL::Polygon_mesh_processing::split(), which can
be used to split meshes along a mesh or a plane.
- Added the function
CGAL::Polygon_mesh_processing::split_connected_components() to split
a single mesh containing several connected components into several
meshes containing one connected component.
- Added parallel versions of the functions
CGAL::Polygon_mesh_processing::does_self_intersect() and
CGAL::Polygon_mesh_processing::self_intersections().
- Added several mesh repair functions (see the complete changelog for
more information).
3D Fast Intersection and Distance Computation
- The behavior of the internal search tree used to accelerate distance
queries has changed: usage of the internal search tree will now be
enabled by default, and its construction will be triggered by the
first distance query. Automatic construction and usage can be
disabled by calling
CGAL::AABB_tree::do_not_accelerate_distance_queries() before the
first distance query, and the tree can be built at any moment by
calling CGAL::AABB_tree::accelerate_distance_queries().
- BREAKING CHANGE: CGAL::AABB_tree::accelerate_distance_queries() and
CGAL::AABB_tree::do_not_accelerate_distance_queries() are no longer
const functions.
CGAL and the Boost Graph Library (BGL) 2D Polyline Simplification
- Added the function CGAL::alpha_expansion_graphcut(), which - When polylines have common subsequences of vertices, these
regularizes a multi-label partition over a user-defined graph. subsequences may now be simplifified simultaneously.
- Added the function CGAL::regularize_face_selection_borders(), which
uses this alpha expansion graphcut to regularize the borders of a
selected faces on a triangle mesh.
See https://www.cgal.org/2020/09/08/cgal51/ for a complete list of
changes. dD Triangulations
- 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.
2D and 3D Alpha Shapes
- Breaking change: 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.
Classification
- Breaking change: the support for TensorFlow has been dropped; the
classifier CGAL::TensorFlow::Neural_network_classifier has been
removed.
See https://www.cgal.org/2021/07/06/cgal53/ for a
complete list of changes.
The CGAL project is a collaborative effort to develop a robust, The CGAL project is a collaborative effort to develop a robust,

View File

@ -25,16 +25,16 @@ TD.os64bits {font-style:italic}
.cmaketag {font-weight: bold; color: rgb(100%,20%,20%);} .cmaketag {font-weight: bold; color: rgb(100%,20%,20%);}
TD.ok {background-color: rgb(50%,100%,50%)} TD.ok {background-color: rgb(44%,88%,44%)}
TD.warning {background-color: rgb(100%,100%,50%)} TD.warning {background-color: rgb(100%,100%,50%)}
TD.third_party_warning {background-color: rgb(93%,65%,0%)} TD.third_party_warning {background-color: rgb(75%,100%,50%)}
TD.error {background-color: rgb(100%,50%,50%)} TD.error {background-color: rgb(100%,50%,50%)}
TD.na {background-color: white;} TD.na {background-color: white;}
TD.requirements { background-color: rgb(65%,65%,100%) } TD.requirements { background-color: rgb(65%,65%,100%) }
TH.ok {background-color: rgb(50%,100%,50%)} TD.ok {background-color: rgb(44%,88%,44%)}
TH.warning {background-color: rgb(100%,100%,50%)} TH.warning {background-color: rgb(100%,100%,50%)}
TH.third_party_warning {background-color: rgb(93%,65%,0%)} TH.third_party_warning {background-color: rgb(75%,100%,50%)}
TH.error {background-color: rgb(100%,50%,50%)} TH.error {background-color: rgb(100%,50%,50%)}
TH.requirements { background-color: rgb(65%,65%,100%) } TH.requirements { background-color: rgb(65%,65%,100%) }

View File

@ -26,6 +26,15 @@ template <> class Algebraic_structure_traits< Gmpq >
typedef Tag_true Is_exact; typedef Tag_true Is_exact;
typedef Tag_false Is_numerical_sensitive; typedef Tag_false Is_numerical_sensitive;
class Is_zero
: public CGAL::cpp98::unary_function< Type, bool > {
public:
bool operator()( const Type& x_) const {
return mpq_sgn(x_.mpq()) == 0;
}
};
class Is_square class Is_square
: public CGAL::cpp98::binary_function< Type, Type&, : public CGAL::cpp98::binary_function< Type, Type&,
bool > { bool > {
@ -60,6 +69,22 @@ template <> class Real_embeddable_traits< Gmpq >
: public INTERN_RET::Real_embeddable_traits_base< Gmpq , CGAL::Tag_true > { : public INTERN_RET::Real_embeddable_traits_base< Gmpq , CGAL::Tag_true > {
public: public:
class Is_positive
: public CGAL::cpp98::unary_function< Type, bool > {
public:
bool operator()( const Type& x_) const {
return mpq_sgn(x_.mpq()) > 0;
}
};
class Is_negative
: public CGAL::cpp98::unary_function< Type, bool > {
public:
bool operator()( const Type& x_) const {
return mpq_sgn(x_.mpq()) < 0;
}
};
class Sgn class Sgn
: public CGAL::cpp98::unary_function< Type, ::CGAL::Sign > { : public CGAL::cpp98::unary_function< Type, ::CGAL::Sign > {
public: public:

View File

@ -44,6 +44,7 @@
#include <boost/multi_index_container.hpp> #include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp> #include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp> #include <boost/multi_index/member.hpp>
#include <boost/iterator/transform_iterator.hpp>
#ifdef CGAL_LINKED_WITH_TBB #ifdef CGAL_LINKED_WITH_TBB
# include <tbb/blocked_range.h> # include <tbb/blocked_range.h>
@ -934,6 +935,27 @@ std::size_t snap_border_vertices(PolygonMesh& tm)
return snap_border_vertices(tm, tm); return snap_border_vertices(tm, tm);
} }
///////////////////////////////////////////////////////////////////////////////////////////////////
/// Other convenience overloads
///////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PolygonMesh, typename ToleranceMap>
std::size_t snap_all_vertices(PolygonMesh& tm, ToleranceMap tolerance_map)
{
typedef boost::graph_traits<PolygonMesh> GT;
auto get_halfedge = [&tm](typename GT::vertex_descriptor v)
{
return halfedge(v, tm);
};
auto hedges = make_range(
boost::make_transform_iterator(vertices(tm).begin(), get_halfedge),
boost::make_transform_iterator(vertices(tm).end(), get_halfedge) );
return snap_vertices(hedges, tm, tolerance_map, hedges, tm, tolerance_map);
}
} // namespace experimental } // namespace experimental
} // namespace Polygon_mesh_processing } // namespace Polygon_mesh_processing
} // namespace CGAL } // namespace CGAL

View File

@ -278,6 +278,9 @@ void isotropic_remeshing(const FaceRange& faces
unsigned int nb_iterations = choose_parameter(get_parameter(np, internal_np::number_of_iterations), 1); unsigned int nb_iterations = choose_parameter(get_parameter(np, internal_np::number_of_iterations), 1);
bool smoothing_1d = choose_parameter(get_parameter(np, internal_np::relax_constraints), false); bool smoothing_1d = choose_parameter(get_parameter(np, internal_np::relax_constraints), false);
unsigned int nb_laplacian = choose_parameter(get_parameter(np, internal_np::number_of_relaxation_steps), 1); unsigned int nb_laplacian = choose_parameter(get_parameter(np, internal_np::number_of_relaxation_steps), 1);
bool do_collapse = choose_parameter(get_parameter(np, internal_np::do_collapse), true);
bool do_split = choose_parameter(get_parameter(np, internal_np::do_split), true);
bool do_flip = choose_parameter(get_parameter(np, internal_np::do_flip), true);
#ifdef CGAL_PMP_REMESHING_VERBOSE #ifdef CGAL_PMP_REMESHING_VERBOSE
std::cout << std::endl; std::cout << std::endl;
@ -293,9 +296,12 @@ void isotropic_remeshing(const FaceRange& faces
#endif #endif
if (target_edge_length>0) if (target_edge_length>0)
{ {
if(do_split)
remesher.split_long_edges(high); remesher.split_long_edges(high);
if(do_collapse)
remesher.collapse_short_edges(low, high, collapse_constraints); remesher.collapse_short_edges(low, high, collapse_constraints);
} }
if(do_flip)
remesher.flip_edges_for_valence_and_shape(); remesher.flip_edges_for_valence_and_shape();
remesher.tangential_relaxation(smoothing_1d, nb_laplacian); remesher.tangential_relaxation(smoothing_1d, nb_laplacian);
if ( choose_parameter(get_parameter(np, internal_np::do_project), true) ) if ( choose_parameter(get_parameter(np, internal_np::do_project), true) )

View File

@ -318,6 +318,7 @@ run_test_on_platform()
else else
echo "CGAL_VERSION ${CGAL_GIT_VERSION}">> "$RESULT_FILE" echo "CGAL_VERSION ${CGAL_GIT_VERSION}">> "$RESULT_FILE"
fi fi
sed -n '/The CXX compiler/s/-- The CXX compiler identification is/COMPILER_VERSION =/p' < "${CGAL_BINARY_DIR}/installation.log" |sed -E "s/ = (.*)/\ = '\1\'/">> "$RESULT_FILE"
echo "TESTER ${CGAL_TESTER}" >> "$RESULT_FILE" echo "TESTER ${CGAL_TESTER}" >> "$RESULT_FILE"
echo "TESTER_NAME ${CGAL_TESTER}" >> "$RESULT_FILE" echo "TESTER_NAME ${CGAL_TESTER}" >> "$RESULT_FILE"
echo "TESTER_ADDRESS ${TESTER_ADDRESS}" >> "$RESULT_FILE" echo "TESTER_ADDRESS ${TESTER_ADDRESS}" >> "$RESULT_FILE"

View File

@ -34,16 +34,18 @@ git fetch --tags "${REMOTE}" `git config --get-all "remote.${REMOTE}.fetch"` '+r
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` 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`
echo gh api repos/CGAL/cgal/labels -F name=Merged_in_${CURRENT_RELEASE}
for i in ${PR_LIST}; do for i in ${PR_LIST}; do
echo ghi label $i -a Merged_in_${CURRENT_RELEASE} -- CGAL/cgal echo gh pr edit $i --add-label Merged_in_${CURRENT_RELEASE}
done done
read -p "Please confirm operation by typing YES? " -n 4 -r read -p "Please confirm operation by typing YES? " -n 4 -r
echo echo
if [[ $REPLY =~ ^YES$ ]]; then if [[ $REPLY =~ ^YES$ ]]; then
gh api repos/CGAL/cgal/labels -F name=Merged_in_${CURRENT_RELEASE}
for i in ${PR_LIST}; do for i in ${PR_LIST}; do
ghi label $i -a Merged_in_${CURRENT_RELEASE} -- CGAL/cgal gh pr edit $i --add-label Merged_in_${CURRENT_RELEASE}
done done
else else

View File

@ -82,6 +82,7 @@ int main (int argc, char** argv) {
// Detect registered shapes with the default parameters. // Detect registered shapes with the default parameters.
ransac.detect(Efficient_ransac::Parameters(), timeout_callback); ransac.detect(Efficient_ransac::Parameters(), timeout_callback);
assert(ransac.shapes().size() > 0);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -480,8 +480,11 @@ public:
return false; return false;
} }
if (callback && !callback(0.)) if (callback && !callback(0.)) {
clear_octrees();
clear_shape_factories();
return false; return false;
}
// Reset data structures possibly used by former search // Reset data structures possibly used by former search
m_extracted_shapes = m_extracted_shapes =
@ -580,8 +583,13 @@ public:
m_shape_index, m_shape_index,
m_required_samples); m_required_samples);
if (callback && !callback(num_invalid / double(m_num_total_points))) if (callback && !callback(num_invalid / double(m_num_total_points))) {
clear_octrees();
clear_shape_factories();
clear_candidates(candidates);
m_num_available_points -= num_invalid;
return false; return false;
}
} while (m_shape_index[first_sample] != -1 || !done); } while (m_shape_index[first_sample] != -1 || !done);
@ -591,8 +599,13 @@ public:
bool candidate_success = false; bool candidate_success = false;
for(typename std::vector<Shape *(*)()>::iterator it = for(typename std::vector<Shape *(*)()>::iterator it =
m_shape_factories.begin(); it != m_shape_factories.end(); it++) { m_shape_factories.begin(); it != m_shape_factories.end(); it++) {
if (callback && !callback(num_invalid / double(m_num_total_points))) if (callback && !callback(num_invalid / double(m_num_total_points))) {
clear_octrees();
clear_shape_factories();
clear_candidates(candidates);
m_num_available_points -= num_invalid;
return false; return false;
}
Shape *p = (Shape *) (*it)(); Shape *p = (Shape *) (*it)();
//compute the primitive and says if the candidate is valid //compute the primitive and says if the candidate is valid
p->compute(indices, p->compute(indices,
@ -659,8 +672,13 @@ public:
Shape *best_candidate = Shape *best_candidate =
get_best_candidate(candidates, m_num_available_points - num_invalid); get_best_candidate(candidates, m_num_available_points - num_invalid);
if (callback && !callback(num_invalid / double(m_num_total_points))) if (callback && !callback(num_invalid / double(m_num_total_points))) {
clear_octrees();
clear_shape_factories();
clear_candidates(candidates);
m_num_available_points -= num_invalid;
return false; return false;
}
// If search is done and the best candidate is too small, we are done. // If search is done and the best candidate is too small, we are done.
if (!keep_searching && best_candidate->m_score < m_options.min_points) if (!keep_searching && best_candidate->m_score < m_options.min_points)
@ -683,8 +701,13 @@ public:
best_candidate->connected_component(best_candidate->m_indices, best_candidate->connected_component(best_candidate->m_indices,
m_options.cluster_epsilon); m_options.cluster_epsilon);
if (callback && !callback(num_invalid / double(m_num_total_points))) if (callback && !callback(num_invalid / double(m_num_total_points))) {
clear_octrees();
clear_shape_factories();
clear_candidates(candidates);
m_num_available_points -= num_invalid;
return false; return false;
}
// check score against min_points and clear out candidates if too low // check score against min_points and clear out candidates if too low
if (best_candidate->indices_of_assigned_points().size() < if (best_candidate->indices_of_assigned_points().size() <
m_options.min_points) { m_options.min_points) {
@ -700,8 +723,13 @@ public:
delete best_candidate; delete best_candidate;
best_candidate = nullptr; best_candidate = nullptr;
if (callback && !callback(num_invalid / double(m_num_total_points))) if (callback && !callback(num_invalid / double(m_num_total_points))) {
clear_octrees();
clear_shape_factories();
clear_candidates(candidates);
m_num_available_points -= num_invalid;
return false; return false;
}
// Trimming candidates list // Trimming candidates list
std::size_t empty = 0, occupied = 0; std::size_t empty = 0, occupied = 0;
@ -727,8 +755,13 @@ public:
candidates.resize(empty); candidates.resize(empty);
if (callback && !callback(num_invalid / double(m_num_total_points))) if (callback && !callback(num_invalid / double(m_num_total_points))) {
clear_octrees();
clear_shape_factories();
clear_candidates(candidates);
m_num_available_points -= num_invalid;
return false; return false;
}
} else if (stop_probability((std::size_t) best_candidate->expected_value(), } else if (stop_probability((std::size_t) best_candidate->expected_value(),
(m_num_available_points - num_invalid), (m_num_available_points - num_invalid),
generated_candidates, generated_candidates,
@ -742,8 +775,13 @@ public:
m_extracted_shapes->push_back( m_extracted_shapes->push_back(
boost::shared_ptr<Shape>(best_candidate)); boost::shared_ptr<Shape>(best_candidate));
if (callback && !callback(num_invalid / double(m_num_total_points))) if (callback && !callback(num_invalid / double(m_num_total_points))) {
clear_octrees();
clear_shape_factories();
clear_candidates(candidates);
m_num_available_points -= num_invalid;
return false; return false;
}
//2. remove the points //2. remove the points
const std::vector<std::size_t> &indices_points_best_candidate = const std::vector<std::size_t> &indices_points_best_candidate =
@ -777,8 +815,13 @@ public:
failed_candidates = 0; failed_candidates = 0;
best_expected = 0; best_expected = 0;
if (callback && !callback(num_invalid / double(m_num_total_points))) if (callback && !callback(num_invalid / double(m_num_total_points))) {
clear_octrees();
clear_shape_factories();
clear_candidates(candidates);
m_num_available_points -= num_invalid;
return false; return false;
}
std::vector<std::size_t> subset_sizes(m_num_subsets); std::vector<std::size_t> subset_sizes(m_num_subsets);
subset_sizes[0] = m_available_octree_sizes[0]; subset_sizes[0] = m_available_octree_sizes[0];
@ -807,8 +850,13 @@ public:
} }
} }
if (callback && !callback(num_invalid / double(m_num_total_points))) if (callback && !callback(num_invalid / double(m_num_total_points))) {
clear_octrees();
clear_shape_factories();
clear_candidates(candidates);
m_num_available_points -= num_invalid;
return false; return false;
}
std::size_t start = 0, end = candidates.size() - 1; std::size_t start = 0, end = candidates.size() - 1;
while (start < end) { while (start < end) {
@ -828,8 +876,13 @@ public:
} else if (!keep_searching) } else if (!keep_searching)
++generated_candidates; ++generated_candidates;
if (callback && !callback(num_invalid / double(m_num_total_points))) if (callback && !callback(num_invalid / double(m_num_total_points))) {
clear_octrees();
clear_shape_factories();
clear_candidates(candidates);
m_num_available_points -= num_invalid;
return false; return false;
}
keep_searching = (stop_probability(m_options.min_points, keep_searching = (stop_probability(m_options.min_points,
m_num_available_points - num_invalid, m_num_available_points - num_invalid,
@ -841,11 +894,7 @@ public:
|| best_expected >= m_options.min_points); || best_expected >= m_options.min_points);
// Clean up remaining candidates. // Clean up remaining candidates.
for (std::size_t i = 0; i < candidates.size(); i++) clear_candidates(candidates);
delete candidates[i];
candidates.resize(0);
m_num_available_points -= num_invalid; m_num_available_points -= num_invalid;
return true; return true;
@ -912,6 +961,13 @@ public:
/// @} /// @}
private: private:
void clear_candidates(std::vector<Shape *>& candidates) {
for (std::size_t i = 0; i < candidates.size(); i++) {
delete candidates[i];
}
candidates.resize(0);
}
int select_random_octree_level() { int select_random_octree_level() {
auto upper_bound = static_cast<unsigned int>(m_global_octree->maxLevel() + 1); auto upper_bound = static_cast<unsigned int>(m_global_octree->maxLevel() + 1);
return (int) get_default_random()(upper_bound); return (int) get_default_random()(upper_bound);

View File

@ -76,6 +76,9 @@ for t_id in range(0, len(tests)):
labels.add(label) labels.add(label)
tests_per_label[label].append(t) tests_per_label[label].append(t)
warning_pattern=re.compile(r'(.*([^a-zA-Z_,:-])([^\d]\s)warning).*?(\[|\n)', flags=re.IGNORECASE)
w_det=re.compile("warning");
filter_pattern=re.compile(r'cmake|cgal', flags=re.IGNORECASE);
with open_file_create_dir(result_file_name.format(dir=os.getcwd(), with open_file_create_dir(result_file_name.format(dir=os.getcwd(),
tester=tester_name, tester=tester_name,
platform=platform_name), 'a+') as results: platform=platform_name), 'a+') as results:
@ -86,9 +89,12 @@ with open_file_create_dir(result_file_name.format(dir=os.getcwd(),
print(" {result} {name} in {time} s : {value} ".format(result = "successful " if (t['Status'] == 'passed') else "ERROR: ", name = t['Name'], value = t['ExitValue'] if(t['ExitValue'] != "") else "SUCCESS" , time = t['ExecutionTime']), file=error) print(" {result} {name} in {time} s : {value} ".format(result = "successful " if (t['Status'] == 'passed') else "ERROR: ", name = t['Name'], value = t['ExitValue'] if(t['ExitValue'] != "") else "SUCCESS" , time = t['ExecutionTime']), file=error)
if t['Status'] != 'passed': if t['Status'] != 'passed':
result_for_label='n' result_for_label='n'
elif t['Output'] != None: elif t['Output'] != None and w_det.search(t['Output']):
for m in re.finditer(r'(.*([^a-zA-Z_,:-])([^\d]\s)warning).*?(\[|\n)', t['Output'], flags=re.IGNORECASE): entries = re.split("\n+", t['Output'])
n = re.search(r'cmake|cgal', m.group(0), flags=re.IGNORECASE) for entry in entries:
m=warning_pattern.search(entry)
if m:
n = filter_pattern.search(m.group(0))
if n: if n:
result_for_label='w' result_for_label='w'
break; break;