Merge branch 'master' into Frechet-dev

This commit is contained in:
Andreas Fabri 2024-08-14 10:50:37 +01:00
commit baec5b0168
58 changed files with 872 additions and 485 deletions

View File

@ -118,7 +118,7 @@ public:
void cleanup_cache() const;
/*!
Returns a pointer to the used algerbaic kernel object.
Returns a pointer to the used algebraic kernel object.
*/
const Algebraic_kernel_d_1* algebraic_kernel_d_1() const;

View File

@ -1237,7 +1237,7 @@ public:
//! \brief checks whether curve has only finitely many self-intersection
//! points, i.e., it has no self-overlapped continuous parts
//!
//! for algerbaic curves this means that supporting polynomial is
//! for algebraic curves this means that supporting polynomial is
//! square-free
struct Has_finite_number_of_self_intersections_2 :
public CGAL::cpp98::unary_function< Polynomial_2, bool > {
@ -1252,7 +1252,7 @@ public:
//! \brief checks whether a curve pair has finitely many intersections,
//! in other words, whether two curves have no continuous common part
//!
//! in case of algerbaic curves: checks whether supporting polynomials are
//! in case of algebraic curves: checks whether supporting polynomials are
//! coprime
struct Has_finite_number_of_intersections_2 :
public CGAL::cpp98::binary_function< Curve_analysis_2, Curve_analysis_2, bool > {

View File

@ -33,6 +33,8 @@ namespace CGAL {
namespace METIS {
#ifndef DOXYGEN_RUNNING
template<typename TriangleMesh, typename METIS_options, typename NamedParameters>
void partition_dual_graph(const TriangleMesh& tm,
int nparts,
@ -128,6 +130,8 @@ void partition_dual_graph(const TriangleMesh& tm, int nparts,
return partition_dual_graph(tm, nparts, &options, np);
}
#endif
/// \ingroup PkgBGLPartition
///
/// computes a partition of the input triangular mesh into `nparts` parts,

View File

@ -31,6 +31,8 @@ namespace CGAL {
namespace METIS {
#ifndef DOXYGEN_RUNNING
struct Output_vertex_partition_ids
{
template<typename TriangleMesh, typename Indices>
@ -68,6 +70,8 @@ struct Output_face_partition_ids
}
};
template<typename TriangleMesh, typename METIS_options, typename NamedParameters>
void partition_graph(const TriangleMesh& tm,
int nparts,
@ -161,6 +165,9 @@ void partition_graph(const TriangleMesh& tm, int nparts,
return partition_graph(tm, nparts, &options, np);
}
#endif
/// \ingroup PkgBGLPartition
///
/// computes a partition of the input triangular mesh into `nparts` parts, based on the

View File

@ -300,8 +300,8 @@ make_quad(const P& p0, const P& p1, const P& p2, const P& p3, Graph& g)
* \cgalParamNEnd
* \cgalNamedParamsEnd
**/
template<typename P,
typename Graph,
template<typename Graph,
typename P,
typename NamedParameters = parameters::Default_named_parameters>
typename boost::graph_traits<Graph>::halfedge_descriptor
make_hexahedron(const P& p0, const P& p1, const P& p2, const P& p3,

View File

@ -214,11 +214,6 @@ public:
#ifndef DOXYGEN_RUNNING
explicit operator bool() const
{
return (! (this->base() == nullptr));
}
bool operator==( const Self& i) const {
CGAL_assertion( anchor == anchor);
return ( g == i.g) && ( pos == i.pos) && ( winding == i.winding);
@ -308,11 +303,6 @@ public:
#ifndef DOXYGEN_RUNNING
explicit operator bool() const
{
return (! (this->base() == nullptr));
}
bool operator==( const Self& i) const {
CGAL_assertion( anchor == anchor);
return ( g == i.g) && ( pos == i.pos) && ( winding == i.winding);
@ -400,11 +390,6 @@ public:
pointer operator -> ( ) { return &pos; }
const value_type* operator -> ( ) const { return &pos; }
explicit operator bool() const
{
return (! (this->base() == nullptr));
}
bool operator==( const Self& i) const {
CGAL_assertion( anchor == anchor);
return ( g == i.g) && ( pos == i.pos) && ( winding == i.winding);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -33,14 +33,17 @@ This section describes a minimal example of a program that uses \cgal and Qt6 fo
\skip cmake_minimum_required
\until project
\skip #CGAL_Qt6 is needed for the drawing.
\until endif()
\until find_package
\skip #create the executable of the application
\until "draw_surface_mesh.cpp"
\skip if(CGAL_Qt6_FOUND)
\until target_link_libraries(draw_surface_mesh PUBLIC CGAL::CGAL_Qt6)
\until target_link_libraries(draw_surface_mesh PUBLIC CGAL::CGAL_Basic_viewer)
\skip endif
\until #end of the file

View File

@ -19,7 +19,6 @@ FILTER_PATTERNS = *.txt=${CMAKE_BINARY_DIR}/pkglist_filter
HTML_EXTRA_FILES += ${CGAL_DOC_RESOURCE_DIR}/hacks.js \
${CGAL_DOC_RESOURCE_DIR}/menu_version.js \
${CGAL_DOC_RESOURCE_DIR}/cgal_stylesheet.css \
${CMAKE_BINARY_DIR}/how_to_cite_cgal.bib \
${CMAKE_BINARY_DIR}/how_to_cite.html \
${CGAL_PACKAGE_DOC_DIR}/fig/g-196x196-doc.png

View File

@ -153,7 +153,7 @@ executables should be linked with the CMake imported target
The \libpointmatcher web site is <A
HREF="https://github.com/ethz-asl/libpointmatcher">`https://github.com/ethz-asl/libpointmatcher`</A>.
\attention On Windows, we only support version 1.3.1 of PointMatcher with version 3.3.7 of Eigen, with some changes to the recipe at
`https://github.com/ethz-asl/libpointmatcher/blob/master/doc/CompilationWindows.md`:`NABO_INCLUDE_DIR` becomes `libnabo_INCLUDE_DIRS`
`https://github.com/ethz-asl/libpointmatcher/blob/master/doc/Compilation.md`:`NABO_INCLUDE_DIR` becomes `libnabo_INCLUDE_DIRS`
and `NABO_LIBRARY` becomes `libnabo_LIBRARIES` in the "Build libpointmatcher" section.

View File

@ -2778,7 +2778,7 @@ author = "Pedro M.M. de Castro and Frederic Cazals and Sebastien Loriot and Moni
editor = "Jacob E. Goodman, J\'anos Pach and Emo Welzl",
year = {2005},
pages = {439-458},
URL = {http://library.msri.org/books/Book52/files/23liu.pdf},
URL = {http://library.slmath.org/books/Book52/files/23liu.pdf},
publisher = {MSRI Publications}
}

View File

@ -16862,7 +16862,7 @@ Contains C code."
, title = "A polyhedron representation for computer vision"
, booktitle = "Proc. AFIPS Natl. Comput. Conf."
, volume = 44
, publisher = "AFIPS Press, Alrington, Va."
, publisher = "AFIPS Press, Arlington, Va."
, year = 1975
, pages = "589--596"
, update = "98.07 bibrelex"
@ -116674,7 +116674,7 @@ dither and stipple patterns."
@article{p-axrac-44
, author = "A. L. Patterson"
, title = "Amibguities in the {X}-ray analysis of crystal structures"
, title = "Ambiguities in the {X}-ray analysis of crystal structures"
, journal = "Physical Review"
, volume = 65
, year = 1944

View File

@ -486,6 +486,24 @@ HTML_HEADER = ${CGAL_DOC_HEADER_PACKAGE}
HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# cascading style sheets that are included after the standard style sheets
# created by doxygen. Using this option one can overrule certain style aspects.
# This is preferred over using HTML_STYLESHEET since it does not replace the
# standard style sheet and is therefore more robust against future updates.
# Doxygen will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the
# list).
# Note: Since the styling of scrollbars can currently not be overruled in
# Webkit/Chromium, the styling will be left out of the default doxygen.css if
# one or more extra stylesheets have been specified. So if scrollbar
# customization is desired it has to be added explicitly. For an example see the
# documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_STYLESHEET = ${CGAL_DOC_RESOURCE_DIR}/cgal_stylesheet.css
# Doxygen stores a couple of settings persistently in the browser (via e.g.
# cookies). By default these settings apply to all HTML pages generated by
# doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store

View File

@ -26,8 +26,6 @@ $search
$mathjax
$darkmode
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
<!-- This should probably be an extrastylesheet instead of hardcoded. -->
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
$extrastylesheet
</head>
<body>

View File

@ -43,8 +43,6 @@
<script type="text/javascript" src="../Manual/search/search.js"></script>
<!-- Manually done below. -->
<link href="$relpath^../Manual/$stylesheet" rel="stylesheet" type="text/css" />
<!-- This should probably be an extrastylesheet instead of hardcoded. -->
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
$mathjax
$darkmode
<script src="$relpath^topics.js" type="text/javascript"></script>

View File

@ -477,6 +477,24 @@ HTML_HEADER = ${CGAL_DOC_HEADER_PACKAGE}
HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# cascading style sheets that are included after the standard style sheets
# created by doxygen. Using this option one can overrule certain style aspects.
# This is preferred over using HTML_STYLESHEET since it does not replace the
# standard style sheet and is therefore more robust against future updates.
# Doxygen will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the
# list).
# Note: Since the styling of scrollbars can currently not be overruled in
# Webkit/Chromium, the styling will be left out of the default doxygen.css if
# one or more extra stylesheets have been specified. So if scrollbar
# customization is desired it has to be added explicitly. For an example see the
# documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_STYLESHEET = ${CGAL_DOC_RESOURCE_DIR}/cgal_stylesheet.css
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this
# to YES can help to show when doxygen was last run and thus if the

View File

@ -486,6 +486,24 @@ HTML_HEADER = ${CGAL_DOC_HEADER_PACKAGE}
HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# cascading style sheets that are included after the standard style sheets
# created by doxygen. Using this option one can overrule certain style aspects.
# This is preferred over using HTML_STYLESHEET since it does not replace the
# standard style sheet and is therefore more robust against future updates.
# Doxygen will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the
# list).
# Note: Since the styling of scrollbars can currently not be overruled in
# Webkit/Chromium, the styling will be left out of the default doxygen.css if
# one or more extra stylesheets have been specified. So if scrollbar
# customization is desired it has to be added explicitly. For an example see the
# documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_STYLESHEET = ${CGAL_DOC_RESOURCE_DIR}/cgal_stylesheet.css
# If you want full control over the layout of the generated HTML pages it might
# be necessary to disable the index and replace it with your own. The
# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top

View File

@ -367,7 +367,7 @@ public:
// case, to find whether a 2d point lies below/above/on a line
// this test is simply computing the sign of:
// (1) [(y3 - y1)(z2 - z1) - (z3 - z1)(y2 - y1)] * sign(y3 - y1)
// abd comparing to 0, where pi = (xi, yi, zi), and p2 is compared to the
// and comparing it with 0, where pi = (xi, yi, zi), and p2 is compared to the
// line formed by p1 and p3 (in the direction p1 -> p3)
//
// for general vertical plane, we change (x, y) coordinates to (v, w),

View File

@ -236,7 +236,7 @@ public:
void remove(Vertex_handle v);
/*!
Removes the vertices in the iterator range `[firs, last)` from the triangulation.
Removes the vertices in the iterator range `[first, last)` from the triangulation.
\pre all vertices in `[first, last)` are vertices of the triangulation.
*/
template <class VertexRemoveIterator>

View File

@ -17,12 +17,12 @@
#define CGAL_VERSION_H
#ifndef SWIG
#define CGAL_VERSION 6.0-beta1
#define CGAL_VERSION 6.0-beta2
#define CGAL_GIT_HASH abcdef
#endif
#define CGAL_VERSION_NR 1060000910
#define CGAL_VERSION_NR 1060000920
#define CGAL_SVN_REVISION 99999
#define CGAL_RELEASE_DATE 20240601
#define CGAL_RELEASE_DATE 20240701
#include <CGAL/version_macros.h>

View File

@ -2,7 +2,7 @@ set(CGAL_MAJOR_VERSION 6)
set(CGAL_MINOR_VERSION 0)
set(CGAL_BUGFIX_VERSION 0)
include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake)
set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0-beta1")
set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0-beta2")
set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}")
if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0)

View File

@ -764,6 +764,32 @@ public:
const K::Point_3& b,
const K::Point_3& c,
const K::FT& cosine);
/*!
compares the angles \f$ \theta_1\f$ and \f$ \theta_2\f$, where
\f$ \theta_1\f$ is the angle in \f$ [0, \pi]\f$ of the triangle
\f$ (a1, b1, c1)\f$ at the vertex `b1`, and \f$ \theta_2\f$
is the angle in \f$ [0, \pi]\f$ of the triangle \f$ (a2, b2, c2)\f$ at the vertex `b2`.
\pre `a1!=b1 && c1!=b1 && a2!=b2 && c2!=b2`.
*/
Comparison_result operator()(const K::Point_3& a1,
const K::Point_3& b1,
const K::Point_3& c1,
const K::Point_3& a2,
const K::Point_3& b2,
const K::Point_3& c2);
/*!
compares the angles \f$ \theta_1\f$ and \f$ \theta_2\f$, where
\f$ \theta_1\f$ is the angle in \f$ [0, \pi]\f$ between the vectors
\f$ u1\f$ and \f$ v1\f$, and \f$ \theta_2\f$ is the angle in \f$ [0, \pi]\f$
between the vectors \f$ u2\f$ and \f$ v2\f$.
\pre none of the vectors have zero length.
*/
Comparison_result operator()(const K::Vector_3& u1,
const K::Vector_3& v1,
const K::Vector_3& u2,
const K::Vector_3& v2);
};
/*!

View File

@ -206,16 +206,15 @@ namespace CommonKernelFunctors {
typedef typename K::Comparison_result result_type;
result_type
operator()(const Point_3& a1, const Point_3& b1, const Point_3& c1,
const Point_3& a2, const Point_3& b2, const Point_3& c2) const
operator()(const Vector_3& ba1, const Vector_3& bc1,
const Vector_3& ba2, const Vector_3& bc2) const
{
using FT = typename K::FT;
const Vector_3 ba1 = a1 - b1;
const Vector_3 bc1 = c1 - b1;
const Vector_3 ba2 = a2 - b2;
const Vector_3 bc2 = c2 - b2;
const FT sc_prod_1 = ba1 * bc1;
const FT sc_prod_2 = ba2 * bc2;
typename K::Compute_scalar_product_3 scalar_product = K().compute_scalar_product_3_object();
typename K::Compute_squared_length_3 sq_length = K().compute_squared_length_3_object();
const FT sc_prod_1 = scalar_product(ba1, bc1);
const FT sc_prod_2 = scalar_product(ba2, bc2);
// Reminder: cos(angle) = scalar_product(ba, bc) / (length(ba)*length(bc))
// cosine is decreasing on 0, pi
// thus angle1 < angle2 is equivalent to cos(angle1) > cos(angle2)
@ -223,26 +222,36 @@ namespace CommonKernelFunctors {
if(sc_prod_2 >= 0) {
// the two cosine are >= 0, we can compare the squares
// (square(x) is increasing when x>=0
return CGAL::compare(CGAL::square(sc_prod_2)*
ba1.squared_length()*bc1.squared_length(),
CGAL::square(sc_prod_1)*
ba2.squared_length()*bc2.squared_length());
return CGAL::compare(CGAL::square(sc_prod_2) * sq_length(ba1) * sq_length(bc1),
CGAL::square(sc_prod_1) * sq_length(ba2) * sq_length(bc2));
} else {
return SMALLER;
}
} else {
if(sc_prod_2 < 0) {
// the two cosine are < 0, square(x) is decreasing when x<0
return CGAL::compare(CGAL::square(sc_prod_1)*
ba2.squared_length()*bc2.squared_length(),
CGAL::square(sc_prod_2)*
ba1.squared_length()*bc1.squared_length());
return CGAL::compare(CGAL::square(sc_prod_1) * sq_length(ba2) * sq_length(bc2),
CGAL::square(sc_prod_2) * sq_length(ba1) * sq_length(bc1));
} else {
return LARGER;
}
}
}
result_type
operator()(const Point_3& a1, const Point_3& b1, const Point_3& c1,
const Point_3& a2, const Point_3& b2, const Point_3& c2) const
{
typename K::Construct_vector_3 vector = K().construct_vector_3_object();
const Vector_3 ba1 = vector(b1, a1);
const Vector_3 bc1 = vector(b1, c1);
const Vector_3 ba2 = vector(b2, a2);
const Vector_3 bc2 = vector(b2, c2);
return this->operator()(ba1, bc1, ba2, bc2);
}
result_type
operator()(const Point_3& a, const Point_3& b, const Point_3& c,
const FT& cosine) const

View File

@ -318,6 +318,24 @@ compare_angle(const Point_3<K>& a, const Point_3<K>& b, const Point_3<K>& c,
return internal::compare_angle(a, b, c, cosine, K());
}
template < class K >
inline
typename K::Comparison_result
compare_angle(const Point_3<K>& a1, const Point_3<K>& b1, const Point_3<K>& c1,
const Point_3<K>& a2, const Point_3<K>& b2, const Point_3<K>& c2)
{
return internal::compare_angle(a1, b1, c1, a2, b2, c2, K());
}
template < class K >
inline
typename K::Comparison_result
compare_angle(const Vector_3<K>& u1, const Vector_3<K>& v1,
const Vector_3<K>& u2, const Vector_3<K>& v2)
{
return internal::compare_angle(u1, v1, u2, v2, K());
}
template < class K >
inline
typename K::Comparison_result

View File

@ -333,6 +333,32 @@ compare_angle(const typename K::Point_3& a,
return k.compare_angle_3_object()(a, b, c, cosine);
}
template < class K >
inline
typename K::Comparison_result
compare_angle(const typename K::Point_3& a1,
const typename K::Point_3& b1,
const typename K::Point_3& c1,
const typename K::Point_3& a2,
const typename K::Point_3& b2,
const typename K::Point_3& c2,
const K& k)
{
return k.compare_angle_3_object()(a1, b1, c1, a2, b2, c2);
}
template < class K >
inline
typename K::Comparison_result
compare_angle(const typename K::Vector_3& u1,
const typename K::Vector_3& v1,
const typename K::Vector_3& u2,
const typename K::Vector_3& v2,
const K& k)
{
return k.compare_angle_3_object()(u1, v1, u2, v2);
}
template < class K >
inline
typename K::Comparison_result

View File

@ -14,8 +14,10 @@ template <class R>
bool
_test_compare_angle_3(const R& rep)
{
typedef typename R::Point_3 Point_3;
typedef typename R::FT FT;
typedef typename R::Point_3 Point_3;
typedef typename R::Vector_3 Vector_3;
typename R::Compare_angle_3 compare_angle
= rep.compare_angle_3_object();
@ -33,6 +35,18 @@ _test_compare_angle_3(const R& rep)
return false;
if ( CGAL::compare(abs(theta1), abs(theta2)) != compare_angle(a, b, c, FT(std::cos(angle2))) )
return false;
Point_3 d((int)(std::cos(angle2)*1000), (int)(std::sin(angle2)*1000), 0);
if ( CGAL::compare(abs(theta1), abs(theta2)) != CGAL::compare_angle(a, b, c, a, b, d ) )
return false;
if ( CGAL::compare(abs(theta1), abs(theta2)) != compare_angle(a, b, c, a, b, d ) )
return false;
Vector_3 u1(b, a), v1(b, c), v2(b, d);
if ( CGAL::compare(abs(theta1), abs(theta2)) != CGAL::compare_angle(u1, v1, u1, v2) )
return false;
if ( CGAL::compare(abs(theta1), abs(theta2)) != compare_angle(u1, v1, u1, v2) )
return false;
} // end loop on theta2
} // end loop and theta1
return true;

View File

@ -4,4 +4,3 @@ PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Kinetic Space Partition"
EXTRACT_ALL = NO
HIDE_UNDOC_CLASSES = YES
WARN_IF_UNDOCUMENTED = NO
PREDEFINED += DOXYGEN_RUNNING

View File

@ -17,7 +17,7 @@
\cgalPkgShortInfoBegin
\cgalPkgSince{6.0}
\cgalPkgDependsOn{\ref PkgSurfaceMesh, \ref PkgLinearCellComplex}
\cgalPkgBib{cgal:ol-kinetic}
\cgalPkgBib{cgal:ol-kinetic-partition}
\cgalPkgLicense{\ref licensesGPL "GPL"}
\cgalPkgShortInfoEnd

View File

@ -3,7 +3,6 @@
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Kinetic Surface Reconstruction"
EXTRACT_ALL = YES
WARN_IF_UNDOCUMENTED = NO
PREDEFINED += DOXYGEN_RUNNING
INPUT += \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Kinetic_surface_reconstruction_3.h \

View File

@ -14,7 +14,7 @@
\cgalPkgShortInfoBegin
\cgalPkgSince{6.0}
\cgalPkgDependsOn{\ref PkgKineticSpacePartition, \ref PkgSurfaceMesh, \ref PkgLinearCellComplex, \ref PkgShapeDetection}
\cgalPkgBib{cgal:ol-kinetic}
\cgalPkgBib{cgal:ol-kinetic-reconstruction}
\cgalPkgLicense{\ref licensesGPL "GPL"}
\cgalPkgShortInfoEnd

View File

@ -12,7 +12,6 @@
#include <CGAL/Exact_rational.h>
#include <CGAL/Polyhedron_kernel.h>
#include <CGAL/convex_hull_3.h>
#include <CGAL/Dualizer.h>
#include <CGAL/translate.h>
#include <CGAL/boost/graph/Dual.h>
#include <CGAL/boost/graph/copy_face_graph.h>
@ -95,6 +94,7 @@ void CGAL_Lab_kernel_plugin::on_actionKernel_triggered()
// get inside point
Point inside_point = kernel.inside_point();
Vector translate = inside_point - CGAL::ORIGIN;
// compute dual of translated polyhedron w.r.t. inside point.
@ -132,9 +132,6 @@ void CGAL_Lab_kernel_plugin::on_actionKernel_triggered()
typedef CGAL::Dual<SMesh> Dual;
typedef boost::graph_traits<Dual>::vertex_descriptor dual_vertex_descriptor;
std::ofstream out("primal.off");
out << convex_hull << std::endl;
out.close();
Dual dual(convex_hull);
std::map<dual_vertex_descriptor,Point> vpm;

View File

@ -732,92 +732,130 @@ void Basic_generator_plugin::generateLines()
{
QString text = dock_widget->line_textEdit->toPlainText();
std::list<std::vector<Scene_polylines_item::Point_3> > polylines;
polylines.resize(polylines.size()+1);
std::vector<Scene_polylines_item::Point_3>& polyline = *(polylines.rbegin());
QStringList polylines_metadata;
QStringList list = text.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS);
int counter = 0;
double coord[3];
auto read_polyline = [&polylines](const QStringList& list, bool is_2d, bool is_closed)
{
int counter = -1;
double coord[3];
bool ok = true;
if(!is_2d && list.size()%3!=0){
QMessageBox *msgBox = new QMessageBox;
msgBox->setWindowTitle("Error");
msgBox->setText("ERROR : Input should consists of triplets.");
msgBox->exec();
return false;
}
else if(is_2d && list.size()%2!=0){
QMessageBox *msgBox = new QMessageBox;
msgBox->setWindowTitle("Error");
msgBox->setText("ERROR : Input should consists of pairs.");
msgBox->exec();
return false;
}
polylines.back().reserve(list.size()+(is_closed?1:0));
for(QString s : list)
{
if(!s.isEmpty())
{
double res = s.toDouble(&ok);
if(!ok)
{
QMessageBox *msgBox = new QMessageBox;
msgBox->setWindowTitle("Error");
msgBox->setText("ERROR : Coordinates are invalid.");
msgBox->exec();
return false;
}
else
{
coord[++counter] = res;
}
}
if(!is_2d && counter == 2)
{
Scene_polylines_item::Point_3 p(coord[0], coord[1], coord[2]);
polylines.back().push_back(p);
counter=-1;
}
else if(is_2d && counter == 1)
{
Scene_polylines_item::Point_3 p(coord[0], coord[1], 0);
polylines.back().push_back(p);
counter=-1;
}
}
if(is_closed)
{
if (polylines.back().back()!=polylines.back().front())
polylines.back().push_back(polylines.back().front()); //close if not already closed
}
return true;
};
const bool is_2d = dock_widget->dim2_checkBox->isChecked();
const bool is_closed = dock_widget->polygon_checkBox->isChecked();
const bool shall_fill = is_closed && dock_widget->fill_checkBox->isChecked();
const bool oneperline = dock_widget->oneperline_checkBox->isChecked();
bool ok = true;
if (list.isEmpty()) return;
if(!dock_widget->polygon_checkBox->isChecked() && list.size()%3!=0){
QMessageBox *msgBox = new QMessageBox;
msgBox->setWindowTitle("Error");
msgBox->setText("ERROR : Input should consists of triplets.");
msgBox->exec();
return;
}
else if(dock_widget->polygon_checkBox->isChecked()&& list.size()%2!=0){
QMessageBox *msgBox = new QMessageBox;
msgBox->setWindowTitle("Error");
msgBox->setText("ERROR : Input should consists of pairs.");
msgBox->exec();
return;
}
for(QString s : list)
if (oneperline)
{
if(!s.isEmpty())
QStringList poly_list = text.split(QRegularExpression("\\n"), CGAL_QT_SKIP_EMPTY_PARTS);
if (poly_list.empty()) return;
for(const QString& qs : poly_list)
{
double res = s.toDouble(&ok);
if(!ok)
{
QMessageBox *msgBox = new QMessageBox;
msgBox->setWindowTitle("Error");
msgBox->setText("ERROR : Coordinates are invalid.");
msgBox->exec();
break;
}
else
{
coord[counter] = res;
counter++;
}
}
if(!dock_widget->polygon_checkBox->isChecked() && counter == 3)
{
Scene_polylines_item::Point_3 p(coord[0], coord[1], coord[2]);
polyline.push_back(p);
counter =0;
}
else if(dock_widget->polygon_checkBox->isChecked() && counter == 2)
{
Scene_polylines_item::Point_3 p(coord[0], coord[1], 0);
polyline.push_back(p);
counter = 0;
QStringList list = qs.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS);
if (list.isEmpty()) continue;
polylines.emplace_back();
ok = read_polyline(list, is_2d, is_closed);
if (!ok) return;
}
}
if(dock_widget->polygon_checkBox->isChecked())
else
{
polyline.push_back(polyline.front()); //polygon_2 are not closed.
QStringList list = text.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS);
if (list.isEmpty()) return;
polylines.emplace_back();
ok = read_polyline(list, is_2d, is_closed);
if (!ok) return;
}
if(ok)
{
dock_widget->line_textEdit->clear();
if(dock_widget->fill_checkBox->isChecked())
if(shall_fill)
{
CGAL::Three::Three::CursorScopeGuard guard(Qt::WaitCursor);
QApplication::processEvents();
if(polyline.front() != polyline.back()) {
polyline.push_back(polyline.front());
}
if(polyline.size() < 4) { // no triangle, skip it (needs at least 3 + 1 repeat)
QMessageBox::warning(mw, "Warning", "Needs at least 3 points to triangulate. Aborting.");
return;
}
std::vector<Face> patch;
CGAL::Polygon_mesh_processing::triangulate_hole_polyline(polyline,
std::back_inserter(patch),
CGAL::parameters::use_delaunay_triangulation(true));
if(patch.empty()) {
QMessageBox::warning(mw, "Warning", "Triangulation failed.");
return;
}
SMesh* poly = new SMesh;
CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(polyline,
patch,
*poly);
for (const auto& polyline : polylines)
{
if(polyline.size() < 4) { // no triangle, skip it (needs at least 3 + 1 repeat)
QMessageBox::warning(mw, "Warning", "Needs at least 3 points to triangulate. Aborting.");
delete poly;
return;
}
std::vector<Face> patch;
CGAL::Polygon_mesh_processing::triangulate_hole_polyline(polyline,
std::back_inserter(patch),
CGAL::parameters::use_delaunay_triangulation(true));
if(patch.empty()) {
QMessageBox::warning(mw, "Warning", "Triangulation failed.");
return;
}
CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(polyline,
patch,
*poly);
}
Scene_surface_mesh_item* poly_item = new Scene_surface_mesh_item(poly);
poly_item->setName(dock_widget->name_lineEdit->text());
@ -831,6 +869,7 @@ void Basic_generator_plugin::generateLines()
item->invalidateOpenGLBuffers();
item->setName(dock_widget->name_lineEdit->text());
item->setColor(Qt::black);
QStringList polylines_metadata;
item->setProperty("polylines metadata", polylines_metadata);
Scene_interface::Item_id id = scene->addItem(item);
scene->setSelectedItem(id);

View File

@ -1101,20 +1101,37 @@ li.checked::marker { content: &quot;\2612&quot;; }
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_23">
<item>
<widget class="QCheckBox" name="dim2_checkBox">
<property name="text">
<string>2D</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="polygon_checkBox">
<property name="text">
<string>From Polygon_2</string>
<string>Polygon(s)</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="fill_checkBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Triangulate</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="oneperline_checkBox">
<property name="text">
<string>One Per Line</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
@ -1222,5 +1239,22 @@ li.checked::marker { content: &quot;\2612&quot;; }
<include location="../../CGALlab.qrc"/>
<include location="../../CGALlab.qrc"/>
</resources>
<connections/>
<connections>
<connection>
<sender>polygon_checkBox</sender>
<signal>stateChanged(int)</signal>
<receiver>fill_checkBox</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>190</x>
<y>83</y>
</hint>
<hint type="destinationlabel">
<x>534</x>
<y>83</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -232,11 +232,12 @@ public:
"Create Facegraph from Selected Facets" ,
"Erase Selected Facets" ,
"Keep Connected Components of Selected Facets" ,
"Expand Face Selection to Stay Manifold After Removal" ,
"Convert from Edge Selection to Facets Selection" ,
"Convert from Edge Selection to Point Selection" ,
"Convert from Facet Selection to Boundary Edge Selection",
"Convert from Facet Selection to Point Selection"
"Expand Face Selection to Remain Manifold After Removal" ,
"Select Edges Incident to Selected Facets" ,
"Select Vertices Incident to Selected Edges" ,
"Select Edges on the Boundary of Regions of Selected Facets",
"Select Vertices of Selected Facets",
"Add Triangle Face from Selected Vertices"
};
operations_map[operations_strings[0]] = 0;
@ -249,6 +250,7 @@ public:
operations_map[operations_strings[7]] = 7;
operations_map[operations_strings[8]] = 8;
operations_map[operations_strings[9]] = 9;
operations_map[operations_strings[10]] = 10;
}
virtual void closure() override
{
@ -555,8 +557,6 @@ public Q_SLOTS:
}
}
void on_Selection_type_combo_box_changed(int index) {
std::cout << "on_Selection_type_combo_box_changed(" << index << ")" << std::endl;
typedef Scene_polyhedron_selection_item::Active_handle Active_handle;
for(Selection_item_map::iterator it = selection_item_map.begin(); it != selection_item_map.end(); ++it) {
it->second->set_active_handle_type(static_cast<Active_handle::Type>(index));
@ -906,6 +906,20 @@ public Q_SLOTS:
selection_item->itemChanged();
break;
}
//Add Triangle Face to FaceGraph
case 10:
{
Scene_polyhedron_selection_item* selection_item = getSelectedItem<Scene_polyhedron_selection_item>();
if(!selection_item) {
print_message("Error: there is no selected polyhedron selection item!");
return;
}
if(selection_item->selected_vertices.size() != 3) {
print_message("Error: there is not exactly 3 vertices selected!");
return;
}
selection_item->add_facet_from_selected_vertices();
}
default :
break;
}
@ -1175,6 +1189,8 @@ void filter_operations()
if(has_v)
{
ui_widget.operationsBox->addItem(operations_strings[0]);
if(selection_item->selected_vertices.size() == 3)
ui_widget.operationsBox->addItem(operations_strings[10]);
}
if(has_e)
{

View File

@ -781,6 +781,66 @@ public:
return num_vertices(*out) > 0;
}
fg_face_descriptor add_facet_from_selected_vertices()
{
fg_face_descriptor null_face = boost::graph_traits<Face_graph>::null_face();
if(selected_vertices.size() != 3) // NYI
return null_face;
// since the selected vertices are a set, we lost order in the process,
// so find back the correct orientation
std::array<fg_vertex_descriptor, 3> vs;
for(std::size_t i=0; i<3; ++i)
vs[i] = *(std::next(selected_vertices.begin(), i));
int pos_counter = 0, neg_counter = 0;
for(std::size_t i=0; i<3; ++i)
{
auto res = halfedge(vs[i], vs[(i+1)%3], *polyhedron());
if(res.second && !is_border(res.first, *polyhedron()))
{
// the halfedge 'vs[i] - vs[i+1]' already exists in the graph and is not border,
// so vote for orienting the facet the other way
++neg_counter;
}
res = halfedge(vs[(i+1)%3], vs[i], *polyhedron());
if(res.second && !is_border(res.first, *polyhedron()))
{
// the halfedge 'vs[i+1] - vs[i]' already exists in the graph and is not border,
// so vote for keeping the current orientationorientation
++pos_counter;
}
}
if(pos_counter > 0 && neg_counter > 0)
{
// disagreement, can't insert the face (@todo duplicate and insert?)
std::cerr << "Failed to find a valid orientation (" << pos_counter << " VS " << neg_counter << ")!" << std::endl;
return null_face;
}
else if(neg_counter > 0)
{
std::swap(vs[0], vs[1]);
}
fg_face_descriptor new_f = CGAL::Euler::add_face(vs, *polyhedron());
const bool successful_insertion = (new_f != null_face);
if(successful_insertion)
{
selected_vertices.clear();
invalidateOpenGLBuffers();
changed_with_poly_item();
}
else
{
std::cerr << "Failed to insert face!" << std::endl;
}
return new_f;
}
void select_sharp_edges(const double angle)
{
CGAL::detect_sharp_edges(polyhedron(), angle);

View File

@ -1,123 +0,0 @@
#ifndef _DUALIZER_
#define _DUALIZER_
#include <CGAL/Polyhedron_incremental_builder_3.h>
#include <CGAL/Modifier_base.h>
template <class Face_handle>
struct Facet_cmp
{
bool operator()(Face_handle a, Face_handle b) const
{
return &*a < &*b;
}
};
template <class HDS,class Polyhedron,class Kernel>
class CModifierDual : public CGAL::Modifier_base<HDS>
{
private:
typedef typename Kernel::Point_3 Point;
typedef typename Kernel::Plane_3 Plane;
typedef typename Kernel::Vector_3 Vector;
typedef typename Kernel::FT FT;
typedef typename HDS::Vertex Vertex;
typedef typename HDS::Face_handle Face_handle;
typedef typename HDS::Halfedge_handle Halfedge_handle;
typedef typename Polyhedron::Facet_iterator Facet_iterator;
typedef typename Polyhedron::Vertex_iterator Vertex_iterator;
typedef typename Polyhedron::Halfedge_around_vertex_circulator HV_circulator;
typedef typename CGAL::Polyhedron_incremental_builder_3<HDS> builder;
Polyhedron *m_pMesh;
std::map<Face_handle,int,Facet_cmp<Face_handle> > m_face_map;
public:
// life cycle
CModifierDual(Polyhedron *pMesh)
{
CGAL_assertion(pMesh != NULL);
m_pMesh = pMesh;
}
~CModifierDual() {}
void operator()( HDS& hds)
{
builder B(hds,true);
B.begin_surface(3,1,6);
add_vertices(B);
add_facets(B);
B.end_surface();
}
// add vertices
void add_vertices(builder &B)
{
int index = 0;
Facet_iterator it;
for(it = m_pMesh->facets_begin();
it != m_pMesh->facets_end();
it++)
{
Face_handle f = it;
m_face_map[f] = index++;
B.add_vertex(dual(f));
}
}
Plane facet_plane(Face_handle f)
{
const Point& a = f->halfedge()->vertex()->point();
const Point& b = f->halfedge()->next()->vertex()->point();
const Point& c = f->halfedge()->next()->next()->vertex()->point();
return Plane(a,b,c);
}
Point dual(Face_handle f)
{
Plane plane = facet_plane(f);
FT sqd = CGAL::squared_distance(Point(CGAL::ORIGIN),plane);
FT distance_to_origin = std::sqrt(sqd);
Vector normal = plane.orthogonal_vector();
normal = normal / std::sqrt(normal * normal);
return CGAL::ORIGIN + normal / distance_to_origin;
}
// add facets
void add_facets(builder &B)
{
Vertex_iterator v;
for(v = m_pMesh->vertices_begin();
v != m_pMesh->vertices_end();
v++)
{
B.begin_facet();
HV_circulator he = v->vertex_begin();
HV_circulator end = he;
CGAL_For_all(he,end)
B.add_vertex_to_facet(m_face_map[he->facet()]);
B.end_facet();
}
}
};
template <class Polyhedron, class Kernel>
class Dualizer
{
public:
typedef typename Polyhedron::HalfedgeDS HalfedgeDS;
Dualizer() {}
~Dualizer() {}
public:
void run(Polyhedron &input, Polyhedron &output)
{
CModifierDual<HalfedgeDS,Polyhedron,Kernel> dualizer(&input);
output.delegate(dualizer);
}
};
#endif // _DUALIZER_

View File

@ -18,7 +18,7 @@ actions = {
"Thursday": integration,
"Friday": release("5.5"),
"Saturday": release("5.6"),
"Sunday": beta_release_from_master(1),
"Sunday": beta_release_from_master(2),
}

View File

@ -1,103 +1,153 @@
The CGAL Open Source Project is pleased to announce the release 5.6 Beta 1 of CGAL, the Computational Geometry Algorithms Library.
The CGAL Open Source Project is pleased to announce the release 6.0 Beta 1 of CGAL, the Computational Geometry Algorithms Library.
CGAL version 5.6 Beta 1 is a public testing release. It should provide a solid ground to report bugs that need to be tackled before the release of the final version of CGAL 5.6 in July 2022.
CGAL version 6.0 Beta 1 is a public testing release. It should provide a solid ground to report bugs that need to be tackled before the release of the final version of CGAL 6.0 in July 2024.
Besides fixes and general enhancement to existing packages, the following has changed since CGAL 5.5:
Besides fixes and general enhancement to existing packages, the following has changed since CGAL 5.6:
### General Changes
- **Breaking change**: Package-specific assertions, preconditions, and postconditions (such as `CGAL_triangulation_assertion`) have been removed. Corresponding CGAL-wide versions (such as `CGAL_assertion`) should be used instead.
- CGAL 6.0 is the first release of CGAL that requires a C++ compiler with the support of C++17 or later. The new list of supported compilers is:
- Visual C++ 15.9, 16.10, 17.0 (from Visual Studio 2017, 2019 and 2022) or later
- Gnu g++ 11.4.0 or later (on Linux or macOS)
- LLVM Clang version 15.0.7 or later (on Linux)
- Apple Clang compiler versions 10.0.1, 12.0.5, and 15.0.0 (on macOS)
- The minimal supported version of Boost is now 1.72.0.
- The CGAL `Core` library is no longer based on GMP, but on [Boost.Multiprecision](https://www.boost.org/doc/libs/1_72_0/libs/multiprecision/doc/html/index.html). Either GMP backend or Boost backend can be used.
- All demos are now based on Qt6.
- **Breaking change**: The CMake file `UseCGAL.cmake` has been removed from CGAL. Usages of the CMake variables `${CGAL_USE_FILE}` and `${CGAL_LIBRARIES}` must be replaced by a link to the imported target `CGAL::CGAL`, for example: `target_link_library(your_target PRIVATE CGAL::CGAL)`.
### [Shape Detection](https://doc.cgal.org/5.6/Manual/packages.html#PkgShapeDetection) (major changes)
### [Kinetic Space Partition](https://doc.cgal.org/6.0/Manual/packages.html#PkgKineticSpacePartition) (new package)
- **Breaking change**: The region growing part of the package have been reworked to fix design issues introduced with the handling of `FaceGraph` models. In particular, the notion of `Item` has been introduced to reference an element in the input range of elements. Region maps now operates on `Item` and no longer on the value type of the input range.
- **Breaking change**: The method `update()` in the concept `RegionType` now returns a `Boolean` instead of `void`, that is used inside the class `Region_growing` for detecting if the input conditions for the new region are satisfied. This change affects only user-defined types of regions.
- **Breaking change**: The constructors of all models used together with the region growing algorithm now enable users to provide parameters through the [named parameters](https://doc.cgal.org/5.6/BGL/group__bgl__namedparameters.html) mechanism.
- All fitting classes in the region growing framework are now using better versions of the region conditions, more precise and faster, including the correct normal orientations.
- Added new models of the concept `RegionType` for getting linear regions in a set of 2D and 3D segments and on 2D and 3D polylines.
- Added the class `Polyline_graph` for extracting a set of polylines from a face graph, which splits this graph into a set of user-defined regions.
- Added new shapes to the Region Growing algorithm on a point set: circles in 2D, spheres in 3D, and cylinders in 3D.
- This package implements kinetic space partition: based on a set of planar input shapes, the bounding box of the input data is split into convex volumes. The complexity of the partition can be adjusted with a single parameter.
### [2D Straight Skeleton and Polygon Offsetting](https://doc.cgal.org/5.6/Manual/packages.html#PkgStraightSkeleton2) (major changes)
- Added weighted straight skeletons: weighted straight skeletons are a generalization of straight skeletons. Contour edges are assigned a positive weight, which can be understood as assigning a speed to the wavefront spawned from the contour edge.
- Added straight skeleton extrusion: this CGAL package now implements the extrusion of weighted straight skeletons of polygons with holes. The output is a closed, combinatorially 2-manifold surface triangle mesh.
See also the [news entry](https://www.cgal.org/2023/05/09/improved_straight_skeleton/).
### [Kinetic Surface Reconstruction](https://doc.cgal.org/6.0/Manual/packages.html#PkgKineticSurfaceReconstruction) (new package)
### [2D and 3D Linear Geometry Kernel](https://doc.cgal.org/5.6/Manual/packages.html#PkgKernel23)
- The package implements a piece-wise planar surface reconstruction pipeline from point clouds combining methods from the [Shape Detection](https://doc.cgal.org/6.0/Manual/packages.html#PkgShapeDetection), [Shape Regularization](https://doc.cgal.org/6.0/Manual/packages.html#PkgShapeRegularization) and [Kinetic Shape Partition](https://doc.cgal.org/6.0/Manual/packages.html#PkgKineticSpacePartition) packages and graph-cut to reconstruct surfaces from point clouds.
- Added the functor [`CompareAngle_3`](https://doc.cgal.org/5.6/Kernel_23/classKernel_1_1CompareAngle__3.html) to the concept [`Kernel`](https://doc.cgal.org/5.6/Kernel_23/classKernel.html) to compare an angle defined by three points to the cosinus of another angle.
### [Basic Viewer](https://doc.cgal.org/6.0/Basic_viewer/index.html#Chapter_Basic_viewer) (new package)
### [Combinatorial Maps](https://doc.cgal.org/5.6/Manual/packages.html#PkgCombinatorialMaps), [Generalized Maps](https://doc.cgal.org/5.6/Manual/packages.html#PkgGeneralizedMaps), and [Linear Cell Complex](https://doc.cgal.org/5.6/Manual/packages.html#PkgLinearCellComplex)
- The basic viewer package provides interactive visualization for most CGAL packages, such as [2D Arrangements](https://doc.cgal.org/6.0/Manual/packages.html#PkgArrangementOnSurface2), [2D Regularized Boolean Set-Operations](https://doc.cgal.org/6.0/Manual/packages.html#PkgBooleanSetOperations2), [Linear Cell Complex](https://doc.cgal.org/6.0/Manual/packages.html#PkgLinearCellComplex), [3D Boolean Operations on Nef Polyhedra](https://doc.cgal.org/6.0/Manual/packages.html#PkgNef3), [2D Periodic Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgPeriodic2Triangulation2), [3D Point Set](https://doc.cgal.org/6.0/Manual/packages.html#PkgPointSet3), [2D Polygons](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolygon2), [3D Polyhedral Surface](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolyhedron), [2D Straight Skeleton and Polygon Offsetting](https://doc.cgal.org/6.0/Manual/packages.html#PkgStraightSkeleton2), [Surface Mesh](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMesh), [2D Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulation2), [3D Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulation3), [2D Voronoi Diagrams](https://doc.cgal.org/6.0/Manual/packages.html#PkgVoronoiDiagram2), and more. The most simple use case of the basic viewer is the call of the global `CGAL::draw()` function. There is one such `draw()` function for each CGAL package that has a basic viewer. Such a call opens an interactive window showing the given model and allowing to navigate in the scene, show or hide some specific cells, show the interior of the model if any, etc. The `Basic_viewer` is based on Qt6.
- Added a version that uses indices instead of handles as dart and attribute descriptors. As the indices are integers convertible from and to `std::size_t`, they can be used as index into vectors which store properties. To use the index version, `Use_index` must be defined and be equal to `CGAL::Tag_true` in the item class.
### [Polygon Repair](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolygonRepair) (new package)
### [Linear Cell Complex](https://doc.cgal.org/5.6/Manual/packages.html#PkgLinearCellComplex)
- This package provides algorithms to repair 2D polygons, polygons with holes, and multipolygons with holes, by selecting faces of the arrangement of the input using the odd-even heuristic.
- Added the class [`Linear_cell_complex_incremental_builder_3`](https://doc.cgal.org/5.6/Linear_cell_complex/classCGAL_1_1Linear__cell__complex__incremental__builder__3.html).
### [2D and 3D Linear Geometry Kernel](https://doc.cgal.org/6.0/Manual/packages.html#PkgKernel23)
### [2D Arrangements](https://doc.cgal.org/5.6/Manual/packages.html#PkgArrangementOnSurface2)
- **Breaking change**: Replaced all instances of `boost::variant` with `std::variant` in the intersection functions.
- **Breaking change**: Replaced all instances of `boost::optional` with `std::optional` in the intersection functions.
- Introduced an overload function template, namely `draw(arr)`, that renders arrangements based on the `Basic_viewer_qt` class template. As of now, only 2D arrangements on the plane induced by (i) segments, (ii) conics, and (iii) circular arcs or (linear) segments are supported.
- Improved the traits class template that handles conics, namely [`Arr_conic_traits_2`](https://doc.cgal.org/5.6/Arrangement_on_surface_2/classCGAL_1_1Arr__conic__traits__2.html). This includes the following: 1. Fixed a couple of bugs and slightly optimized some functions. 2. Introduced functionality that approximates conics with polylines. (This is used to draw conic curves.) 3. **Breaking change**: Changed the interface to generate conic curves. In the past, curves where generated directly using the constructors of the conic and x-monotone conic constructs. Now, they are constructed via function objects provided by the traits. This eliminates the constructions of temporary kernels. The old functionality is obsolete, but still supported for a limited number of versions. It depends on a static member function of the traits. In a future version this function will no longer be static, implying that the old functionality will no longer be supported.
- Introduced functionality that approximates circular segments with polylines. (This is used to draw conic curves.)
### [3D Polyhedral Surface](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolyhedron)
### [Polygon Mesh Processing](https://doc.cgal.org/5.6/Manual/packages.html#PkgPolygonMeshProcessing)
- The demo of this package, also known as “Polyhedron Demo” has been renamed “CGAL Lab” and moved to its own package (“Lab”).
- Added functions [`CGAL::Polygon_mesh_processing::region_growing_of_planes_on_faces()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PkgPolygonMeshProcessingRef.html#ga50dcd2f6295f584d2e378b57290ae2af) and [`CGAL::Polygon_mesh_processing::detect_corners_of_regions()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PkgPolygonMeshProcessingRef.html#gac8e445730d718a2fc49604e865017d2e), which enable partitioning a mesh into planar regions using the region growing algorithm from the [Shape Detection](https://doc.cgal.org/5.6/Manual/packages.html#PkgShapeDetection) package.
### [2D and 3D Fast Intersection and Distance Computation (AABB Tree)](https://doc.cgal.org/6.0/Manual/packages.html#PkgAABBTree)
- Added the functions [`CGAL::Polygon_mesh_processing::remesh_planar_patches()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__meshing__grp.html#ga7fca6fa2db94560ab6d32e6a77fc35b6) and [`CGAL::Polygon_mesh_processing::remesh_almost_planar_patches()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__meshing__grp.html#ga0e6da479548199a5d82c3cf0ed36e8a0), which can be used to remesh patches of coplanar faces in a mesh.
- The AABB tree can now be used with 2D or 3D primitives:
- The concepts `AABBGeomTraits` and `AABBRayIntersectionGeomTraits` have been replaced by [`AABBGeomTraits_3`](https://doc.cgal.org/6.0/AABB_tree/classAABBGeomTraits__3.html) and by [`AABBRayIntersectionGeomTraits_3`](https://doc.cgal.org/6.0/AABB_tree/classAABBRayIntersectionGeomTraits__3.html), respectively.
- The concepts [`AABBGeomTraits_2`](https://doc.cgal.org/6.0/AABB_tree/classAABBGeomTraits__2.html) and [`AABBRayIntersectionGeomTraits_2`](https://doc.cgal.org/6.0/AABB_tree/classAABBRayIntersectionGeomTraits__2.html) have been introduced, as the 2D counterparts.
- The class [`CGAL::AABB_traits`](https://doc.cgal.org/6.0/AABB_tree/group__PkgAABBTreeRef.html#ga764f0fc59c96355877536810aa1aca5b) is deprecated and replaced by [`CGAL::AABB_traits_3`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__traits__3.html).
- The class [`CGAL::AABB_traits_2`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__traits__2.html) is introduced as the 2D counterpart.
- The class [`CGAL::AABB_segment_primitive`](https://doc.cgal.org/6.0/AABB_tree/group__PkgAABBTreeRef.html#gad0acfd5c4a3c081b7570cc6bd4594c8d) has been deprecated and replaced by the class [`CGAL::AABB_segment_primitive_3`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__segment__primitive__3.html).
- The class [`CGAL::AABB_triangle_primitive`](https://doc.cgal.org/6.0/AABB_tree/group__PkgAABBTreeRef.html#ga54a56f01dc8024624f7d83ee0a01add0) has been deprecated and replaced by the class [`CGAL::AABB_triangle_primitive_3`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__triangle__primitive__3.html).
- The following 2D primitive classes have been added: [`CGAL::AABB_segment_primitive_2`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__segment__primitive__2.html), [`CGAL::AABB_polyline_segment_primitive_2`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__polyline__segment__primitive__2.html), [`CGAL::AABB_triangle_primitive_2`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__triangle__primitive__2.html), [`CGAL::AABB_indexed_triangle_primitive_2`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__indexed__triangle__primitive__2.html).
- **Breaking change**: The concept [`AABBTraits`](https://doc.cgal.org/6.0/AABB_tree/classAABBTraits.html) now refines the concept [`SearchTraits`](https://doc.cgal.org/6.0/Spatial_searching/classSearchTraits.html).
- **Breaking change**: Replaced all instances of `boost::optional` with `std::optional`.
- Added the function [`CGAL::Polygon_mesh_processing::surface_Delaunay_remeshing()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__meshing__grp.html#gaff62f9415d2fe96d1d3095351f156ced), which can be used to remesh a surface triangle mesh using the Delaunay refinement algorithm from the [3D Mesh Generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgMesh3) package.
### [2D Arrangements](https://doc.cgal.org/6.0/Manual/packages.html#PkgArrangementOnSurface2)
- Added the function [`CGAL::Polygon_mesh_processing::remove_almost_degenerate_faces()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__geometric__repair__grp.html#ga48008d2b66de8a68a7068f29db15dad6), which can be used to remove badly shaped triangles faces in a mesh.
- **Breaking change**: Replaced all instances of `boost::variant` with `std::variant`.
- **Breaking change**: The type of the result of point location queries has been changed to `std::variant`. Support for the old macro `CGAL_ARR_POINT_LOCATION_VERSION` has been removed.
- **Breaking change**: Eliminated the error-prone C-type casting that was used to define observers. In general, backward compatibility was maintained; however, the class template [`CGAL::Arr_observer`](https://doc.cgal.org/6.0/Arrangement_on_surface_2/group__PkgArrangementOnSurface2Ref.html#ga8019f986f5469920136c4b92290b7b1b) has been replaced by an alias template. (The class `CGAL::Arr_observer` was renamed to [`CGAL::Aos_observer`](https://doc.cgal.org/6.0/Arrangement_on_surface_2/classCGAL_1_1Aos__observer.html)).
- Introduced [`Arr_dcel`](https://doc.cgal.org/6.0/Arrangement_on_surface_2/classCGAL_1_1Arr__dcel.html), which essentially replaces the former `CGAL::Arr_default_dcel`. Backward compatibility was maintained by the introduction of the alias template [`CGAL::Arr_default_dcel`](https://doc.cgal.org/6.0/Arrangement_on_surface_2/group__PkgArrangementOnSurface2DCEL.html#gaf9635869a3794a46d7dcfce63d7de2a6). `CGAL::Arr_dcel`, as opposed to the former `CGAL::Arr_default_dcel` is templated (in addition to the geometry traits) by `Vertex`, `Halfedge`, and `Face` template parameters, and they have default type values. All this enables the layered extension of DCEL records.
- Fixed a bug in the zone construction code applied to arrangements of geodesic arcs on a sphere, when inserting an arc that lies on the identification curve.
- Introduced a new interactive program that demonstrates 2D arrangements embedded on the sphere called `earth`. The program (i) reads a database of all administrative boundaries of the countries in the world, (ii) displays the globe with all countries and land covered by water (which is land not covered by countries) on a window, and (ii) enables interaction with the user.
- Added the functions [`CGAL::Polygon_mesh_processing::does_triangle_soup_self_intersect()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__intersection__grp.html#ga4909920dc48b8285e69feb845feb1e53) and [`CGAL::Polygon_mesh_processing::triangle_soup_self_intersections()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__intersection__grp.html#ga1c5fee17bd0d92d5a2fba77ed94d4b4d) to identify and report self-intersections in a triangle soup, similarly to existing functions on triangle meshes.
### [3D Envelopes](https://doc.cgal.org/6.0/Manual/packages.html#PkgEnvelope3)
- Added the function [`CGAL::Polygon_mesh_processing::triangulate_polygons()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__meshing__grp.html#ga8b7db6aa8c3e79526b594739ba926d82), which allows users to triangulate polygon soups.
- **Breaking change**: [`Construct_projected_boundary_2`](https://doc.cgal.org/6.0/Envelope_3/classEnvelopeTraits__3.html#ac7b8f72870f0572834a0a3de62c67bc1) in [`EnvelopeTraits_3`](https://doc.cgal.org/6.0/Envelope_3/classEnvelopeTraits__3.html) now uses `std::variant` instead of [`CGAL::Object`](https://doc.cgal.org/6.0/STL_Extension/classCGAL_1_1Object.html).
- Passed the base class of [`CGAL::Env_plane_traits_3`](https://doc.cgal.org/6.0/Envelope_3/classCGAL_1_1Env__plane__traits__3.html) as a template parameter with a default value (being the 2D arrangement linear traits). Similarly, passed the base class of `CGAL::Env_triangle_traits_3` as a template parameter with a default value (being the 2D arrangement segment traits).
- Added a named parameter to [`CGAL::Polygon_mesh_processing::smooth_shape()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__meshing__grp.html#ga57fa999abe8dc557003482444df2a189) to disable the scaling, which otherwise aims to compensate volume loss during smoothing.
### [Combinatorial Maps](https://doc.cgal.org/6.0/Manual/packages.html#PkgCombinatorialMaps) and [Generalized Maps](https://doc.cgal.org/6.0/Manual/packages.html#PkgGeneralizedMaps)
- Deprecated the overloads of functions [`CGAL::Polygon_mesh_processing::triangulate_hole()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__hole__filling__grp.html#ga3abdf2d0558822e85f060966b69cae98), [`CGAL::Polygon_mesh_processing::triangulate_and_refine_hole()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__hole__filling__grp.html#ga9868fac4d9dca77462ad7828bc99d8a1), and [`CGAL::Polygon_mesh_processing::triangulate_refine_and_fair_hole()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__hole__filling__grp.html#ga18eac756a8f8e5d5f73e645fd4e26cad) which have output iterators for vertices and faces as parameter. They are replaced by overloads with two additional named parameters.
- Added the function [`insert_cell_1_between_two_cells_2()`](https://doc.cgal.org/6.0/Combinatorial_map/classGenericMap.html#aa29570a0812094c7876e24a228373f12) to the [`GenericMap`](https://doc.cgal.org/6.0/Combinatorial_map/classGenericMap.html) concept, which enables users to insert an edge between two different faces in order to create faces with holes.
### [2D Convex Hulls](https://doc.cgal.org/5.6/Manual/packages.html#PkgConvexHull2)
- Added new meshing criterion `edge_distance`, an upper bound for the distance from the edge to the 1D feature.
- **Breaking change**: The concept [`ConvexHullTraits_2`](https://doc.cgal.org/5.6/Convex_hull_2/classConvexHullTraits__2.html) no longer requires the functor `Less_signed_distance_to_line_2`, but requires the functor `Compare_signed_distance_to_line_2` instead.
- The long-deprecated classes `Convex_hull_projective_xy_traits_2`, `Convex_hull_projective_xz_traits_2`, and `Convex_hull_projective_yz_traits_2` have been removed. Users should use [`Projection_traits_xy_3`](https://doc.cgal.org/5.6/Kernel_23/classCGAL_1_1Projection__traits__xy__3.html), [`Projection_traits_xz_3`](https://doc.cgal.org/5.6/Kernel_23/classCGAL_1_1Projection__traits__xz__3.html), and [`Projection_traits_yz_3`](https://doc.cgal.org/5.6/Kernel_23/classCGAL_1_1Projection__traits__yz__3.html) instead.
- **Breaking change**: the concept `MeshEdgeCriteria_3` was modified to include the new meshing criterion `edge_distance`.
### [2D Triangulations](https://doc.cgal.org/5.6/Manual/packages.html#PkgTriangulation2)
### [Quadtrees, Octrees, and Orthtrees](https://doc.cgal.org/6.0/Manual/packages.html#PkgOrthtree)
- Added the function [`CGAL::mark_domain_in_triangulation()`](https://doc.cgal.org/5.6/Triangulation_2/group__PkgTriangulation2Miscellaneous.html#ga0409755d0eb89100810230443a85e7eb) to mark faces connected with non-constrained edges as inside of the domain based on the nesting level.
- **Breaking change**:
- Node splitting behavior and per-node data are now customizable via the Traits class.
- Nodes are now stored as a property map, with properties of each node accessed by index.
- Nearest neighbors functions only work for Orthtrees which provide the necessary functionality.
### [2D Conforming Triangulations and Meshes](https://doc.cgal.org/5.6/Manual/packages.html#PkgMesh2)
### [CGAL and the Boost Graph Library (BGL)](https://doc.cgal.org/6.0/Manual/packages.html#PkgBGL)
- Added new overloads to the function [`write_VTU()`](https://doc.cgal.org/5.6/Mesh_2/group__PkgMesh2IO.html), with property maps for specifying the domain.
- Deprecated usage of boost parameters in favor of function named parameters in [`CGAL::lloyd_optimize_mesh_2()`](https://doc.cgal.org/5.6/Mesh_2/group__PkgMesh2Functions.html#gafeaf59d3fa014da287f8514913b38d05).
- Deprecated two overloads of the function [`refine_Delaunay_mesh()`](https://doc.cgal.org/5.6/Mesh_2/group__PkgMesh2Functions.html), and replaced them with versions using function named parameters.
- Added the function [`CGAL::remove_all_elements()`](https://doc.cgal.org/6.0/BGL/group__PkgBGLHelperFct.html#gac7e199820c95ed1fc6ab536750749358), which removes vertices, halfedges, and faces without collecting garbage and without removing properties.
- [Dynamic property maps](https://doc.cgal.org/6.0/BGL/group__PkgBGLPropertiesDynamic.html) can now have a default value.
- The class [`CGAL::Face_filtered_graph`](https://doc.cgal.org/6.0/BGL/structCGAL_1_1Face__filtered__graph.html) now supports patch IDs of any type and not just `faces_size_type`. The only requirement is that the type is hashable.
### [2D Hyperbolic Triangulations](https://doc.cgal.org/5.6/Manual/packages.html#PkgHyperbolicTriangulation2)
### [Polygon Mesh Processing](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolygonMeshProcessing)
- **Breaking change**: the concept [`HyperbolicTriangulationFaceBase_2`](https://doc.cgal.org/5.6/Hyperbolic_triangulation_2/classHyperbolicTriangulationFaceBase__2.html) has been modified to better reflect the triangulation's requirements and avoid a conflict with the requirements described by the concept `TriangulationDataStructure_2::Face`. The model [`CGAL::Hyperbolic_triangulation_face_base_2`](https://doc.cgal.org/5.6/Hyperbolic_triangulation_2/classCGAL_1_1Hyperbolic__triangulation__face__base__2.html) has been adapted correspondingly.
- Added the function [`CGAL::Polygon_mesh_processing::autorefine_triangle_soup()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PMP__corefinement__grp.html#gaec85370aa0b2acc0919e5f8406cfb74c), which can be used to refine a soup of triangles such that no pair of triangles intersects in their interiors. Also added, the function [`CGAL::Polygon_mesh_processing::autorefine()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PMP__corefinement__grp.html#ga3e3a0a82b6c04bdc3a6c070e8da4aed5) operating directly on a triangle mesh and updating it using the aforementioned function on a triangle soup.
- Added the class [`CGAL::Corefinement::Non_manifold_output_visitor`](https://doc.cgal.org/6.0/Polygon_mesh_processing/structCGAL_1_1Polygon__mesh__processing_1_1Corefinement_1_1Non__manifold__output__visitor.html), which can be used in corefinement based functions to deal with non-manifold outputs.
- Added the option to use a variable sizing field for [`CGAL::Polygon_mesh_processing::isotropic_remeshing()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PMP__meshing__grp.html#ga66cb01cf228ed22f0a2a474cfa2aeb3f), and a sizing function based on a measure of local curvature for adaptive remeshing.
- Added the function [`CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PMP__corrected__curvatures__grp.html#ga22665c9ce92aaedab07df1b05f20bdb2) which can be used to compute the mean and Gaussian curvatures, as well as the principal curvature and directions.
- Added the function [`CGAL::Polygon_mesh_processing::refine_mesh_at_isolevel()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PkgPolygonMeshProcessingRef.html#ga396505d5a60b5f6d29792b214fa59352) which can be used to refine a polygon mesh along an isocurve.
- Added the function [`CGAL::Polygon_mesh_processing::add_bbox()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PkgPolygonMeshProcessingRef.html#gabaf98d2fd9ae599ff1f3a5a6cde79cf3), which enables adding a tight or extended, triangulated or not, bounding box to a face graph.
### [3D Simplicial Mesh Data Structure](https://doc.cgal.org/5.6/Manual/packages.html#PkgSMDS3) (new package)
### [2D Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulation2)
- This new package wraps all the existing code that deals with a [`MeshComplex_3InTriangulation_3`](https://doc.cgal.org/5.6/SMDS_3/classMeshComplex__3InTriangulation__3.html) to describe 3D simplicial meshes, and makes the data structure independent from the [tetrahedral mesh generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgMesh3) package.
- **Breaking change**: the concept [`TriangulationTraits_2`](https://doc.cgal.org/6.0/Triangulation_2/classTriangulationTraits__2.html) now requires an additional functor `Compare_xy_2`.
### [3D Mesh Generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgMesh3)
### [3D Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulation3)
- Added two new named parameters to the named constructor [`CGAL::create_labeled_image_mesh_domain()`](https://doc.cgal.org/5.6/Mesh_3/classCGAL_1_1Labeled__mesh__domain__3.html#aec3f58e9883a8036a1b3e379df7d8fa9) for automatic detection and protection of 1D-curves that lie at the intersection of three or more subdomains extracted from labeled images.
- Added [`CGAL::Sizing_field_with_aabb_tree`](https://doc.cgal.org/5.6/Mesh_3/structCGAL_1_1Sizing__field__with__aabb__tree.html), a geometry-aware sizing field for feature edges in polyhedral domains.
- Added new meshing criterion [`edge_min_size`](https://doc.cgal.org/5.6/Mesh_3/classCGAL_1_1Mesh__criteria__3.html#a5f1c2649cb7ea346a3b6a2a8724b4df1) to avoid subdividing sharp edges that are shorter than a prescribed size bound.
- Added new meshing criteria [`facet_min_size`](https://doc.cgal.org/5.6/Mesh_3/classCGAL_1_1Mesh__criteria__3.html#a5f1c2649cb7ea346a3b6a2a8724b4df1) and [`cell_min_size`](https://doc.cgal.org/5.6/Mesh_3/classCGAL_1_1Mesh__criteria__3.html#a5f1c2649cb7ea346a3b6a2a8724b4df1) to prevent Delaunay refinement from creating simplices smaller than a prescribed bound.
- Deprecated usage of boost parameters in favor of function named parameters.
- Added three member functions [`vertices()`](https://doc.cgal.org/6.0/Triangulation_3/classCGAL_1_1Triangulation__3.html#a02faf334255e1ca8caa1a6f412533759) to the class [`CGAL::Triangulation_3`](https://doc.cgal.org/6.0/Triangulation_3/classCGAL_1_1Triangulation__3.html). Each of them returns an array containing the vertices of the given triangulation simplex.
### [3D Periodic Mesh Generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgPeriodic3Mesh3)
### [dD Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulations)
- Periodic Mesh Generation now supports non-cubic domains.
- Deprecated usage of boost parameters in favor of function named parameters.
- **Breaking change**: `CGAL::TDS_full_cell_mirror_storage_policy` is now unsupported in dimension larger than 127.
- **Breaking change**: Inserting multiple unweighted points in the same position now keeps the first one, instead of switching to the latest. This only affects custom point types where not all points in the same position are equivalent.
### [Surface Mesh Simplification](https://doc.cgal.org/5.6/Manual/packages.html#PkgSurfaceMeshSimplification)
- The stop predicates [`Count_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Count__stop__predicate.html) and [`Count_ratio_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Count__ratio__stop__predicate.html) are renamed to [`Edge_count_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Edge__count__stop__predicate.html) and [`Edge_count_ratio_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Edge__count__ratio__stop__predicate.html). Older versions have been deprecated.
- Introduced [`Face_count_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Face__count__stop__predicate.html) and [`Face_count_ratio_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Face__count__ratio__stop__predicate.html), which can be used to stop the simplification algorithm based on a desired number of faces in the output, or a ratio between input and output face numbers.
### [Tetrahedral Remeshing](https://doc.cgal.org/6.0/Manual/packages.html#PkgTetrahedralRemeshing)
### [2D Regularized Boolean Set Operations](https://doc.cgal.org/5.6/Manual/packages.html#PkgBooleanSetOperations2)
- Exposed all required member functions of the [`GeneralPolygonWithHoles_2`](https://doc.cgal.org/5.6/Polygon/classGeneralPolygonWithHoles__2.html) concept (e.g., [`clear_outer_boundary()`](https://doc.cgal.org/5.6/Polygon/classGeneralPolygonWithHoles__2.html#a9f5f035047505a2ccab3e68770f51bc6), [`clear_holes()`](https://cgal.geometryfactory.com/CGAL/doc/master/Polygon/classGeneralPolygonWithHoles__2.html#a2a507be648f127ac605da8c670ea2580), and [`clear()`](https://doc.cgal.org/5.6/Polygon/classGeneralPolygonWithHoles__2.html#a2ca4d9b43cc9216c1b2cdb080a915944) ).
- Added a sizing field as new parameter of [`CGAL::tetrahedral_isotropic_remeshing()`](https://doc.cgal.org/6.0/Tetrahedral_remeshing/group__PkgTetrahedralRemeshingRef.html#ga263775c52eeb483a86a16aeb9eb31af0), which can be used to perform non-uniform and adaptive remeshing.
- **Breaking change**: The template parameters of [`CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3`](https://doc.cgal.org/6.0/Tetrahedral_remeshing/classCGAL_1_1Tetrahedral__remeshing_1_1Remeshing__cell__base__3.html) have been modified, reverting changes introduced in CGAL 5.6.
- **Breaking change**: The vertex base of [`CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3`](https://doc.cgal.org/6.0/Tetrahedral_remeshing/classCGAL_1_1Tetrahedral__remeshing_1_1Remeshing__vertex__base__3.html) must now be a model of the concept [`SimplicialMeshVertexBase_3`](https://doc.cgal.org/6.0/SMDS_3/classSimplicialMeshVertexBase__3.html) (and not only [`TriangulationVertexBase_3`](https://doc.cgal.org/6.0/Triangulation_3/classTriangulationVertexBase__3.html)).
### [3D Simplicial Mesh Data Structure](https://doc.cgal.org/6.0/Manual/packages.html#PkgSMDS3)
- **Breaking change**: The template parameters of [`CGAL::Simplicial_mesh_cell_base_3`](https://doc.cgal.org/6.0/SMDS_3/classCGAL_1_1Simplicial__mesh__cell__base__3.html) have been modified to enable passing a geometric traits and a custom cell base class.
### [3D Mesh Generation](https://doc.cgal.org/6.0/Manual/packages.html#PkgMesh3)
- **Breaking change**: Removed the concept `TriangleAccessor`, the template parameter `TriangleAccessor`, as well as the class `Triangle_accessor`. These were no longer used for several releases.
- **Breaking change**: Removed the class templates `CGAL::Gray_image_mesh_domain_3`, `CGAL::Implicit_mesh_domain_3`, and `CGAL::Labeled_image_mesh_domain_3`, which were deprecated since CGAL-4.13.
### [3D Surface Mesh Generation](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMesher3)
- This package is deprecated and the package [3D Mesh Generation](https://doc.cgal.org/6.0/Manual/packages.html#PkgMesh3) should be used instead.
### [Surface Mesh Parameterization](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMeshParameterization)
- **Breaking change**: The method [`CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3`](https://doc.cgal.org/6.0/Surface_mesh_parameterization/classCGAL_1_1Surface__mesh__parameterization_1_1LSCM__parameterizer__3.html) now requires the Eigen library.
- **Breaking change**: CGAL no longer ships its own version of OpenNL.
### [Surface Mesh](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMesh)
- **Breaking change**: The return type of [`CGAL::Surface_mesh::property_map()`](https://doc.cgal.org/6.0/Surface_mesh/classCGAL_1_1Surface__mesh.html#afc99c7ea179dc1c21a2ab59ed183184a) has been changed to `std::optional`.
### [3D Point Set](https://doc.cgal.org/6.0/Manual/packages.html#PkgPointSet3)
- **Breaking change**: The return type of [`CGAL::Point_set_3::property_map()`](https://doc.cgal.org/6.0/Point_set_3/classCGAL_1_1Point__set__3.html#a571ecc603cd32d78c7effaf86fe120ad) has been changed to `std::optional`.
### [Shape Detection](https://doc.cgal.org/6.0/Manual/packages.html#PkgShapeDetection)
- **Breaking change**: Replaced all instances of `boost::shared_ptr` with `std::shared_ptr`.
### [2D Straight Skeleton and Polygon Offsetting](https://doc.cgal.org/6.0/Manual/packages.html#PkgStraightSkeleton2)
- **Breaking change**: Replaced all instances of `boost::shared_ptr` with `std::shared_ptr`.
- **Breaking change**: Replaced all instances of `boost::optional` with `std::optional`.

View File

@ -1,168 +1,301 @@
Subject: CGAL 5.6 Beta 1 Released, Computational Geometry Algorithms Library
Subject: CGAL 6.0 Beta 1 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.6 Beta 1 of
CGAL, the Computational Geometry Algorithms Library.
The CGAL Open Source Project is pleased to announce the release
6.0 Beta 1 of CGAL, the Computational Geometry Algorithms Library.
CGAL version 5.6 Beta 1 is a public testing release. It should provide a
CGAL version 6.0 Beta 1 is a public testing release. It should provide a
solid ground to report bugs that need to be tackled before the release
of the final version of CGAL 5.6 in July 2023.
of the final version of CGAL 6.0 in July 2024.
Besides fixes and general enhancement to existing packages, the
following has changed since CGAL 5.5:
following has changed since CGAL 5.6:
General Changes
- Breaking change: Package-specific assertions, preconditions, and
postconditions (such as CGAL_triangulation_assertion) have been
removed. Corresponding CGAL-wide versions (such as CGAL_assertion)
should be used instead.
- CGAL 6.0 is the first release of CGAL that requires a C++ compiler
with the support of C++17 or later. The new list of supported
compilers is:
- Visual C++ 15.9, 16.10, 17.0 (from Visual Studio 2017, 2019
and 2022) or later
- Gnu g++ 11.4.0 or later (on Linux or macOS)
- LLVM Clang version 15.0.7 or later (on Linux)
- Apple Clang compiler versions 10.0.1, 12.0.5, and 15.0.0 (on
macOS)
- The minimal supported version of Boost is now 1.72.0.
- The CGAL Core library is no longer based on GMP, but on
Boost.Multiprecision. Either GMP backend or Boost backend can be
used.
- All demos are now based on Qt6.
- Breaking change: The CMake file UseCGAL.cmake has been removed from
CGAL. Usages of the CMake variables ${CGAL_USE_FILE} and
${CGAL_LIBRARIES} must be replaced by a link to the imported target
CGAL::CGAL, for example:
target_link_library(your_target PRIVATE CGAL::CGAL).
Shape Detection (major changes)
Kinetic Space Partition (new package)
- Breaking change: The region growing part of the package have been
reworked to fix design issues introduced with the handling of
FaceGraph models. In particular, the notion of Item has been
introduced to reference an element in the input range of elements.
Region maps now operates on Item and no longer on the value type of
the input range.
- Breaking change: The method update() in the concept RegionType now
returns a Boolean instead of void, that is used inside the class
Region_growing for detecting if the input conditions for the new
region are satisfied. This change affects only user-defined types of
regions.
- Breaking change: The constructors of all models used together with
the region growing algorithm now enable users to provide parameters
through the named parameters mechanism.
- All fitting classes in the region growing framework are now using
better versions of the region conditions, more precise and faster,
including the correct normal orientations.
- Added new models of the concept RegionType for getting linear
regions in a set of 2D and 3D segments and on 2D and 3D polylines.
- Added the class Polyline_graph for extracting a set of polylines
from a face graph, which splits this graph into a set of
user-defined regions.
- Added new shapes to the Region Growing algorithm on a point set:
circles in 2D, spheres in 3D, and cylinders in 3D.
- This package implements kinetic space partition: based on a set of
planar input shapes, the bounding box of the input data is split
into convex volumes. The complexity of the partition can be adjusted
with a single parameter.
2D Straight Skeleton and Polygon Offsetting (major changes)
Kinetic Surface Reconstruction (new package)
- Added weighted straight skeletons: weighted straight skeletons are a
generalization of straight skeletons. Contour edges are assigned a
positive weight, which can be understood as assigning a speed to the
wavefront spawned from the contour edge.
- Added straight skeleton extrusion: this CGAL package now implements
the extrusion of weighted straight skeletons of polygons with holes.
The output is a closed, combinatorially 2-manifold surface triangle
mesh. See also the news entry.
- The package implements a piece-wise planar surface reconstruction
pipeline from point clouds combining methods from the Shape
Detection, Shape Regularization and Kinetic Shape Partition packages
and graph-cut to reconstruct surfaces from point clouds.
Combinatorial Maps, Generalized Maps, and Linear Cell Complex
Basic Viewer (new package)
- Added a version that uses indices instead of handles as dart and
attribute descriptors. As the indices are integers convertible from
and to std::size_t, they can be used as index into vectors which
store properties. To use the index version, Use_index must be
defined and be equal to CGAL::Tag_true in the item class.
- The basic viewer package provides interactive visualization for most
CGAL packages, such as 2D Arrangements, 2D Regularized Boolean
Set-Operations, Linear Cell Complex, 3D Boolean Operations on Nef
Polyhedra, 2D Periodic Triangulations, 3D Point Set, 2D Polygons, 3D
Polyhedral Surface, 2D Straight Skeleton and Polygon Offsetting,
Surface Mesh, 2D Triangulations, 3D Triangulations, 2D Voronoi
Diagrams, and more. The most simple use case of the basic viewer is
the call of the global CGAL::draw() function. There is one such
draw() function for each CGAL package that has a basic viewer. Such
a call opens an interactive window showing the given model and
allowing to navigate in the scene, show or hide some specific cells,
show the interior of the model if any, etc. The Basic_viewer is
based on Qt6.
Polygon Repair (new package)
- This package provides algorithms to repair 2D polygons, polygons
with holes, and multipolygons with holes, by selecting faces of the
arrangement of the input using the odd-even heuristic.
2D and 3D Linear Geometry Kernel
- Breaking change: Replaced all instances of boost::variant with
std::variant in the intersection functions.
- Breaking change: Replaced all instances of boost::optional with
std::optional in the intersection functions.
3D Polyhedral Surface
- The demo of this package, also known as “Polyhedron Demo” has been
renamed “CGAL Lab” and moved to its own package (“Lab”).
2D and 3D Fast Intersection and Distance Computation (AABB Tree)
- The AABB tree can now be used with 2D or 3D primitives:
- The concepts AABBGeomTraits and AABBRayIntersectionGeomTraits
have been replaced by AABBGeomTraits_3 and by
AABBRayIntersectionGeomTraits_3, respectively.
- The concepts AABBGeomTraits_2 and
AABBRayIntersectionGeomTraits_2 have been introduced, as the 2D
counterparts.
- The class CGAL::AABB_traits is deprecated and replaced by
CGAL::AABB_traits_3.
- The class CGAL::AABB_traits_2 is introduced as the 2D
counterpart.
- The class CGAL::AABB_segment_primitive has been deprecated and
replaced by the class CGAL::AABB_segment_primitive_3.
- The class CGAL::AABB_triangle_primitive has been deprecated and
replaced by the class CGAL::AABB_triangle_primitive_3.
- The following 2D primitive classes have been added:
CGAL::AABB_segment_primitive_2,
CGAL::AABB_polyline_segment_primitive_2,
CGAL::AABB_triangle_primitive_2,
CGAL::AABB_indexed_triangle_primitive_2.
- Breaking change: The concept AABBTraits now refines the concept
SearchTraits.
- Breaking change: Replaced all instances of boost::optional with
std::optional.
2D Arrangements
- Introduced an overload function template, namely draw(arr), that
renders arrangements based on the Basic_viewer_qt class template. As
of now, only 2D arrangements on the plane induced by (i)
segments, (ii) conics, and (iii) circular arcs or (linear) segments
are supported.
- Improved the traits class template that handles conics, namely
Arr_conic_traits_2. This includes the following: 1. Fixed a couple
of bugs and slightly optimized some functions. 2. Introduced
functionality that approximates conics with polylines. (This is used
to draw conic curves.) 3. Breaking change: Changed the interface to
generate conic curves. In the past, curves where generated directly
using the constructors of the conic and x-monotone conic constructs.
Now, they are constructed via function objects provided by the
traits. This eliminates the constructions of temporary kernels. The
old functionality is obsolete, but still supported for a limited
number of versions. It depends on a static member function of the
traits. In a future version this function will no longer be static,
implying that the old functionality will no longer be supported.
- Introduced functionality that approximates circular segments with
polylines. (This is used to draw conic curves.)
- Breaking change: Replaced all instances of boost::variant with
std::variant.
- Breaking change: The type of the result of point location queries
has been changed to std::variant. Support for the old macro
CGAL_ARR_POINT_LOCATION_VERSION has been removed.
- Breaking change: Eliminated the error-prone C-type casting that was
used to define observers. In general, backward compatibility was
maintained; however, the class template CGAL::Arr_observer has been
replaced by an alias template. (The class CGAL::Arr_observer was
renamed to CGAL::Aos_observer).
- Introduced Arr_dcel, which essentially replaces the former
CGAL::Arr_default_dcel. Backward compatibility was maintained by the
introduction of the alias template CGAL::Arr_default_dcel.
CGAL::Arr_dcel, as opposed to the former CGAL::Arr_default_dcel is
templated (in addition to the geometry traits) by Vertex, Halfedge,
and Face template parameters, and they have default type values. All
this enables the layered extension of DCEL records.
- Fixed a bug in the zone construction code applied to arrangements of
geodesic arcs on a sphere, when inserting an arc that lies on the
identification curve.
- Introduced a new interactive program that demonstrates 2D
arrangements embedded on the sphere called earth. The program (i)
reads a database of all administrative boundaries of the countries
in the world, (ii) displays the globe with all countries and land
covered by water (which is land not covered by countries) on a
window, and (ii) enables interaction with the user.
3D Envelopes
- Breaking change: Construct_projected_boundary_2 in EnvelopeTraits_3
now uses std::variant instead of CGAL::Object.
- Passed the base class of CGAL::Env_plane_traits_3 as a template
parameter with a default value (being the 2D arrangement linear
traits). Similarly, passed the base class of
CGAL::Env_triangle_traits_3 as a template parameter with a default
value (being the 2D arrangement segment traits).
Combinatorial Maps and Generalized Maps
- Added the function insert_cell_1_between_two_cells_2() to the
GenericMap concept, which enables users to insert an edge between
two different faces in order to create faces with holes.
- Added new meshing criterion edge_distance, an upper bound for the
distance from the edge to the 1D feature.
- Breaking change: the concept MeshEdgeCriteria_3 was modified to
include the new meshing criterion edge_distance.
Quadtrees, Octrees, and Orthtrees
- Breaking change:
- Node splitting behavior and per-node data are now customizable
via the Traits class.
- Nodes are now stored as a property map, with properties of each
node accessed by index.
- Nearest neighbors functions only work for Orthtrees which
provide the necessary functionality.
CGAL and the Boost Graph Library (BGL)
- Added the function CGAL::remove_all_elements(), which removes
vertices, halfedges, and faces without collecting garbage and
without removing properties.
- Dynamic property maps can now have a default value.
- The class CGAL::Face_filtered_graph now supports patch IDs of any
type and not just faces_size_type. The only requirement is that the
type is hashable.
Polygon Mesh Processing
- Added functions
CGAL::Polygon_mesh_processing::region_growing_of_planes_on_faces()
and CGAL::Polygon_mesh_processing::detect_corners_of_regions(),
which enable partitioning a mesh into planar regions using the
region growing algorithm from the Shape Detection package.
- Added the functions
CGAL::Polygon_mesh_processing::remesh_planar_patches() and
CGAL::Polygon_mesh_processing::remesh_almost_planar_patches(), which
can be used to remesh patches of coplanar faces in a mesh.
- Added the function
CGAL::Polygon_mesh_processing::surface_Delaunay_remeshing(), which
can be used to remesh a surface triangle mesh using the Delaunay
refinement algorithm from the 3D Mesh Generation package.
CGAL::Polygon_mesh_processing::autorefine_triangle_soup(), which can
be used to refine a soup of triangles such that no pair of triangles
intersects in their interiors. Also added, the function
CGAL::Polygon_mesh_processing::autorefine() operating directly on a
triangle mesh and updating it using the aforementioned function on a
triangle soup.
- Added the class CGAL::Corefinement::Non_manifold_output_visitor,
which can be used in corefinement based functions to deal with
non-manifold outputs.
- Added the option to use a variable sizing field for
CGAL::Polygon_mesh_processing::isotropic_remeshing(), and a sizing
function based on a measure of local curvature for adaptive
remeshing.
- Added the function
CGAL::Polygon_mesh_processing::remove_almost_degenerate_faces(),
which can be used to remove badly shaped triangles faces in a mesh.
- Added the functions
CGAL::Polygon_mesh_processing::does_triangle_soup_self_intersect()
and
CGAL::Polygon_mesh_processing::triangle_soup_self_intersections() to
identify and report self-intersections in a triangle soup, similarly
to existing functions on triangle meshes.
CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()
which can be used to compute the mean and Gaussian curvatures, as
well as the principal curvature and directions.
- Added the function
CGAL::Polygon_mesh_processing::triangulate_polygons(), which allows
users to triangulate polygon soups.
CGAL::Polygon_mesh_processing::refine_mesh_at_isolevel() which can
be used to refine a polygon mesh along an isocurve.
- Added the function CGAL::Polygon_mesh_processing::add_bbox(), which
enables adding a tight or extended, triangulated or not, bounding
box to a face graph.
- Added a named parameter to
CGAL::Polygon_mesh_processing::smooth_shape() to disable the
scaling, which otherwise aims to compensate volume loss during
smoothing.
2D Triangulations
- Deprecated the overloads of functions
CGAL::Polygon_mesh_processing::triangulate_hole(),
CGAL::Polygon_mesh_processing::triangulate_and_refine_hole(), and
CGAL::Polygon_mesh_processing::triangulate_refine_and_fair_hole()
which have output iterators for vertices and faces as parameter.
They are replaced by overloads with two additional named parameters.
- Breaking change: the concept TriangulationTraits_2 now requires an
additional functor Compare_xy_2.
3D Triangulations
- Added three member functions vertices() to the class
CGAL::Triangulation_3. Each of them returns an array containing the
vertices of the given triangulation simplex.
dD Triangulations
- Breaking change: CGAL::TDS_full_cell_mirror_storage_policy is now
unsupported in dimension larger than 127.
- Breaking change: Inserting multiple unweighted points in the same
position now keeps the first one, instead of switching to the
latest. This only affects custom point types where not all points in
the same position are equivalent.
Tetrahedral Remeshing
- Added a sizing field as new parameter of
CGAL::tetrahedral_isotropic_remeshing(), which can be used to
perform non-uniform and adaptive remeshing.
- Breaking change: The template parameters of
CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3 have been
modified, reverting changes introduced in CGAL 5.6.
- Breaking change: The vertex base of
CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3 must now be a
model of the concept SimplicialMeshVertexBase_3 (and not only
TriangulationVertexBase_3).
3D Simplicial Mesh Data Structure
- Breaking change: The template parameters of
CGAL::Simplicial_mesh_cell_base_3 have been modified to enable
passing a geometric traits and a custom cell base class.
3D Mesh Generation
- Added two new named parameters to the named constructor
CGAL::create_labeled_image_mesh_domain() for automatic detection and
protection of 1D-curves that lie at the intersection of three or
more subdomains extracted from labeled images.
- Added CGAL::Sizing_field_with_aabb_tree, a geometry-aware sizing
field for feature edges in polyhedral domains.
- Added new meshing criterion edge_min_size to avoid subdividing sharp
edges that are shorter than a prescribed size bound.
- Added new meshing criteria facet_min_size and cell_min_size to
prevent Delaunay refinement from creating simplices smaller than a
prescribed bound.
- Deprecated usage of boost parameters in favor of function named
parameters.
- Breaking change: Removed the concept TriangleAccessor, the template
parameter TriangleAccessor, as well as the class Triangle_accessor.
These were no longer used for several releases.
- Breaking change: Removed the class templates
CGAL::Gray_image_mesh_domain_3, CGAL::Implicit_mesh_domain_3, and
CGAL::Labeled_image_mesh_domain_3, which were deprecated since
CGAL-4.13.
3D Surface Mesh Generation
- This package is deprecated and the package 3D Mesh Generation should
be used instead.
Surface Mesh Parameterization
- Breaking change: The method
CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3 now
requires the Eigen library.
- Breaking change: CGAL no longer ships its own version of OpenNL.
Surface Mesh
- Breaking change: The return type of
CGAL::Surface_mesh::property_map() has been changed to
std::optional.
3D Point Set
- Breaking change: The return type of
CGAL::Point_set_3::property_map() has been changed to std::optional.
Shape Detection
- Breaking change: Replaced all instances of boost::shared_ptr with
std::shared_ptr.
2D Straight Skeleton and Polygon Offsetting
- Breaking change: Replaced all instances of boost::shared_ptr with
std::shared_ptr.
- Breaking change: Replaced all instances of boost::optional with
std::optional.
See https://www.cgal.org/2023/06/13/cgal56-beta1/ for a
See https://www.cgal.org/2024/06/21/cgal60-beta1/ for a
complete list of changes.
The development of CGAL will then now on the future CGAL-6.0 (planned
for December 2023), with bug-fixes regularly backported to the branches
for CGAL-5.5.x and CGAL-5.6.x.
CGAL-6.0 will be the first release of CGAL requiring C++17 or later. It
will also support Qt6.
The CGAL project is a collaborative effort to develop a robust,
easy-to-use, and efficient C++ software library of geometric data
structures and algorithms, like

View File

@ -42,12 +42,12 @@ printf "Copy documentation to doc_html/ and doc_html_online/...\n"
[ -d "/srv/CGAL/www/${PUBLIC_RELEASE_NAME#CGAL-}/Manual" ] || mkdir -p "/srv/CGAL/www/${PUBLIC_RELEASE_NAME#CGAL-}/Manual"
cp "$PUBLIC_RELEASE_DIR"/*(.) "${RELEASE_CANDIDATES_DIR}/$PUBLIC_RELEASE_NAME"
files=("$MANUAL_TESTS_DIR/$INTERNAL_RELEASE"/output1/*)
files=("$MANUAL_TESTS_DIR/$INTERNAL_RELEASE"/output2/*)
if ((${#files[@]} == 0)); then
printf "ERROR: documentation files are missing\n"
error_code=1
else
rsync -a --exclude xml "$MANUAL_TESTS_DIR/$INTERNAL_RELEASE"/output1/* "$DEST_DIR/doc_html/"
rsync -a --exclude xml "$MANUAL_TESTS_DIR/$INTERNAL_RELEASE"/output2/* "$DEST_DIR/doc_html/"
pushd "$DEST_DIR/doc_html/Manual/search"
for i in g n c s i; do sed -i "s/..\/BGL$i/..\/BGL\/$i/g" *; done
popd

View File

@ -16,7 +16,7 @@ int main(int argc, char *argv[])
Polyhedron P1, P2;
std::ifstream ifs1((argc > 1) ? argv[1] : CGAL::data_file_path("meshes/cross_quad.off"));
ifs1 >> P1;
std::ifstream ifs2((argc > 1) ? argv[1] : CGAL::data_file_path("meshes/beam.off"));
std::ifstream ifs2((argc > 2) ? argv[2] : CGAL::data_file_path("meshes/beam.off"));
ifs2 >> P2;
// initialize nef from polyhedron

View File

@ -209,6 +209,7 @@ void polygon_mesh_to_nef_3(const PolygonMesh& P, SNC_structure& S, FaceIndexMap
PolygonMesh, SNC_structure,HalfedgeIndexMap> index_adder(P,himap);
for(vertex_descriptor pv : vertices(P) ) {
if (halfedge(pv, P) == boost::graph_traits<PolygonMesh>::null_halfedge()) continue; // skip isolated vertices
typename boost::property_traits<PMap>::reference npv = get(pmap,pv);
Vertex_handle nv = S.new_vertex();

View File

@ -6,7 +6,7 @@
\cgalConcept
The concept `Periodic_2DelaunayTriangulationTraits_2` is the first template parameter of the class
`Periodic_2_Delaunay_triangulation_2`. It refines the concepts
`CGAL::Periodic_2_Delaunay_triangulation_2`. It refines the concepts
`Periodic_2TriangulationTraits_2` and `DelaunayTriangulationTraits_2`.
It redefines the geometric objects, predicates and constructions to work with
point-offset pairs. In most cases the offsets will be (0,0) and the
@ -125,4 +125,3 @@ public:
/// @}
}; /* end Periodic_2DelaunayTriangulationTraits_2 */

View File

@ -6,7 +6,7 @@
\cgalConcept
The concept `Periodic_2TriangulationTraits_2` is the first template parameter of the classes
`Periodic_2_triangulation_2<Traits, Tds>`. This concept provides the types of
`CGAL::Periodic_2_triangulation_2<Traits, Tds>`. This concept provides the types of
the geometric primitives used in the triangulation and some function
object types for the required predicates on those primitives.
@ -296,4 +296,3 @@ public:
/// @}
}; /* end Periodic_2TriangulationTraits_2 */

View File

@ -20,7 +20,7 @@ functor the version without offsets.
\cgalHasModelsEnd
In addition to the requirements described for the traits class
RegularTriangulationTraits_3, the geometric traits class of a
`RegularTriangulationTraits_3`, the geometric traits class of a
periodic regular triangulation must fulfill the following
requirements.
@ -250,4 +250,3 @@ Construct_weighted_circumcenter_3 construct_weighted_circumcenter_3_object();
/// @}
}; /* end Periodic_3RegularTriangulationTraits_3 */

View File

@ -4,7 +4,7 @@
\cgalConcept
The concept `Periodic_3TriangulationTraits_3` is the first template parameter of the class
`Periodic_3_triangulation_3`. It refines the concept
`CGAL::Periodic_3_triangulation_3`. It refines the concept
`TriangulationTraits_3` from the \cgal 3D Triangulations.
It redefines the geometric objects, predicates and constructions to
work with point-offset pairs. In most cases the offsets will be
@ -258,4 +258,3 @@ Construct_tetrahedron_3 construct_tetrahedron_3_object();
/// @}
}; /* end Periodic_3TriangulationTraits_3 */

View File

@ -145,7 +145,7 @@ The class expects two template parameters.
bool remove(Vertex_handle v);
/*!
Removes the vertices in the iterator range `[firs, last)` from the triangulation.
Removes the vertices in the iterator range `[first, last)` from the triangulation.
\pre all vertices in `[first, last)` are vertices of the triangulation.
*/
template <class VertexRemoveIterator>

View File

@ -105,7 +105,12 @@ void simplify_range(HalfedgeRange& halfedge_range,
typedef CGAL::dynamic_halfedge_property_t<bool> Halfedge_bool_tag;
typedef typename boost::property_map<TriangleMesh, Halfedge_bool_tag>::type Range_halfedges;
Range_halfedges range_halfedges = get(Halfedge_bool_tag(), tm, false);
const bool all_hedges = (::CGAL::internal::exact_num_halfedges(tm)==halfedge_range.size());
Range_halfedges range_halfedges = get(Halfedge_bool_tag(), tm, all_hedges);
if (!all_hedges)
for(halfedge_descriptor h : halfedge_range)
put(range_halfedges, h, true);
CGAL_postcondition_code(const std::size_t initial_n = halfedge_range.size();)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -44,7 +44,7 @@ functions of the package are provided in Section \ref Ridges_3Examples.
For a detailed introduction to ridges and related topics, the reader
may consult
\cgalCite{cgal:hgygm-ttdpf-99},cgal:p-gd-01, as well as
\cgalCite{cgal:hgygm-ttdpf-99},\cgalCite{cgal:p-gd-01}, as well as
the following survey article \cgalCite{cgal:cp-ssulc-05}.
In the sequel, we just introduce the basic notions so as to explain
our algorithms. Consider a smooth embedded surface, and denote \f$ k_1\f$

View File

@ -13,6 +13,14 @@ exec > "$LOGFILE"
# Display commands as if using `set -o xtrace`, but to the stdout
trap 'echo "[$BASH_SOURCE:$LINENO] $BASH_COMMAND" >&1' DEBUG
# Report errxit errors on cerr (&2)
report_errexit() {
echo "errexit on line $(caller)" >&1
echo "errexit on line $(caller)" >&2
}
trap report_errexit ERR
# A helper error function that outputs both to stderr and stdout before
# aborting the script.
function error() {

View File

@ -31,10 +31,6 @@
namespace CGAL {
namespace Shape_detection {
// Forward declaration needed for automatic traits detection without
// including the deprecated header itself
template <typename Gt, typename IR, typename IPM, typename INM>
struct Shape_detection_traits;
namespace internal {
@ -43,9 +39,6 @@ struct Traits_base { typedef Traits type; };
template <typename Gt, typename IR, typename IPM, typename INM>
struct Traits_base<CGAL::Shape_detection::Efficient_RANSAC_traits<Gt,IR,IPM,INM> >
{ typedef Gt type; };
template <typename Gt, typename IR, typename IPM, typename INM>
struct Traits_base<CGAL::Shape_detection::Shape_detection_traits<Gt,IR,IPM,INM> >
{ typedef Gt type; };
template<class Traits>
class RANSAC_octree {

View File

@ -828,8 +828,8 @@ Triangulation_data_structure<Dim, Vb, Fcb>
delete_vertex(v);
delete_full_cell(s);
inf1->set_vertex(1, Vertex_handle());
inf1->set_vertex(1, Vertex_handle());
inf2->set_neighbor(1, Full_cell_handle());
inf2->set_vertex(1, Vertex_handle());
inf1->set_neighbor(1, Full_cell_handle());
inf2->set_neighbor(1, Full_cell_handle());
associate_vertex_with_full_cell(inf1, 0, star);
associate_vertex_with_full_cell(inf2, 0, v2);

View File

@ -23,8 +23,9 @@ if(TARGET CGAL::Eigen3_support)
create_single_source_cgal_program("test_torture.cpp")
create_single_source_cgal_program("test_insert_if_in_star.cpp")
create_single_source_cgal_program("simple_io_test.cpp")
create_single_source_cgal_program("issue_8347.cpp")
foreach(target test_triangulation test_delaunay test_regular test_tds
test_torture test_insert_if_in_star simple_io_test)
test_torture test_insert_if_in_star simple_io_test issue_8347)
target_link_libraries(${target} PUBLIC CGAL::Eigen3_support)
endforeach()

View File

@ -0,0 +1,40 @@
#include <iostream>
#include <CGAL/Epick_d.h>
#include <CGAL/Epeck_d.h>
#include <CGAL/Delaunay_triangulation.h>
typedef CGAL::Dynamic_dimension_tag Dim_tag;
//typedef CGAL::Dimension_tag<2> Dim_tag;
typedef CGAL::Epick_d< Dim_tag > Kernel;
typedef CGAL::Delaunay_triangulation<Kernel> Triangulation;
typedef typename Triangulation::Vertex_handle Vertex_handle;
typedef typename Triangulation::Point Point;
Point create_point(double x,double y) {
std::vector<double> c;
c.push_back(x);
c.push_back(y);
return Point(2,c.begin(),c.end());
}
int main() {
Triangulation T(2);
Point p1=create_point(2, 3);
Point p2=create_point(6, 3);
Point p3=create_point(0, 4);
Vertex_handle vh1=T.insert(p1);
T.insert(p2);
T.remove(vh1);
T.insert(p3);
std::cout << "Exit normally" << std::endl;
return 0;
}

View File

@ -4,7 +4,7 @@
\cgalConcept
The concept `DelaunayTriangulationTraits_3` is the first template parameter of the class
`Delaunay_triangulation_3`. It defines the geometric objects (points,
`CGAL::Delaunay_triangulation_3`. It defines the geometric objects (points,
segments...) forming the triangulation together with a few geometric
predicates and constructions on these objects.
@ -221,4 +221,3 @@ Construct_ray_3 construct_ray_3_object();
/// @}
}; /* end DelaunayTriangulationTraits_3 */

View File

@ -6,7 +6,7 @@
\cgalRefines{SpatialSortingTraits_3}
The concept `TriangulationTraits_3` is the first template parameter of the class
`Triangulation_3`. It defines the geometric objects (points, segments,
`CGAL::Triangulation_3`. It defines the geometric objects (points, segments,
triangles and tetrahedra) forming the triangulation together with a few
geometric predicates and constructions on these objects: lexicographical
comparison, orientation in case of coplanar points and orientation in space.
@ -188,4 +188,3 @@ Orientation_3 orientation_3_object();
/// @}
}; /* end TriangulationTraits_3 */

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB