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
class of the underlying Delaunay triangulation of a basic alpha shape.
\cgalRefines `DelaunayTriangulationTraits_2`
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.
\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.
\cgalHasModel All models of `Kernel`.
\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
of the underlying regular triangulation of a weighted alpha shape.
\cgalRefines `RegularTriangulationTraits_2`
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.
\cgalRefines `RegularTriangulationTraits_2`, if the underlying triangulation of the alpha shape is a regular triangulation.
\cgalHasModel All models of `Kernel`.
\cgalHasModel Projection traits such as `CGAL::Projection_traits_xy_3<K>`.

View File

@ -7,12 +7,8 @@ The concept `AlphaShapeTraits_3` describes the requirements
for the geometric traits class
of the underlying Delaunay triangulation of a basic alpha shape.
\cgalRefines `DelaunayTriangulationTraits_3`
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.
\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.
\cgalHasModel All models of `Kernel`.

View File

@ -7,12 +7,8 @@ The concept `FixedAlphaShapeTraits_3` describes the requirements
for the geometric traits class
of the underlying Delaunay triangulation of a basic alpha shape with a fixed value alpha.
\cgalRefines `DelaunayTriangulationTraits_3`
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.
\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.
\cgalHasModel All models of `Kernel`.

View File

@ -6,12 +6,8 @@
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.
\cgalRefines `RegularTriangulationTraits_3`
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.
\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.
\cgalHasModel All models of `Kernel`.

View File

@ -7,12 +7,8 @@ The concept `WeightedAlphaShapeTraits_3` describes the requirements
for the geometric traits class
of the underlying regular triangulation of a weighted alpha shape.
\cgalRefines `RegularTriangulationTraits_3`
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.
\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.
\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_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_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_self_intersection_tests_t, do_self_intersection_tests, do_self_intersection_tests)
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::Point_2 Point_2;
typedef typename K::Segment_2 Segment_2;
public:
typedef Point_2 result_type;
@ -2752,6 +2753,17 @@ namespace CartesianKernelFunctors {
midpointC2(p.x(), p.y(), q.x(), q.y(), 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>
@ -2759,6 +2771,7 @@ namespace CartesianKernelFunctors {
{
typedef typename K::FT FT;
typedef typename K::Point_3 Point_3;
typedef typename K::Segment_3 Segment_3;
public:
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);
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>

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
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:

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,
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>
for further details.
@ -84,7 +84,7 @@ 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 \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>
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
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.
You will have to specify the Qt5_DIR by hand to cmake, using something like
The package Qt5 on brew is "keg-only", which means it is not "linked" with brew.
In order to link against Qt5, you need to run:
-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

View File

@ -19,7 +19,7 @@ summarized below are CMake variables.
\subsection installation_component_selection Component Selection
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 |

View File

@ -1,29 +1,29 @@
/*!
\page installation Building %CGAL libraries (non header-only mode)
\page installation Installing %CGAL libraries
\cgalAutoToc
\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.
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.
\cgalAdvancedEnd
This page is a step-by-step description of how to configure, build, and (optionally) install \cgal
in case you do not wish to use the - now enabled by default - header-only mode of \cgal.
This page is a step-by-step description of how to configure and install \cgal, and (optionally)
build examples, tests and demos.
It is assumed that you have downloaded a source archive of \cgal, and are using Linux or macOS.
\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
mkdir build
cd build
cmake -DCGAL_HEADER_ONLY=OFF -DCMAKE_BUILD_TYPE=Release .. # configure CGAL
make # build CGAL
cmake .. # configure CGAL
make install # install CGAL
cd examples/Triangulation_2 # go to an example directory
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
Before building \cgal, or anything using \cgal, you have to choose the compiler/linker,
set compiler and linker flags, specify which
third-party libraries you want to use and where they can be found, and
which \cgal libraries you want to build. Gathering
Before building anything using \cgal, you have to choose the compiler/linker,
set compiler and linker flags and specify which
third-party libraries you want to use and where they can be found. Gathering
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
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
\cgal is split into four libraries. During configuration, you can select the libraries that
you would like to build 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.
Note that some libraries have specific dependencies in addition to the essential ones. See the page
\cgal has some optional components. During configuration, you can select the components that
you would like to use by setting a CMake variable of the form <TT>WITH_<library></TT>. By default all
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`.
See the page
\ref secessential3rdpartysoftware for more information.
| Library | CMake Variable | Functionality | Dependencies |
| Component | CMake Variable | Functionality | Dependencies |
| :-------- | :------------- | :------------ | :----------- |
| \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 <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
\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
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
default value in `CMake`. If you do not plan on debugging, it is important to set the variable
to `Release` for performance reasons.
@ -96,9 +89,8 @@ from within the IDE in this environment.
There are many more variables that can be used during configuration. The most important ones are:
<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>`BUILD_SHARED_LIBS=<TRUE|FALSE>` shared or static libraries [TRUE]</li>
<li>`CMAKE_C_COMPILER=<program>` C compiler [gcc]</li>
<li>`CMAKE_CXX_COMPILER=<program>` C++ compiler [g++]</li>
</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
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`.
\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
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
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
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 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
to all the libraries.
contain several <I>targets</I>, one per executable, and a default global target corresponding
to all of them (called `examples` and/or `demos`).
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
make
# build all the selected examples at once
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
<I>after</I> the \cgal libraries have been successfully built.
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
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
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
of placing or copying the library elements into its standard location
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>.
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:
# install CGAL
@ -283,7 +266,7 @@ variable explicitly <I>at the configuration time</I> and not when executing the
\cgalAdvancedEnd
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
@ -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 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
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"
, edition = "1.2"
, year = 1999
, url = "https://cs.nyu.edu/exact/core/"
, url = "https://www.cs.nyu.edu/exact/doc/core.pdf"
, update = "00.03 devillers"
}

View File

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

View File

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

View File

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

View File

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

View File

@ -236,6 +236,7 @@ template <typename AT_, typename ET, typename E2A>
class Lazy_rep : public Rep, public Depth_base
{
Lazy_rep (const Lazy_rep&) = delete; // cannot be copied.
Lazy_rep& operator= (const Lazy_rep&) = delete; // cannot be copied.
public:
@ -247,6 +248,28 @@ public:
Lazy_rep ()
: 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>
Lazy_rep (A&& a)
: at(std::forward<A>(a)), et(nullptr){}

View File

@ -2950,6 +2950,7 @@ namespace HomogeneousKernelFunctors {
{
typedef typename K::FT FT;
typedef typename K::Point_2 Point_2;
typedef typename K::Segment_2 Segment_2;
public:
typedef Point_2 result_type;
@ -2963,6 +2964,19 @@ namespace HomogeneousKernelFunctors {
p.hy()*qhw + q.hy()*phw,
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>
@ -2970,6 +2984,7 @@ namespace HomogeneousKernelFunctors {
{
typedef typename K::FT FT;
typedef typename K::Point_3 Point_3;
typedef typename K::Segment_3 Segment_3;
public:
typedef Point_3 result_type;
@ -2984,6 +2999,20 @@ namespace HomogeneousKernelFunctors {
p.hz()*qhw + q.hz()*phw,
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 ...

View File

@ -12,6 +12,15 @@ Release History
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)
- 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
#ifndef SWIG
#define CGAL_VERSION 5.3-beta2
#define CGAL_VERSION 5.4-dev
#define CGAL_GIT_HASH abcdef
#endif
#define CGAL_VERSION_NR 1050300920
#define CGAL_VERSION_NR 1050400900
#define CGAL_SVN_REVISION 99999
#define CGAL_RELEASE_DATE 20210630
#define CGAL_RELEASE_DATE 20211206
#include <CGAL/version_macros.h>

View File

@ -1,8 +1,8 @@
set(CGAL_MAJOR_VERSION 5)
set(CGAL_MINOR_VERSION 3)
set(CGAL_MINOR_VERSION 4)
set(CGAL_BUGFIX_VERSION 0)
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}")
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,
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`.
*/
template <typename Kernel>
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()

View File

@ -4996,6 +4996,10 @@ public:
*/
Kernel::Point_2 operator()(const Kernel::Point_2& p,
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,
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 xmax() 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 min BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const;
@ -91,6 +93,14 @@ double
Bbox_2::ymax() const
{ return rep[3]; }
inline double Bbox_2::x_span() const {
return xmax() - xmin();
}
inline double Bbox_2::y_span() const {
return ymax() - ymin();
}
inline
bool
Bbox_2::operator==(const Bbox_2 &b) const

View File

@ -57,12 +57,15 @@ public:
inline bool operator!=(const Bbox_3 &b) const;
inline int dimension() const;
double xmin() const;
double ymin() const;
double zmin() const;
double xmax() const;
double ymax() const;
double zmax() const;
double xmin() const;
double ymin() const;
double zmin() const;
double xmax() const;
double ymax() 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 max BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const;
@ -106,6 +109,18 @@ double
Bbox_3::zmax() const
{ 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
bool
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());
}
template < class K >
inline typename K::Point_2 midpoint(const Segment_2<K> &s)
{
return internal::midpoint(s, K());
}
template < class K >
inline
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());
}
template < class K >
inline typename K::Point_3 midpoint(const Segment_3<K> &s)
{
return internal::midpoint(s, K());
}
template < class K >
inline
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);
}
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 >
inline
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);
}
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 >
inline
typename K::Point_3

View File

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

View File

@ -39,6 +39,9 @@ int main()
-3000000000000001.,
5000000.0000000019,
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,
7.0000000000000197e+20,
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.
# "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"
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
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
# 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
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
## 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
#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

View File

@ -1,75 +1,93 @@
The CGAL Open Source Project is pleased to announce the release 5.0
of CGAL, the Computational Geometry Algorithms Library.
%The CGAL Open Source Project is pleased to announce the release 5.3 of CGAL, the Computational Geometry Algorithms Library.
Besides fixes and general enhancement to existing packages, the
following has changed since CGAL 4.14.2:
Besides fixes and general enhancement to existing packages, the following has changed since CGAL 5.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
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.
- 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>`.
### [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.
The method takes as input an unordered point set sampled from a piecewise planar object
and outputs a compact and watertight surface mesh interpolating the input point set.
The method assumes that all necessary major planes are provided (or can be extracted from
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/).
- This package implements a tree data structure in which each node encloses a hypercubic section
of space and each non-leave node has 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.
### [Shape Detection](https://doc.cgal.org/5.0/Manual/packages.html#PkgShapeDetection) (major changes)
- **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/).
### [Triangulations on the Sphere](https://doc.cgal.org/5.3/Manual/packages.html#PkgTriangulationOnSphere2) (new package)
### [dD Geometry Kernel](https://doc.cgal.org/5.0/Manual/packages.html#PkgKernelD)
- A new exact kernel, [`Epeck_d`](https://doc.cgal.org/5.0/Kernel_d/structCGAL_1_1Epeck__d.html), is now available.
- 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.
### 2D and 3D Triangulations
### File Input / Output
- **Breaking change:** Several deprecated functions and classes have been
removed. See the full list of breaking changes in the release
notes.
- Point set, polygon soup, and polygon mesh file I/O functions have been harmonized and documented:
- 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).
- 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
`CGAL::Triangulation_2` or `CGAL::Triangulation_3` which take a range
of points as argument are now guaranteed to insert the points
following the order of `InputIterator`. Note that this change only
affects the base class `CGAL::Triangulation_[23]` and not any
derived class, such as `CGAL::Delaunay_triangulation_[23]`.
A comprehensive list of the supported file formats is available in the Stream_support package
[here](https://doc.cgal.org/5.3/Stream_support/index.html#IOstreamSupportedFormats);
inversely, the following [page](https://doc.cgal.org/5.3/Stream_support/IOStreamSupportedFileFormats.html)
can be used to find out which CGAL data structures can be used given a specific file format.
### [Requirements](https://doc.cgal.org/5.3/Manual/thirdparty.html)
### [Polygon Mesh Processing](https://doc.cgal.org/latest/Manual/packages.html#PkgPolygonMeshProcessing)
- Introduced a [wide range of new functions](https://doc.cgal.org/5.0/Polygon_mesh_processing/index.html#title36)
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))
- The CMake minimal version is now `3.14`.
- The GNU compiler g++ versions 6 and 7 are no longer tested. Only version 8.3 or later are supported
### [Point Set Processing](https://doc.cgal.org/latest/Manual/packages.html#PkgPointSetProcessing3)
- **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.
### [2D and 3D Linear Geometry Kernel](https://doc.cgal.org/5.3/Manual/packages.html#PkgKernel23)
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"
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.
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,
that improves the quality of tetrahedra in terms of dihedral angles,
while targeting a given edge length.
- This package implements a tree data structure in which each node
encloses a hypercubic section of space and each non-leave node has
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/2020/08/07/Tetrahedral-remeshing/
https://www.cgal.org/2021/04/27/Orthtree/
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:
https://www.cgal.org/2020/05/08/Surface_mesh_topology/
Triangulations on the Sphere (new package)
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
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.
https://doc.cgal.org/5.3/Manual/packages.html#PkgTriangulationOnSphere2
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
g++ compiler is used.
- Point set, polygon soup, and polygon mesh file I/O functions have
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:
- Surface Reconstruction from Point Clouds, which goes over a
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.
Inversely, the following page can be used to find out which CGAL data
structures can be used given a specific file format.
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
ICP algorithms implemented in the third party libraries OpenGR and
libpointmatcher.
- The CMake minimal version is now 3.14.
- 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
- Added a new simplification method based on the quadric error defined
by Garland and Heckbert.
dD Spatial Searching
- 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.
- 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, which enables to perform
mesh simplification inside a polyhedral envelope of the input mesh.
CGAL and the Boost Graph Library (BGL)
2D Polyline Simplification
- Added the function CGAL::alpha_expansion_graphcut(), which
regularizes a multi-label partition over a user-defined graph.
- 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.
- When polylines have common subsequences of vertices, these
subsequences may now be simplifified simultaneously.
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,

View File

@ -25,16 +25,16 @@ TD.os64bits {font-style:italic}
.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.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.na {background-color: white;}
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.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.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_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
: public CGAL::cpp98::binary_function< Type, Type&,
bool > {
@ -60,6 +69,22 @@ template <> class Real_embeddable_traits< Gmpq >
: public INTERN_RET::Real_embeddable_traits_base< Gmpq , CGAL::Tag_true > {
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
: public CGAL::cpp98::unary_function< Type, ::CGAL::Sign > {
public:

View File

@ -44,6 +44,7 @@
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/iterator/transform_iterator.hpp>
#ifdef CGAL_LINKED_WITH_TBB
# include <tbb/blocked_range.h>
@ -934,6 +935,27 @@ std::size_t snap_border_vertices(PolygonMesh& 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 Polygon_mesh_processing
} // 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);
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);
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
std::cout << std::endl;
@ -293,10 +296,13 @@ void isotropic_remeshing(const FaceRange& faces
#endif
if (target_edge_length>0)
{
remesher.split_long_edges(high);
remesher.collapse_short_edges(low, high, collapse_constraints);
if(do_split)
remesher.split_long_edges(high);
if(do_collapse)
remesher.collapse_short_edges(low, high, collapse_constraints);
}
remesher.flip_edges_for_valence_and_shape();
if(do_flip)
remesher.flip_edges_for_valence_and_shape();
remesher.tangential_relaxation(smoothing_1d, nb_laplacian);
if ( choose_parameter(get_parameter(np, internal_np::do_project), true) )
remesher.project_to_surface(get_parameter(np, internal_np::projection_functor));

View File

@ -318,6 +318,7 @@ run_test_on_platform()
else
echo "CGAL_VERSION ${CGAL_GIT_VERSION}">> "$RESULT_FILE"
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_NAME ${CGAL_TESTER}" >> "$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`
echo gh api repos/CGAL/cgal/labels -F name=Merged_in_${CURRENT_RELEASE}
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
read -p "Please confirm operation by typing YES? " -n 4 -r
echo
if [[ $REPLY =~ ^YES$ ]]; then
gh api repos/CGAL/cgal/labels -F name=Merged_in_${CURRENT_RELEASE}
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
else

View File

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

View File

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

View File

@ -76,6 +76,9 @@ for t_id in range(0, len(tests)):
labels.add(label)
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(),
tester=tester_name,
platform=platform_name), 'a+') as results:
@ -86,14 +89,17 @@ 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)
if t['Status'] != 'passed':
result_for_label='n'
elif t['Output'] != None:
for m in re.finditer(r'(.*([^a-zA-Z_,:-])([^\d]\s)warning).*?(\[|\n)', t['Output'], flags=re.IGNORECASE):
n = re.search(r'cmake|cgal', m.group(0), flags=re.IGNORECASE)
if n:
result_for_label='w'
break;
else:
result_for_label='t'
elif t['Output'] != None and w_det.search(t['Output']):
entries = re.split("\n+", t['Output'])
for entry in entries:
m=warning_pattern.search(entry)
if m:
n = filter_pattern.search(m.group(0))
if n:
result_for_label='w'
break;
else:
result_for_label='t'
with io.open("{}/ProgramOutput.{}".format(label, t['Name']), mode="w", encoding="utf-8") as f:
print("{}/ProgramOutput.{}".format(label, t['Name']))