Merge remote-tracking branch 'cgal/master' into CGAL-CMake_testsuite-maxGimeno

This commit is contained in:
Maxime Gimeno 2020-08-21 14:40:58 +02:00
commit e2eca0150b
227 changed files with 55990 additions and 5197 deletions

View File

@ -1,5 +1,5 @@
language: cpp
dist: xenial
dist: bionic
sudo: required
git:
depth: 3
@ -58,7 +58,7 @@ install:
- echo "$PWD"
- if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ] && [ "$PACKAGE" != CHECK ]; then DO_IGNORE=FALSE; for ARG in $(echo "$PACKAGE");do if [ "$ARG" = "Maintenance" ]; then continue; fi; . $PWD/.travis/test_package.sh "$PWD" "$ARG"; echo "DO_IGNORE is $DO_IGNORE"; if [ "$DO_IGNORE" = "FALSE" ]; then break; fi; done; if [ "$DO_IGNORE" = "TRUE" ]; then travis_terminate 0; fi;fi
- /usr/bin/time -f 'Spend time of %C -- %E (real)' bash .travis/install.sh
- export CXX=clang++ CC=clang;
- export CXX=clang++-10 CC=clang-10;
before_script:
- wget -O doxygen_exe https://cgal.geometryfactory.com/~mgimeno/doxygen_exe
- sudo mv doxygen_exe /usr/bin/doxygen

View File

@ -11,7 +11,7 @@ function mytime {
function build_examples {
mkdir -p build-travis
cd build-travis
mytime cmake -DCGAL_DIR="/usr/local/lib/cmake/CGAL" -DCMAKE_CXX_FLAGS="${CXX_FLAGS}" -DCGAL_BUILD_THREE_DOC=TRUE ..
mytime cmake -DCGAL_DIR="/usr/local/lib/cmake/CGAL" -DCMAKE_CXX_FLAGS="${CXX_FLAGS}" ..
mytime make -j2 VERBOSE=1
}

View File

@ -2,14 +2,15 @@
[ -n "$CGAL_DEBUG_TRAVIS" ] && set -x
DONE=0
sudo add-apt-repository ppa:mikhailnov/pulseeffects -y
sudo apt-get update
while [ $DONE = 0 ]
do
DONE=1 && sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install clang zsh \
flex bison cmake graphviz libgmp-dev libmpfr-dev libmpfi-dev zlib1g-dev libeigen3-dev libboost-dev \
libboost-system-dev libboost-program-options-dev libboost-thread-dev libboost-iostreams-dev \
DONE=1 && sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install clang-10 zsh \
flex bison cmake graphviz libgmp-dev libmpfr-dev libmpfi-dev zlib1g-dev libeigen3-dev \
qtbase5-dev libqt5sql5-sqlite libqt5opengl5-dev qtscript5-dev libqt5svg5-dev qttools5-dev qttools5-dev-tools qml-module-qtgraphicaleffects libopencv-dev mesa-common-dev libmetis-dev libglu1-mesa-dev \
|| DONE=0 && sudo apt-get update
libboost1.72-dev || DONE=0 && sudo apt-get update
done
exit 0

View File

@ -1,5 +1,5 @@
language: cpp
dist: xenial
dist: bionic
sudo: required
git:
depth: 3
@ -12,7 +12,7 @@ install:
- echo "$PWD"
- if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ] && [ "$PACKAGE" != CHECK ]; then DO_IGNORE=FALSE; for ARG in $(echo "$PACKAGE");do if [ "$ARG" = "Maintenance" ]; then continue; fi; . $PWD/.travis/test_package.sh "$PWD" "$ARG"; echo "DO_IGNORE is $DO_IGNORE"; if [ "$DO_IGNORE" = "FALSE" ]; then break; fi; done; if [ "$DO_IGNORE" = "TRUE" ]; then travis_terminate 0; fi;fi
- /usr/bin/time -f 'Spend time of %C -- %E (real)' bash .travis/install.sh
- export CXX=clang++ CC=clang;
- export CXX=clang++-10 CC=clang-10;
before_script:
- wget -O doxygen_exe https://cgal.geometryfactory.com/~mgimeno/doxygen_exe
- sudo mv doxygen_exe /usr/bin/doxygen

View File

@ -126,7 +126,7 @@ public:
/*!
Id type:
- `boost::graph_traits<HalfedgeGraph>::%edge_descriptor` if `OneHalfedgeGraphPerTree` is `Tag_true`
- `std::pair<boost::graph_traits<HalfedgeGraph>::edge_descriptor, const HalfedgeGraph*>` if `OneHalfedgeGraphPerTree` is `Tag_false`
- `std::pair<boost::graph_traits<HalfedgeGraph>::%edge_descriptor, const HalfedgeGraph*>` if `OneHalfedgeGraphPerTree` is `Tag_false`
*/
unspecified_type Id;
/// @}
@ -202,4 +202,3 @@ public:
#include <CGAL/enable_warnings.h>
#endif // CGAL_AABB_HALFEDGE_GRAPH_SEGMENT_PRIMITIVE_H

View File

@ -171,9 +171,11 @@ class AABB_tree;
/// \sa `AABBPrimitiveWithSharedData`
template<typename GeomTraits, typename AABBPrimitive, typename BboxMap = Default>
class AABB_traits:
public internal::AABB_tree::AABB_traits_base<AABBPrimitive>,
class AABB_traits
#ifndef DOXYGEN_RUNNING
: public internal::AABB_tree::AABB_traits_base<AABBPrimitive>,
public internal::AABB_tree::AABB_traits_base_2<GeomTraits>
#endif
{
typedef typename CGAL::Object Object;
public:

View File

@ -1,10 +1,10 @@
#include <iostream>
#include <fstream>
#include <algorithm>
#include <array>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Advancing_front_surface_reconstruction.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/array.h>
#include <CGAL/disable_warnings.h>
typedef std::array<std::size_t,3> Facet;

View File

@ -653,7 +653,7 @@ void _Bezier_cache<NtTraits>::_self_intersection_params
// II: Y(t) - Y(s) / (t - s) = 0
//
Integer *coeffs;
int i, k;
int i;
// Consruct the bivariate polynomial that corresponds to Equation I.
// Note that we represent a bivariate polynomial as a vector of univariate
@ -667,12 +667,11 @@ void _Bezier_cache<NtTraits>::_self_intersection_params
coeffs = new Integer [degX];
for (i = 0; i < degX; i++)
{
for (k = i + 1; k < degX; k++)
coeffs[k - i - 1] = nt_traits.get_coefficient (polyX, k);
coeffs[i] = nt_traits.get_coefficient(polyX, i + 1);
coeffsX_st[i] = nt_traits.construct_polynomial (coeffs, degX - i - 1);
}
for (i = 0; i < degX; i++)
coeffsX_st[degX - i - 1] =
nt_traits.construct_polynomial(coeffs + i, degX - i - 1);
delete[] coeffs;
@ -685,12 +684,11 @@ void _Bezier_cache<NtTraits>::_self_intersection_params
coeffs = new Integer [degY];
for (i = 0; i < degY; i++)
{
for (k = i + 1; k < degY; k++)
coeffs[k - i - 1] = nt_traits.get_coefficient (polyY, k);
coeffs[i] = nt_traits.get_coefficient(polyY, i + 1);
coeffsY_st[i] = nt_traits.construct_polynomial (coeffs, degY - i - 1);
}
for (i = 0; i < degY; i++)
coeffsY_st[degY - i - 1] =
nt_traits.construct_polynomial(coeffs + i, degY - i - 1);
delete[] coeffs;

View File

@ -1641,17 +1641,43 @@ void _Bezier_point_2_rep<RatKer, AlgKer, NtTrt, BndTrt>::_make_exact
const Algebraic t_min = nt_traits.convert (orig2.point_bound().t_min);
const Algebraic t_max = nt_traits.convert (orig2.point_bound().t_max);
bool self_intersecting = (org_it1->curve().id() == org_it2->curve().id());
for (intr_it = intr_list.begin(); intr_it != intr_list.end(); ++intr_it)
{
if (CGAL::compare (intr_it->s, s_min) != SMALLER &&
CGAL::compare (intr_it->s, s_max) != LARGER &&
CGAL::compare (intr_it->t, t_min) != SMALLER &&
CGAL::compare (intr_it->t, t_max) != LARGER)
auto in_bounding_interval =
[](const auto& s_, const auto& s_min_, const auto& s_max_) -> bool {
return CGAL::compare(s_, s_min_) != SMALLER &&
CGAL::compare(s_, s_max_) != LARGER;
};
bool st_in_st_range = in_bounding_interval(intr_it->s, s_min, s_max) &&
in_bounding_interval(intr_it->t, t_min, t_max);
bool ts_in_st_range = false;
if (st_in_st_range)
{
// Update the originators.
orig1.set_parameter(intr_it->s);
orig2.set_parameter(intr_it->t);
}
else if (self_intersecting)
{
// check whether s is in t range, and t is in s range
// s and t can be interchanged in case of self intersections
ts_in_st_range = in_bounding_interval(intr_it->t, s_min, s_max) &&
in_bounding_interval(intr_it->s, t_min, t_max);
if (ts_in_st_range)
{
// Update the originators.
orig1.set_parameter(intr_it->t);
orig2.set_parameter(intr_it->s);
}
}
if (st_in_st_range || ts_in_st_range)
{
// Set the exact point coordinates.
p_alg_x = new Algebraic (intr_it->x);
p_alg_y = new Algebraic (intr_it->y);

View File

@ -1139,10 +1139,11 @@ _Bezier_x_monotone_2<RatKer, AlgKer, NtTrt, BndTrt>::compare_to_left
Originator_iterator org = p.get_originator(_curve, _xid);
CGAL_assertion(org != p.originators_end());
CGAL_assertion(_inc_to_right != cv._inc_to_right);
if (org->point_bound().type == Bez_point_bound::VERTICAL_TANGENCY_PT)
{
CGAL_assertion(_inc_to_right != cv._inc_to_right);
if (! p.is_exact())
{
// Comparison based on the control polygon of the bounded vertical

View File

@ -27,18 +27,6 @@ EXAMPLE_PATH = ${CGAL_Surface_mesh_skeletonization_EXAMPLE_DIR} \
ALIASES += "bgllink{1}=<a href=\"http://www.boost.org/libs/graph/doc/\1.html\"><code>\1</code></a>"
# macros to be used inside the code
ALIASES += "cgalNamedParamsBegin=<dl class=\"params\"><dt>Named Parameters</dt><dd> <table class=\"params\">"
ALIASES += "cgalNamedParamsEnd=</table> </dd> </dl>"
ALIASES += "cgalParamBegin{1}=<tr><td class=\"paramname\">\ref BGL_\1 \"\1\"</td><td>"
ALIASES += "cgalParamEnd=</td></tr>"
#macros for NamedParameters.txt
ALIASES += "cgalNPTableBegin=<dl class=\"params\"><dt></dt><dd> <table class=\"params\">"
ALIASES += "cgalNPTableEnd=</table> </dd> </dl>"
ALIASES += "cgalNPBegin{1}=<tr><td class=\"paramname\">\1 </td><td>"
ALIASES += "cgalNPEnd=</td></tr>"
EXTRACT_ALL=NO
HIDE_UNDOC_MEMBERS = YES
HIDE_UNDOC_CLASSES = YES

View File

@ -1,8 +1,8 @@
/*!
\defgroup bgl_namedparameters BGL Named Parameters
\defgroup bgl_namedparameters Named Parameters
\ingroup PkgBGLRef
The algorithms of the \sc{Bgl} often have many parameters with default
The algorithms of the Boost Graph Library (\sc{Bgl}) often have many parameters with default
values that are appropriate for most cases. In general, when no
special treatment is applied, the values of such parameters are passed
as a sequence. Deviating from the default for a certain parameter
@ -20,200 +20,26 @@ dijkstra_shortest_paths(g, s, predecessor_map(&p[0]).distance_map(&d[0]));
In the \sc{Bgl} manual, this is called
<a href="https://www.boost.org/libs/graph/doc/bgl_named_params.html">named parameters</a>.
The named parameters in the example use the tags `predecessor_map` and `distance_map`
and they are concatenated with the dot operator.<BR>
The named parameters in the snippet use the tags `predecessor_map` and `distance_map`
and they are concatenated using the dot operator.<BR>
In the following, we assume that `PolygonMesh` is a model of the concept `FaceGraph`.
Note that for some functions, the type might be more specific:
A similar mechanism was introduced in \cgal, with the small difference that the named parameters
tag live in the `CGAL::parameters::` namespace and `CGAL::parameters::all_default()` can be used to indicate
that default values of optional named parameters must be used.
As in the \sc{BGL}, named parameters in \cgal are also concatenated using
the dot operator, and a typical usage is thus:
Here is the list of the named parameters available in this package:
\code {.cpp}
Graph g1, g2;
Vertex_point_map_2 vpm_2; // an hypothetical custom property map assigning a Point to the vertices of g2
\cgalNPTableBegin
\cgalNPBegin{vertex_point_map} \anchor BGL_vertex_point_map
is the property map with the points associated to the vertices of the polygon mesh.\n
<b>Type:</b> a class model of `ReadablePropertyMap` with
`boost::graph_traits<PolygonMesh>::%vertex_descriptor` as key type and
a \cgal point type as value type. \n
<b>Default:</b> \code boost::get(CGAL::vertex_point, pmesh) \endcode
\cgalNPEnd
\cgalNPBegin{vertex_index_map} \anchor BGL_vertex_index_map
is the property map associating a unique index to each vertex of a polygon mesh `g`,
between `0` and `num_vertices(g)-1`.
If this parameter is not passed, internal machinery will create and initialize a vertex index
property map, either using the internal property map if it exists or using an external map. The latter
might result in - slightly - worsened performance in case of non-constant complexity for index access.\n
<b>Type:</b> a class model of `ReadablePropertyMap` with
`boost::graph_traits<PolygonMesh>::%vertex_descriptor` as key type and the value type
\code typename boost::property_traits<typename boost::property_map<PolygonMesh, CGAL::vertex_index_t>::type>::value_type \endcode
<b>Default:</b> an initialized vertex index property map
\cgalNPEnd
\cgalNPBegin{halfedge_index_map} \anchor BGL_halfedge_index_map
is the property map associating a unique index to each halfedge of a polygon mesh,
between `0` and `num_halfedges(g)-1`.
If this parameter is not passed, internal machinery will create and initialize a halfedge index
property map, either using the internal property map if it exists or using an external map. The latter
might result in - slightly - worsened performance in case of non-constant complexity for index access.\n
<b>Type:</b> a class model of `ReadablePropertyMap` with
`boost::graph_traits<PolygonMesh>::%halfedge_descriptor` as key type and the value type:
\code typename boost::property_traits<typename boost::property_map<PolygonMesh, CGAL::halfedge_index_t>::type>::value_type \endcode
<b>Default:</b> an initialized halfedge index property map
\cgalNPEnd
\cgalNPBegin{edge_index_map} \anchor BGL_edge_index_map
is the property map associating a unique index to each edge of a polygon mesh,
between `0` and `num_edges(g)-1`.
If this parameter is not passed, internal machinery will create and initialize a edge index
property map, either using the internal property map if it exists or using an external map. The latter
might result in - slightly - worsened performance in case of non-constant complexity for index access.\n
<b>Type:</b> a class model of `ReadablePropertyMap` with
`boost::graph_traits<PolygonMesh>::%edge_descriptor` as key type and the value type:
\code typename boost::property_traits<typename boost::property_map<PolygonMesh, CGAL::edge_index_t>::type>::value_type \endcode
<b>Default:</b> an initialized edge index property map
\cgalNPEnd
\cgalNPBegin{face_index_map} \anchor BGL_face_index_map
is the property map associating a unique index to each face of a polygon mesh,
between `0` and `num_faces(g)-1`.
If this parameter is not passed, internal machinery will create and initialize a face index
property map, either using the internal property map if it exists or using an external map. The latter
might result in - slightly - worsened performance in case of non-constant complexity for index access.\n
<b>Type:</b> a class model of `ReadablePropertyMap` with
`boost::graph_traits<PolygonMesh>::%face_descriptor` as key type and the value type:
\code typename boost::property_traits<typename boost::property_map<PolygonMesh, CGAL::face_index_t>::type>::value_type \endcode
<b>Default:</b> an initialized face index property map
\cgalNPEnd
\cgalNPBegin{edge_is_constrained_map} \anchor BGL_edge_is_constrained_map
is the property map containing information about edges of the input polygon mesh
being marked or not.\n
<b>Type:</b> a class model of `ReadWritePropertyMap` with
`boost::graph_traits<PolygonMesh>::%edge_descriptor` as key type and
`bool` as value type. It should be default constructible.\n
<b>Default:</b> a default property map where no edge is constrained
\cgalNPEnd
\cgalNPBegin{use_binary_mode} \anchor BGL_use_binary_mode
is a Boolean indicating whether the binary mode or the ASCII mode should be used
when writing data into a stream.\n
<b>Type:</b> `bool`\n
<b>Default:</b> Function specific.
\cgalNPEnd
\cgalNPBegin{METIS_options} \anchor BGL_METIS_options
is a parameter used in `partition_graph()` and `partition_dual_graph()`
to pass options to the METIS graph partitioner. The many options of METIS
are not described here. Instead, users should refer to METIS'
<a href="http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf">documentation</a>.\n
<b>Type:</b> an array of size `METIS_NOPTIONS` with value type `idx_t`
(an integer type defined by METIS). \n
<b>Default:</b> an array of size `METIS_NOPTIONS` with value type `idx_t`,
initialized using the function `METIS_SetDefaultOptions()`.
\cgalNPEnd
\cgalNPBegin{vertex_partition_id_map} \anchor BGL_vertex_partition_id_map
is the property map storing for each vertex of the mesh the id of the subpart
of the partition that has been assigned to this vertex.\n
<b>Type:</b> a class model of `ReadWritePropertyMap` with
`boost::graph_traits<PolygonMesh>::%vertex_descriptor` as key type and
`int` as value type. \n
<b>Default:</b> None: this property map is used to store the partition IDs of the vertices
as result of a partition algorithm; if it is not provided, this information is
simply inaccessible.
\cgalNPEnd
\cgalNPBegin{face_partition_id_map} \anchor BGL_face_partition_id_map
is the property map storing for each face of the mesh the id of the subpart
of the partition that has been assigned to this face.\n
<b>Type:</b> a class model of `ReadWritePropertyMap` with
`boost::graph_traits<PolygonMesh>::%face_descriptor` as key type and
`int` as value type. \n
<b>Default:</b> None: this property map is used to store the partition IDs of the faces
as result of a partition algorithm; if it is not provided, this information is
simply inaccessible.
\cgalNPEnd
\cgalNPBegin{vertex_to_vertex_output_iterator} \anchor BGL_vertex_to_vertex_output_iterator
is a model of `OutputIterator` accepting `std::pair<vertex_descriptor, vertex_descriptor>`
A typical use case is mapping the vertices from a source mesh to its copy's after a `copy_face_graph()`
operation.\n
<b>Type:</b>a class model of `OutputIterator` accepting
`std::pair<`boost::graph_traits<PolygonMesh>::%vertex_descriptor, `boost::graph_traits<PolygonMesh>::%vertex_descriptor>`.\n
<b>Default:</b> Emptyset_iterator
\cgalNPEnd
\cgalNPBegin{halfedge_to_halfedge_output_iterator} \anchor BGL_halfedge_to_halfedge_output_iterator
is a model of `OutputIterator` accepting `std::pair<halfedge_descriptor, halfedge_descriptor>`
A typical use case is mapping the halfedges from a source mesh to its copy's after a `copy_face_graph()`
operation.\n
<b>Type:</b>a class model of `OutputIterator` accepting
`std::pair<`boost::graph_traits<PolygonMesh>::%halfedge_descriptor, `boost::graph_traits<PolygonMesh>::%halfedge_descriptor>`.\n
<b>Default:</b> Emptyset_iterator
\cgalNPEnd
\cgalNPBegin{face_to_face_output_iterator} \anchor BGL_face_to_face_output_iterator
is a model of `OutputIterator` accepting `std::pair<face_descriptor, face_descriptor>`
A typical use case is mapping the faces from a source mesh to its copy's after a `copy_face_graph()`
operation.\n
<b>Type:</b>a class model of `OutputIterator` accepting
`std::pair<`boost::graph_traits<PolygonMesh>::%face_descriptor, `boost::graph_traits<PolygonMesh>::%face_descriptor>`.\n
<b>Default:</b> Emptyset_iterator
\cgalNPEnd
\cgalNPBegin{vertex_to_vertex_map} \anchor BGL_vertex_to_vertex_map
is a property map storing for each vertex of a source mesh the corresponding vertex of another mesh.\n
A typical use case is mapping the vertices from a source mesh to its copy's after a `copy_face_graph()`
operation.\n
<b>Type:</b>a class model of `ReadWritePropertyMap` with
`boost::graph_traits<PolygonMesh1>::%vertex_descriptor` as key type and
`boost::graph_traits<PolygonMesh2>::%vertex_descriptor` as value type.\n
<b>Default:</b> None.
\cgalNPEnd
\cgalNPBegin{halfedge_to_halfedge_map} \anchor BGL_halfedge_to_halfedge_map
is a property map storing for each halfedge of a source mesh the corresponding halfedge of another mesh.\n
A typical use case is mapping the vertices from a source mesh to its copy's after a `copy_face_graph()`
operation.\n
<b>Type:</b>a class model of `ReadWritePropertyMap` with
`boost::graph_traits<PolygonMesh1>::%halfedge_descriptor` as key type and
`boost::graph_traits<PolygonMesh2>::%halfedge_descriptor` as value type.\n
<b>Default:</b> None.
\cgalNPEnd
\cgalNPBegin{face_to_face_map} \anchor BGL_face_to_face_map
is a property map storing for each face of a source mesh the corresponding face of another mesh.\n
A typical use case is mapping the vertices from a source mesh to its copy's after a `copy_face_graph()`
operation.\n
<b>Type:</b>a class model of `ReadWritePropertyMap` with
`boost::graph_traits<PolygonMesh1>::%face_descriptor` as key type and
`boost::graph_traits<PolygonMesh2>::%face_descriptor` as value type.\n
<b>Default:</b> None.
\cgalNPEnd
\cgalNPBegin{implementation_tag} \anchor BGL_implementation_tag
tag used to select the implementation to be used among an algorithm-specific list.\n
<b>Type:</b>a tag class\n
<b>Default:</b> algorithm-specific.
\cgalNPEnd
\cgalNPBegin{prevent_unselection} \anchor BGL_prevent_unselection
Boolean used to indicate if selection can be only extended or if it can also be shrinked.\n
<b>Type:</b> `bool`\n
<b>Default:</b> `false`.
\cgalNPEnd
\cgalNPBegin{geom_traits} \anchor BGL_geom_traits
is the geometric traits instance used.\n
<b>Type:</b> a Geometric traits class.\n
<b>Default</b>:
\code typename CGAL::Kernel_traits<
typename boost::property_traits<
typename boost::property_map<FaceGraph, CGAL::vertex_point_t>::type>::value_type>::Kernel \endcode
\cgalNPEnd
\cgalNPTableEnd
// without any named parameter (default values are used)
CGAL::copy_face_graph(g1, g2);
// specifying named parameters for the second graph
CGAL::copy_face_graph(g1, g2,
CGAL::parameters::all_default(),
CGAL::parameters::vertex_point_map(vpm_2));
\endcode
*/
˛

View File

@ -56,18 +56,18 @@ public:
/*! The underlying primal type. */
typedef Primal_ Primal;
/*! Construct a Dual from a given primal. */
/*! constructs a Dual from a given primal. */
Dual(const Primal& primal)
: primal_(primal) {}
/*! Returns the underlying primal. */
/*! returns the underlying primal. */
const Primal& primal() const
{ return primal_; }
};
/*!
Construct a `Dual` from a given `primal`.
constructs a `Dual` from a given `primal`.
\relates CGAL::Dual
*/
template<typename Primal>

View File

@ -113,22 +113,44 @@ struct Face_filtered_graph
* \tparam FacePatchIndexRange a model of `ConstRange` with `boost::property_traits<FacePatchIndexMap>::%value_type` as value type.
* \tparam NamedParameters a sequence of named parameters
*
* \param graph the underlying graph.
* \param face_patch_index_map the property_map that assigns a patch index to each face, with
`face_descriptor` as key type and `boost::graph_traits<Graph>::%faces_size_type` as value type.
* \param selected_face_patch_indices a range of the face patch indices to select.
* \param np optional sequence of named parameters among the ones listed below
* \param graph the underlying graph
* \param face_patch_index_map the property_map that assigns a patch index to each face
* \param selected_face_patch_indices a range of the face patch indices to select
* \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
*
* \cgalNamedParamsBegin
* \cgalParamBegin{face_index_map}
* a property map containing for each face of `graph` a unique index between `0` and `num_faces(graph)-1`
* \cgalParamEnd
* \cgalParamBegin{vertex_index_map}
* a property map containing for each vertex of `graph` a unique index between `0` and `num_vertices(graph)-1`
* \cgalParamEnd
* \cgalParamBegin{halfedge_index_map}
* a property map containing for each halfedge of `graph` a unique index between `0` and `num_halfedges(graph)-1`
* \cgalParamEnd
* \cgalParamNBegin{vertex_index_map}
* \cgalParamDescription{a property map associating to each vertex of `graph` a unique index between `0` and `num_vertices(graph) - 1`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<Graph>::%vertex_descriptor`
* as key type and `std::size_t` as value type}
* \cgalParamDefault{an automatically indexed internal map}
* \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
* a face index property map, either using the internal property map if it exists
* or using an external map. The latter might result in - slightly - worsened performance
* in case of non-constant complexity for index access.}
* \cgalParamNEnd
*
* \cgalParamNBegin{halfedge_index_map}
* \cgalParamDescription{a property map associating to each halfedge of `graph` a unique index between `0` and `num_halfedges(graph) - 1`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<Graph>::%halfedge_descriptor`
* as key type and `std::size_t` as value type}
* \cgalParamDefault{an automatically indexed internal map}
* \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
* a face index property map, either using the internal property map if it exists
* or using an external map. The latter might result in - slightly - worsened performance
* in case of non-constant complexity for index access.}
* \cgalParamNEnd
*
* \cgalParamNBegin{face_index_map}
* \cgalParamDescription{a property map associating to each face of `graph` a unique index between `0` and `num_faces(graph) - 1`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<Graph>::%face_descriptor`
* as key type and `std::size_t` as value type}
* \cgalParamDefault{an automatically indexed internal map}
* \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
* a face index property map, either using the internal property map if it exists
* or using an external map. The latter might result in - slightly - worsened performance
* in case of non-constant complexity for index access.}
* \cgalParamNEnd
* \cgalNamedParamsEnd
*/
template <typename FacePatchIndexMap, class FacePatchIndexRange, class CGAL_BGL_NP_TEMPLATE_PARAMETERS>
@ -172,23 +194,45 @@ struct Face_filtered_graph
`face_descriptor` as key type and
`graph_traits<Graph>::%faces_size_type` as value type.
* \tparam NamedParameters a sequence of named parameters
*
* \param graph the underlying graph.
* \param face_patch_index_map the property_map that assigns a patch index to each face, with
`face_descriptor` as key type and
`graph_traits<Graph>::%faces_size_type` as value type.
* \param selected_face_patch_index the index of the face patch selected.
* \param np optional sequence of named parameters among the ones listed below
* \param face_patch_index_map the property_map that assigns a patch index to each face
* \param selected_face_patch_index the index of the face patch selected
* \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
*
* \cgalNamedParamsBegin
* \cgalParamBegin{face_index_map}
* a property map containing for each face of `graph` a unique index between `0` and `num_faces(graph)-1`
* \cgalParamEnd
* \cgalParamBegin{vertex_index_map}
* a property map containing for each vertex of `graph` a unique index between `0` and `num_vertices(graph)-1`
* \cgalParamEnd
* \cgalParamBegin{halfedge_index_map}
* a property map containing for each halfedge of `graph` a unique index between `0` and `num_halfedges(graph)-1`
* \cgalParamEnd
* \cgalParamNBegin{vertex_index_map}
* \cgalParamDescription{a property map associating to each vertex of `graph` a unique index between `0` and `num_vertices(graph) - 1`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<Graph>::%vertex_descriptor`
* as key type and `std::size_t` as value type}
* \cgalParamDefault{an automatically indexed internal map}
* \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
* a face index property map, either using the internal property map if it exists
* or using an external map. The latter might result in - slightly - worsened performance
* in case of non-constant complexity for index access.}
* \cgalParamNEnd
*
* \cgalParamNBegin{halfedge_index_map}
* \cgalParamDescription{a property map associating to each halfedge of `graph` a unique index between `0` and `num_halfedges(graph) - 1`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<Graph>::%halfedge_descriptor`
* as key type and `std::size_t` as value type}
* \cgalParamDefault{an automatically indexed internal map}
* \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
* a face index property map, either using the internal property map if it exists
* or using an external map. The latter might result in - slightly - worsened performance
* in case of non-constant complexity for index access.}
* \cgalParamNEnd
*
* \cgalParamNBegin{face_index_map}
* \cgalParamDescription{a property map associating to each face of `graph` a unique index between `0` and `num_faces(graph) - 1`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<Graph>::%face_descriptor`
* as key type and `std::size_t` as value type}
* \cgalParamDefault{an automatically indexed internal map}
* \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
* a face index property map, either using the internal property map if it exists
* or using an external map. The latter might result in - slightly - worsened performance
* in case of non-constant complexity for index access.}
* \cgalParamNEnd
* \cgalNamedParamsEnd
*/
template <typename FacePatchIndexMap, class CGAL_BGL_NP_TEMPLATE_PARAMETERS>
@ -221,20 +265,44 @@ struct Face_filtered_graph
*
* \tparam FaceRange a model of `ConstRange` with `face_descriptor` as value type.
* \tparam NamedParameters a sequence of named parameters
* \param graph the graph containing the wanted patch.
* \param selected_faces the set of selected faces.
* \param np optional sequence of named parameters among the ones listed below
*
* \param graph the graph containing the wanted patch
* \param selected_faces the set of selected faces
* \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
*
* \cgalNamedParamsBegin
* \cgalParamBegin{face_index_map}
* a property map containing an index for each face initialized from 0 to `num_vertices(graph)`
* \cgalParamEnd
* \cgalParamBegin{vertex_index_map}
* a property map containing an index for each vertex initialized 0 to `num_vertices(graph)`
* \cgalParamEnd
* \cgalParamBegin{halfedge_index_map}
* a property map containing an index for each halfedge initialized 0 to `num_halfedges(graph)`
* \cgalParamEnd
* \cgalParamNBegin{vertex_index_map}
* \cgalParamDescription{a property map associating to each vertex of `graph` a unique index between `0` and `num_vertices(graph) - 1`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<Graph>::%vertex_descriptor`
* as key type and `std::size_t` as value type}
* \cgalParamDefault{an automatically indexed internal map}
* \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
* a face index property map, either using the internal property map if it exists
* or using an external map. The latter might result in - slightly - worsened performance
* in case of non-constant complexity for index access.}
* \cgalParamNEnd
*
* \cgalParamNBegin{halfedge_index_map}
* \cgalParamDescription{a property map associating to each halfedge of `graph` a unique index between `0` and `num_halfedges(graph) - 1`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<Graph>::%halfedge_descriptor`
* as key type and `std::size_t` as value type}
* \cgalParamDefault{an automatically indexed internal map}
* \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
* a face index property map, either using the internal property map if it exists
* or using an external map. The latter might result in - slightly - worsened performance
* in case of non-constant complexity for index access.}
* \cgalParamNEnd
*
* \cgalParamNBegin{face_index_map}
* \cgalParamDescription{a property map associating to each face of `graph` a unique index between `0` and `num_faces(graph) - 1`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<Graph>::%face_descriptor`
* as key type and `std::size_t` as value type}
* \cgalParamDefault{an automatically indexed internal map}
* \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
* a face index property map, either using the internal property map if it exists
* or using an external map. The latter might result in - slightly - worsened performance
* in case of non-constant complexity for index access.}
* \cgalParamNEnd
* \cgalNamedParamsEnd
*/
template <typename FaceRange, class CGAL_BGL_NP_TEMPLATE_PARAMETERS>

View File

@ -129,35 +129,56 @@ void partition_dual_graph(const TriangleMesh& tm, int nparts,
/// \ingroup PkgBGLPartition
///
/// Computes a partition of the input triangular mesh into `nparts` parts,
/// computes a partition of the input triangular mesh into `nparts` parts,
/// based on the mesh's dual graph. The resulting partition is stored in the vertex and/or face
/// property maps that are passed as parameters using \ref bgl_namedparameters "Named Parameters".
///
/// \param tm a triangle mesh
/// \param nparts the number of parts in the final partition
/// \param np optional \ref bgl_namedparameters "Named Parameters" described below
/// \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
///
/// \tparam TriangleMesh is a model of the `FaceListGraph` concept.
/// \tparam TriangleMesh is a model of the `FaceListGraph` concept
/// \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
///
/// \cgalNamedParamsBegin
/// \cgalParamBegin{vertex_index_map}
/// is a property map containing for each vertex of `tm` a unique index between `0` and `num_vertices(tm)-1`.
/// \cgalParamEnd
/// \cgalParamBegin{METIS_options}
/// is a parameter used in to pass options to the METIS mesh
/// partitioner. The many options of METIS are not described here. Instead, users
/// should refer to the <a href="http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf">documentation</a>
/// of METIS directly.
/// \cgalParamEnd
/// \cgalParamBegin{vertex_partition_id_map}
/// is a property map that contains (after the function has been run)
/// the ID of the subpart for each vertex of `tm`.
/// \cgalParamEnd
/// \cgalParamBegin{face_partition_id_map}
/// is a property map that contains (after the function has been run)
/// the ID of the subpart for each face of `tm`.
/// \cgalParamEnd
/// \cgalParamNBegin{vertex_index_map}
/// \cgalParamDescription{a property map associating to each vertex of `tm` a unique index between `0` and `num_vertices(tm) - 1`}
/// \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<TriangleMesh>::%vertex_descriptor`
/// as key type and `std::size_t` as value type}
/// \cgalParamDefault{an automatically indexed internal map}
/// \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
/// a face index property map, either using the internal property map if it exists
/// or using an external map. The latter might result in - slightly - worsened performance
/// in case of non-constant complexity for index access.}
/// \cgalParamNEnd
///
/// \cgalParamNBegin{METIS_options}
/// \cgalParamDescription{a parameter used in to pass options to the METIS mesh partitioner}
/// \cgalParamType{an array of size `METIS_NOPTIONS` with value type `idx_t` (an integer type defined by METIS)}
/// \cgalParamDefault{an array of size `METIS_NOPTIONS` with value type `idx_t`,
/// initialized using the function `METIS_SetDefaultOptions()`}
/// \cgalParamExtra{The many options of METIS are not described here. Instead, users should refer
/// to the <a href="http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf">documentation</a>
/// of METIS directly.}
/// \cgalParamNEnd
///
/// \cgalParamNBegin{vertex_partition_id_map}
/// \cgalParamDescription{a property map that contains (after the function has been run)
/// the ID of the subpart for each vertex of `tm`}
/// \cgalParamType{a class model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and
/// `int` as value type}
/// \cgalParamDefault{unused}
/// \cgalParamNEnd
///
/// \cgalParamNBegin{face_partition_id_map}
/// \cgalParamDescription{a property map that contains (after the function has been run)
/// the ID of the subpart for each face of `tm`}
/// \cgalParamType{a class model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%face_descriptor` as key type and
/// `int` as value type}
/// \cgalParamDefault{unused}
/// \cgalParamNEnd
/// \cgalNamedParamsEnd
///
/// \pre `tm` is a pure triangular surface mesh: there are no edges

View File

@ -161,35 +161,56 @@ void partition_graph(const TriangleMesh& tm, int nparts,
/// \ingroup PkgBGLPartition
///
/// Computes a partition of the input triangular mesh into `nparts` parts, based on the
/// computes a partition of the input triangular mesh into `nparts` parts, based on the
/// mesh's nodal graph. The resulting partition is stored in the vertex and/or face
/// property maps that are passed as parameters using \ref bgl_namedparameters "Named Parameters".
///
/// \param tm a triangle mesh
/// \param nparts the number of parts in the final partition
/// \param np optional \ref bgl_namedparameters "Named Parameters" described below
/// \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
///
/// \tparam TriangleMesh is a model of the `FaceListGraph` concept.
/// \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
///
/// \cgalNamedParamsBegin
/// \cgalParamBegin{vertex_index_map}
/// is a property map containing for each vertex of `tm` a unique index between `0` and `num_vertices(tm)-1`.
/// \cgalParamEnd
/// \cgalParamBegin{METIS_options}
/// is a parameter used in to pass options to the METIS mesh
/// partitioner. The many options of METIS are not described here. Instead, users
/// should refer to the <a href="http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf">documentation</a>
/// of METIS directly.
/// \cgalParamEnd
/// \cgalParamBegin{vertex_partition_id_map}
/// is a property map that contains (after the function has been run)
/// the ID of the subpart for each vertex of `tm`.
/// \cgalParamEnd
/// \cgalParamBegin{face_partition_id_map}
/// is a property map that contains (after the function has been run)
/// the ID of the subpart for each face of `tm`.
/// \cgalParamEnd
/// \cgalParamNBegin{vertex_index_map}
/// \cgalParamDescription{a property map associating to each vertex of `tm` a unique index between `0` and `num_vertices(tm) - 1`}
/// \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<TriangleMesh>::%vertex_descriptor`
/// as key type and `std::size_t` as value type}
/// \cgalParamDefault{an automatically indexed internal map}
/// \cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
/// a face index property map, either using the internal property map if it exists
/// or using an external map. The latter might result in - slightly - worsened performance
/// in case of non-constant complexity for index access.}
/// \cgalParamNEnd
///
/// \cgalParamNBegin{METIS_options}
/// \cgalParamDescription{a parameter used in to pass options to the METIS mesh partitioner}
/// \cgalParamType{an array of size `METIS_NOPTIONS` with value type `idx_t` (an integer type defined by METIS)}
/// \cgalParamDefault{an array of size `METIS_NOPTIONS` with value type `idx_t`,
/// initialized using the function `METIS_SetDefaultOptions()`}
/// \cgalParamExtra{The many options of METIS are not described here. Instead, users should refer
/// to the <a href="http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf">documentation</a>
/// of METIS directly.}
/// \cgalParamNEnd
///
/// \cgalParamNBegin{vertex_partition_id_map}
/// \cgalParamDescription{a property map that contains (after the function has been run)
/// the ID of the subpart for each vertex of `tm`}
/// \cgalParamType{a class model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and
/// `int` as value type}
/// \cgalParamDefault{unused}
/// \cgalParamNEnd
///
/// \cgalParamNBegin{face_partition_id_map}
/// \cgalParamDescription{a property map that contains (after the function has been run)
/// the ID of the subpart for each face of `tm`}
/// \cgalParamType{a class model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%face_descriptor` as key type and
/// `int` as value type}
/// \cgalParamDefault{unused}
/// \cgalParamNEnd
/// \cgalNamedParamsEnd
///
/// \pre `tm` is a pure triangular surface mesh: there are no edges

View File

@ -168,7 +168,7 @@ private:
mutable vertices_size_type number_of_vertices;
public:
/// Returns the underlying mesh.
/// returns the underlying mesh.
const TM& mesh() const
{
return tm;
@ -543,31 +543,31 @@ public:
/// \name Seam query functions
/// @{
/// Returns `true` if the vertex is on the seam.
/// returns `true` if the vertex is on the seam.
bool has_on_seam(TM_vertex_descriptor vd) const
{
return get(svm, vd);
}
/// Returns `true` if the edge is on the seam.
/// returns `true` if the edge is on the seam.
bool has_on_seam(TM_edge_descriptor ed) const
{
return get(sem, ed);
}
/// Returns `true` if the halfedge is on the seam.
/// returns `true` if the halfedge is on the seam.
bool has_on_seam(TM_halfedge_descriptor tmhd) const
{
return get(sem, CGAL::edge(tmhd, tm));
}
/// Returns `true` if the halfedge is on the seam.
/// returns `true` if the halfedge is on the seam.
bool has_on_seam(const halfedge_descriptor& hd) const
{
return has_on_seam(CGAL::edge(hd, tm));
}
/// Return the number of seam edges in the seam mesh.
/// returns the number of seam edges in the seam mesh.
edges_size_type number_of_seam_edges() const
{
return number_of_seams;
@ -601,7 +601,7 @@ public:
}
/// @endcond
/// Returns the iterator range of the vertices of the mesh.
/// returns the iterator range of the vertices of the mesh.
Iterator_range<vertex_iterator> vertices() const
{
Iterator_range<TM_halfedge_iterator> ir = CGAL::halfedges(tm);
@ -627,7 +627,7 @@ public:
}
/// @endcond
/// Returns the iterator range of the halfedges of the mesh.
/// returns the iterator range of the halfedges of the mesh.
Iterator_range<halfedge_iterator> halfedges() const
{
Iterator_range<TM_halfedge_iterator> ir = CGAL::halfedges(tm);
@ -652,7 +652,7 @@ public:
}
/// @endcond
/// Returns the iterator range of the edges of the mesh.
/// returns the iterator range of the edges of the mesh.
Iterator_range<edge_iterator> edges() const
{
Iterator_range<TM_halfedge_iterator> ir = CGAL::halfedges(tm);
@ -675,7 +675,7 @@ public:
}
/// @endcond
/// Returns the iterator range of the faces of the mesh.
/// returns the iterator range of the faces of the mesh.
Iterator_range<face_iterator> faces() const
{
return CGAL::faces(tm);
@ -686,7 +686,7 @@ public:
/// \name Memory Management
/// @{
/// Returns the number of vertices in the seam mesh.
/// returns the number of vertices in the seam mesh.
vertices_size_type num_vertices() const
{
if(number_of_vertices == static_cast<vertices_size_type>(-1)) {
@ -696,19 +696,19 @@ public:
return number_of_vertices;
}
/// Returns the number of halfedges in the seam mesh.
/// returns the number of halfedges in the seam mesh.
halfedges_size_type num_halfedges() const
{
return CGAL::num_halfedges(tm) + 2 * number_of_seams;
}
/// Returns the number of edges in the seam mesh.
/// returns the number of edges in the seam mesh.
halfedges_size_type num_edges() const
{
return CGAL::num_edges(tm) + number_of_seams;
}
/// Returns the number of faces in the seam mesh.
/// returns the number of faces in the seam mesh.
faces_size_type num_faces() const
{
return CGAL::num_faces(tm);
@ -719,7 +719,7 @@ public:
/// \name Degree Functions
/// @{
/// Returns the number of incident halfedges of vertex `v`.
/// returns the number of incident halfedges of vertex `v`.
degree_size_type degree(vertex_descriptor v) const
{
degree_size_type count(0);
@ -743,13 +743,13 @@ public:
#ifndef DOXYGEN_RUNNING
///@{
/// Returns the edge that contains halfedge `h` as one of its two halfedges.
/// returns the edge that contains halfedge `h` as one of its two halfedges.
edge_descriptor edge(halfedge_descriptor h) const
{
return edge_descriptor(h,this);
}
/// Returns the halfedge corresponding to the edge `e`.
/// returns the halfedge corresponding to the edge `e`.
halfedge_descriptor halfedge(edge_descriptor e) const
{
return e.hd;
@ -758,7 +758,7 @@ public:
///@{
/// Returns an incoming halfedge of vertex `v`.
/// returns an incoming halfedge of vertex `v`.
/// If `v` is a seam vertex, this will be the halfedge whose target is `v` and
/// whose opposite is a virtual border halfedge.
/// Otherwise, the rules of the underlying mesh are followed.
@ -769,7 +769,7 @@ public:
return halfedge_descriptor(h, false /*not on seam*/);
}
/// Finds a halfedge between two vertices. Returns a default constructed
/// finds a halfedge between two vertices. Returns a default constructed
/// `halfedge_descriptor`, if `source` and `target` are not connected.
std::pair<halfedge_descriptor, bool> halfedge(vertex_descriptor u,
vertex_descriptor v) const
@ -800,7 +800,7 @@ public:
return std::make_pair(halfedge_descriptor(), false/*invalid*/);
}
/// Finds an edge between two vertices. Returns a default constructed
/// finds an edge between two vertices. Returns a default constructed
/// `edge`, if `source` and `target` are not connected.
std::pair<edge_descriptor, bool> edge(vertex_descriptor u, vertex_descriptor v) const
{
@ -815,7 +815,7 @@ public:
return halfedge_descriptor(hd, false/*not on seam*/);
}
/// Returns the face incident to halfedge `h`.
/// returns the face incident to halfedge `h`.
face_descriptor face(halfedge_descriptor h) const
{
if(h.seam)
@ -825,7 +825,7 @@ public:
}
public:
/// Returns the next halfedge within the incident face.
/// returns the next halfedge within the incident face.
halfedge_descriptor next(const halfedge_descriptor& hd) const
{
if((!hd.seam) && (!is_border(hd.tmhd, tm)))
@ -840,7 +840,7 @@ public:
!is_border(CGAL::opposite(*hatc, tm), tm));
}
/// Returns the previous halfedge within the incident face.
/// returns the previous halfedge within the incident face.
halfedge_descriptor prev(const halfedge_descriptor& hd) const
{
if((!hd.seam) && (!is_border(hd.tmhd, tm)))
@ -855,7 +855,7 @@ public:
!is_border(CGAL::opposite(*hatc, tm), tm));
}
/// Returns the opposite halfedge of `hd`.
/// returns the opposite halfedge of `hd`.
halfedge_descriptor opposite(const halfedge_descriptor& hd) const
{
if(!hd.seam)
@ -864,7 +864,7 @@ public:
return halfedge_descriptor(CGAL::opposite(hd.tmhd, tm), false /*not on seam*/);
}
/// Returns the vertex the halfedge `h` emanates from.
/// returns the vertex the halfedge `h` emanates from.
vertex_descriptor target(halfedge_descriptor hd) const
{
TM_halfedge_descriptor tmhd(hd);
@ -884,7 +884,7 @@ public:
return vertex_descriptor(halfedge_descriptor(tmhd));
}
/// Returns the vertex the halfedge `h` emanates from.
/// returns the vertex the halfedge `h` emanates from.
vertex_descriptor source(const halfedge_descriptor& hd) const
{
return target(opposite(hd));
@ -922,7 +922,7 @@ public:
/// \name Seam selection
/// @{
/// Mark the edge of the underlying mesh that has extremities the vertices
/// marks the edge of the underlying mesh that has extremities the vertices
/// `tm_vd_s` and `tm_vd_s` as a seam edge.
///
/// \return whether the edge was successfully marked or not.
@ -963,7 +963,7 @@ public:
return true;
}
/// Create new seams.
/// creates new seams.
///
/// The edges to be marked as seams are described by the range [first, last) of
/// vertices of the underlying mesh. Each edge to be marked is described
@ -998,7 +998,7 @@ public:
return tmhd;
}
/// Create new seams.
/// creates new seams.
///
/// A seam edge is described by a pair of integers. The integer index
/// of a vertex of the underlying mesh is given by its position
@ -1024,7 +1024,7 @@ public:
return add_seams(seam_vertices.begin(), seam_vertices.end());
}
/// Create new seams.
/// creates new seams.
///
/// A seam edge is described by a pair of integers. The integer
/// index of a vertex of the underlying mesh is defined as its position when
@ -1041,7 +1041,7 @@ public:
return add_seams(in, tm_vds);
}
/// Create new seams.
/// creates new seams.
///
/// A seam edge is described by a pair of integers. The integer index
/// of a vertex of the underlying mesh is given by its position
@ -1085,7 +1085,7 @@ public:
return add_seams(in, tm_vds);
}
/// Create new seams.
/// creates new seams.
///
/// A seam edge is described by a pair of integers. The integer
/// index of a vertex of the underlying mesh is defined as its position when
@ -1104,7 +1104,7 @@ public:
/// @}
/// Constructs a seam mesh for a triangle mesh and an edge and vertex property map
/// constructs a seam mesh for a triangle mesh and an edge and vertex property map
///
/// \param tm the underlying mesh
/// \param sem the edge property map with value `true` for seam edges

View File

@ -505,27 +505,33 @@ class Alpha_expansion_MaxFlow_impl;
vd)[label_idx]` returns the cost of vertex `vd` to belong to the
label `label_idx`.
\param np optional sequence of named parameters among the ones listed below
\param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
\cgalNamedParamsBegin
\cgalParamBegin{vertex_index_map}
a property map providing the index of each vertex
\cgalParamEnd
\cgalParamBegin{implementation_tag}
tag used to select
which implementation of the alpha expansion should be
used. Available implementation tags are:
- `CGAL::Alpha_expansion_boost_adjacency_list` (default)
\cgalParamNBegin{vertex_index_map}
\cgalParamDescription{a property map associating to each vertex of `input_graph` a unique index between `0` and `num_vertices(input_graph) - 1`}
\cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<InputGraph>::%vertex_descriptor`
as key type and `std::size_t` as value type}
\cgalParamDefault{an automatically indexed internal map}
\cgalParamExtra{If this parameter is not passed, internal machinery will create and initialize
a face index property map, either using the internal property map if it exists
or using an external map. The latter might result in - slightly - worsened performance
in case of non-constant complexity for index access.}
\cgalParamNEnd
\cgalParamNBegin{implementation_tag}
\cgalParamDescription{a tag used to select which implementation of the alpha expansion should be used.
Available implementation tags are:
- `CGAL::Alpha_expansion_boost_adjacency_list`
- `CGAL::Alpha_expansion_boost_compressed_sparse_row_tag`
- `CGAL::Alpha_expansion_MaxFlow_tag`
\cgalParamEnd
- `CGAL::Alpha_expansion_MaxFlow_tag`}
\cgalParamDefault{`CGAL::Alpha_expansion_boost_adjacency_list`}
\cgalParamNEnd
\cgalNamedParamsEnd
\note The `MaxFlow` implementation is provided by the \ref PkgSurfaceMeshSegmentationRef
under GPL license. The header
`<CGAL/boost/graph/Alpha_expansion_MaxFlow_tag.h>`
under GPL license. The header `<CGAL/boost/graph/Alpha_expansion_MaxFlow_tag.h>`
must be included if users want to use this implementation.
*/
template <typename InputGraph,
typename EdgeCostMap,

View File

@ -254,58 +254,97 @@ inline Emptyset_iterator make_functor(const internal_np::Param_not_found&)
and `boost::graph_traits<SourceMesh>::%face_descriptor` must be
models of `Hashable`.
\tparam TargetMesh a model of `FaceListGraph`
\tparam NamedParameters1 a sequence of \ref pmp_namedparameters "Named Parameters"
\tparam NamedParameters2 a sequence of \ref pmp_namedparameters "Named Parameters"
\tparam NamedParameters1 a sequence of \ref bgl_namedparameters "Named Parameters"
\tparam NamedParameters2 a sequence of \ref bgl_namedparameters "Named Parameters"
The types `sm_vertex_descriptor` and `sm_face_descriptor` must be models of the concept `Hashable`.
\param sm the source mesh
\param tm the target mesh
\param np1 optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below
\param np1 an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
\cgalNamedParamsBegin
\cgalParamBegin{vertex_point_map}
the property map with the points associated to the vertices of `sm` .
If this parameter is omitted, an internal property map for
`CGAL::vertex_point_t` should be available in `SourceMesh`
\cgalParamEnd
\cgalParamBegin{vertex_to_vertex_output_iterator} an `OutputIterator` containing the
pairs source-vertex, target-vertex. If this parameter is given, then
`vertex_to_vertex_map` cannot be used.
\cgalParamEnd
\cgalParamBegin{halfedge_to_halfedge_output_iterator} an `OutputIterator` containing the
pairs source-halfedge, target-halfedge. If this parameter is given, then
`halfedge_to_halfedge_map` cannot be used.
\cgalParamEnd
\cgalParamBegin{face_to_face_output_iterator} an `OutputIterator` containing the
pairs source-face, target-face. If this parameter is given, then
`face_to_face_map` cannot be used.
\cgalParamEnd
\cgalParamBegin{vertex_to_vertex_map} a `ReadWritePropertyMap` containing the
pairs source-vertex, target-vertex.
\cgalParamEnd
\cgalParamBegin{halfedge_to_halfedge_map} a `ReadWritePropertyMap` containing the
pairs source-halfedge, target-halfedge.
\cgalParamEnd
\cgalParamBegin{face_to_face_map} a `ReadWritePropertyMap` containing the
pairs source-face, target-face.
\cgalParamEnd
\cgalParamNBegin{vertex_point_map}
\cgalParamDescription{a property map associating points to the vertices of `sm`}
\cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits<SourceMesh>::%vertex_descriptor`
as key type and `%Point_3` as value type}
\cgalParamDefault{`boost::get(CGAL::vertex_point, sm)`}
\cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
must be available in `SourceMesh`.}
\cgalParamNEnd
\cgalParamNBegin{vertex_to_vertex_output_iterator}
\cgalParamDescription{an `OutputIterator` containing the pairs source-vertex, target-vertex.}
\cgalParamType{a class model of `OutputIterator` accepting
`std::pair<`boost::graph_traits<SourceMesh>::%vertex_descriptor, `boost::graph_traits<TargetMesh>::%vertex_descriptor>`}
\cgalParamDefault{`Emptyset_iterator`}
\cgalParamExtra{If this parameter is given, then `vertex_to_vertex_map` cannot be used.}
\cgalParamNEnd
\cgalParamNBegin{halfedge_to_halfedge_output_iterator}
\cgalParamDescription{an `OutputIterator` containing the pairs source-halfedge, target-halfedge.}
\cgalParamType{a class model of `OutputIterator` accepting
`std::pair<`boost::graph_traits<SourceMesh>::%halfedge_descriptor, `boost::graph_traits<TargetMesh>::%halfedge_descriptor>`}
\cgalParamDefault{`Emptyset_iterator`}
\cgalParamExtra{If this parameter is given, then `halfedge_to_halfedge_map` cannot be used.}
\cgalParamNEnd
\cgalParamNBegin{face_to_face_output_iterator}
\cgalParamDescription{an `OutputIterator` containing the pairs source-face, target-face.}
\cgalParamType{a class model of `OutputIterator` accepting
`std::pair<`boost::graph_traits<SourceMesh>::%face_descriptor, `boost::graph_traits<TargetMesh>::%face_descriptor>`}
\cgalParamDefault{`Emptyset_iterator`}
\cgalParamExtra{If this parameter is given, then `face_to_face_map` cannot be used.}
\cgalParamNEnd
\cgalParamNBegin{vertex_to_vertex_map}
\cgalParamDescription{a property map storing for each vertex of a source mesh the corresponding vertex of another mesh}
\cgalParamType{a class model of `ReadWritePropertyMap` with
`boost::graph_traits<SourceMesh>::%vertex_descriptor` as key type and
`boost::graph_traits<TargetMesh>::%vertex_descriptor` as value type.}
\cgalParamDefault{unused}
\cgalParamExtra{A typical use case is mapping the vertices from a source mesh
to its copy's after a `copy_face_graph()` operation.}
\cgalParamNEnd
\cgalParamNBegin{halfedge_to_halfedge_map}
\cgalParamDescription{a property map storing for each halfedge of a source mesh the corresponding halfedge of another mesh}
\cgalParamType{a class model of `ReadWritePropertyMap` with
`boost::graph_traits<SourceMesh>::%halfedge_descriptor` as key type and
`boost::graph_traits<TargetMesh>::%halfedge_descriptor` as value type}
\cgalParamDefault{unused}
\cgalParamExtra{A typical use case is mapping the halfedges from a source mesh to its copy's
after a `copy_face_graph()`operation.}
\cgalParamNEnd
\cgalParamNBegin{face_to_face_map}
\cgalParamDescription{a property map storing for each face of a source mesh the corresponding face of another mesh}
\cgalParamType{a class model of `ReadWritePropertyMap` with
`boost::graph_traits<SourceMesh>::%face_descriptor` as key type and
`boost::graph_traits<TargetMesh>::%face_descriptor` as value type}
\cgalParamDefault{unused}
\cgalParamExtra{A typical use case is mapping the faces from a source mesh to its copy's
after a `copy_face_graph()` operation}
\cgalParamNEnd
\cgalNamedParamsEnd
\param np2 optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below
\param np2 an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
\cgalNamedParamsBegin
\cgalParamBegin{vertex_point_map}
the property map with the points associated to the vertices of `tm`.
If this parameter is omitted, an internal property map for
`CGAL::vertex_point_t` should be available in `TargetMesh`
\cgalParamEnd
\cgalParamNBegin{vertex_point_map}
\cgalParamDescription{a property map associating points to the vertices of `tm`}
\cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits<TargetMesh>::%vertex_descriptor`
as key type and `%Point_3` as value type}
\cgalParamDefault{`boost::get(CGAL::vertex_point, tm)`}
\cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
must be available in `TargetMesh`.}
\cgalParamNEnd
\cgalNamedParamsEnd
The points from `sm` to `tm` are converted using
`CGAL::Cartesian_converter<SourceKernel, TargetKernel>`.
`SourceKernel` and `TargetKernel` are deduced using `CGAL::Kernel_traits`
from the value types of the vertex_point_maps.
from the value types of the vertex point maps.
Other properties are not copied.
*/

View File

@ -27,15 +27,26 @@
#include <CGAL/IO/write_vtk.h>
namespace CGAL {
/*!
\ingroup PkgBGLIOFct
writes the graph `g` in the wrl format (VRML 2.0).
\param os the output stream
\param g the graph to be written
\param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
\cgalNamedParamsBegin
* \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `g`.
* If this parameter is omitted, an internal property map for
* `CGAL::vertex_point_t` should be available in `FaceGraph`\cgalParamEnd
* \cgalNamedParamsEnd
\cgalParamNBegin{vertex_point_map}
\cgalParamDescription{a property map associating points to the vertices of `g`}
\cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<FaceGraph>::%vertex_descriptor`
as key type and `%Point_3` as value type}
\cgalParamDefault{`boost::get(CGAL::vertex_point, g)`}
\cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
must be available in `FaceGraph`.}
\cgalParamNEnd
\cgalNamedParamsEnd
*/
template <typename FaceGraph, typename NamedParameters>
bool write_wrl(std::ostream& os,
@ -115,16 +126,25 @@ bool write_wrl(std::ostream& os,
/*!
\ingroup PkgBGLIOFct
writes the graph `g` in the OFF format.
\param os the output stream
\param g the graph to be written
\param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
\cgalNamedParamsBegin
* \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `g`.
* If this parameter is omitted, an internal property map for
* `CGAL::vertex_point_t` should be available in `FaceGraph`\cgalParamEnd
* \cgalNamedParamsEnd
\cgalParamNBegin{vertex_point_map}
\cgalParamDescription{a property map associating points to the vertices of `g`}
\cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<FaceGraph>::%vertex_descriptor`
as key type and `%Point_3` as value type}
\cgalParamDefault{`boost::get(CGAL::vertex_point, g)`}
\cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
must be available in `FaceGraph`.}
\cgalParamNEnd
\cgalNamedParamsEnd
\sa Overloads of this function for specific models of the concept `FaceGraph`.
*/
template <typename FaceGraph, typename NamedParameters>
bool write_off(std::ostream& os,
@ -237,17 +257,28 @@ inline std::string next_non_comment(std::istream& is)
/*!
\ingroup PkgBGLIOFct
reads the graph `g` from data in the OFF format. Ignores comment lines which start with a hash, and lines with whitespace.
\param is the input stream
\param g the graph to be read
\param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
\cgalNamedParamsBegin
* \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `g`.
* If this parameter is omitted, an internal property map for
* `CGAL::vertex_point_t` should be available in `FaceGraph`\cgalParamEnd
* \cgalNamedParamsEnd
\cgalParamNBegin{vertex_point_map}
\cgalParamDescription{a property map associating points to the vertices of `g`}
\cgalParamType{a class model of `WritablePropertyMap` with `boost::graph_traits<FaceGraph>::%vertex_descriptor`
as key type and `%Point_3` as value type}
\cgalParamDefault{`boost::get(CGAL::vertex_point, g)`}
\cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
must be available in `FaceGraph`.}
\cgalParamNEnd
\cgalNamedParamsEnd
\sa Overloads of this function for specific models of the concept `FaceGraph`.
\pre The data must represent a 2-manifold
\attention The graph `g` is not cleared, and the data from the stream are added.
\attention The graph `g` is not cleared, and the data from the stream are added.
*/
template <typename FaceGraph, typename NamedParameters>
bool read_off(std::istream& is,
@ -614,24 +645,34 @@ write_polys_points(std::ostream& os,
* \brief writes a triangulated surface mesh in the `PolyData` XML format.
*
* \tparam TriangleMesh a model of `FaceListGraph` with only triangle faces.
* \tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters"
* \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
*
* \param os the stream used for writing.
* \param mesh the triangle mesh to be written.
* \param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the
* ones listed below
* \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
*
* \cgalNamedParamsBegin
* \cgalParamBegin{use_binary_mode} a Boolean indicating if the
* data should be written in binary (`true`, the default) or in ASCII (`false`).
* \cgalParamEnd
* \cgalParamBegin{vertex_point_map} the property map with the points associated to
* the vertices of `mesh`. If this parameter is omitted, an internal property map for
* `CGAL::vertex_point_t` must be available in `TriangleMesh`.
* \cgalParamEnd
* \cgalParamBegin{vertex_index_map} the property map with the indices associated to
* the vertices of `mesh`.
* \cgalParamEnd
* \cgalParamNBegin{use_binary_mode}
* \cgalParamDescription{Boolean indicating if the data should be written in binary (`true`) or in ASCII (`false`)}
* \cgalParamType{Boolean}
* \cgalParamDefault{`true`}
* \cgalParamNEnd
*
* \cgalParamNBegin{vertex_point_map}
* \cgalParamDescription{a property map associating points to the vertices of `mesh`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<TriangleMesh>::%vertex_descriptor`
* as key type and `%Point_3` as value type}
* \cgalParamDefault{`boost::get(CGAL::vertex_point, mesh)`}
* \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
* must be available in `TriangleMesh`.}
* \cgalParamNEnd
*
* \cgalParamNBegin{vertex_index_map}
* \cgalParamDescription{a property map associating to each vertex of `mesh` a unique index between `0` and `num_vertices(mesh) - 1`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<TriangleMesh>::%vertex_descriptor`
* as key type and `std::size_t` as value type}
* \cgalParamDefault{an automatically indexed internal map}
* \cgalParamNEnd
* \cgalNamedParamsEnd
*/
template<class TriangleMesh,

View File

@ -172,6 +172,7 @@ CGAL_add_named_parameter(remesh_boundaries_t, remesh_boundaries, remesh_boundari
CGAL_add_named_parameter(cell_selector_t, cell_selector, cell_selector)
CGAL_add_named_parameter(facet_is_constrained_t, facet_is_constrained, facet_is_constrained_map)
CGAL_add_named_parameter(remeshing_visitor_t, remeshing_visitor, remeshing_visitor)
CGAL_add_named_parameter(smooth_constrained_edges_t, smooth_constrained_edges, smooth_constrained_edges)
// output parameters
CGAL_add_named_parameter(face_proxy_map_t, face_proxy_map, face_proxy_map)

View File

@ -286,7 +286,7 @@ struct Regularization_graph
/*!
\ingroup PkgBGLSelectionFct
Augments a selection with faces of `fg` that are adjacent
augments a selection with faces of `fg` that are adjacent
to a face in `selection`. This process is applied `k` times considering
all faces added in the previous steps.
Two faces are said to be adjacent if they share a vertex or an edge.
@ -356,7 +356,7 @@ expand_face_selection(
/*!
\ingroup PkgBGLSelectionFct
Diminishes a selection of faces from faces adjacent to a non-selected face.
diminishes a selection of faces from faces adjacent to a non-selected face.
This process is applied `k` times considering all faces removed in the previous steps.
Two faces are said to be adjacent if they share a vertex or an edge.
Each face removed from the selection is added exactly once in `out`.
@ -464,20 +464,38 @@ reduce_face_selection(
unselects everything so that the length of the border of the
selection is 0)
\param np optional sequence of named parameters among the ones listed below
\param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
\cgalNamedParamsBegin
\cgalParamBegin{face_index_map}
the property map with the indices associated to the faces of `mesh`
\cgalParamEnd
\cgalParamBegin{vertex_point_map}
the property map with the points associated to the vertices of `mesh`
\cgalParamEnd
\cgalParamBegin{prevent_unselection}
if `true` only new faces can be selected, if `false` (default) some
faces can be unselected
\cgalParamEnd
\cgalParamBegin{geom_traits} an instance of a geometric traits class, model of `Kernel`\cgalParamEnd
\cgalParamNBegin{vertex_point_map}
\cgalParamDescription{a property map associating points to the vertices of `tm`}
\cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits<TriangleMesh>::%vertex_descriptor`
as key type and `%Point_3` as value type}
\cgalParamDefault{`boost::get(CGAL::vertex_point, tm)`}
\cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
must be available in `TriangleMesh`.}
\cgalParamNEnd
\cgalParamNBegin{face_index_map}
\cgalParamDescription{a property map associating to each face of `tm` a unique index between `0` and `num_faces(tm) - 1`}
\cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<TriangleMesh>::%face_descriptor`
as key type and `std::size_t` as value type}
\cgalParamDefault{an automatically indexed internal map}
\cgalParamNEnd
\cgalParamNBegin{prevent_unselection}
\cgalParamDescription{Boolean used to indicate if selection can be only extended or if it can also be shrinked.}
\cgalParamType{`bool`}
\cgalParamDefault{`false`}
\cgalParamExtra{The geometric traits class must be compatible with the vertex point type.}
\cgalParamNEnd
\cgalParamNBegin{geom_traits}
\cgalParamDescription{an instance of a geometric traits class}
\cgalParamType{a class model of `Kernel`}
\cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`}
\cgalParamExtra{The geometric traits class must be compatible with the vertex point type.}
\cgalParamNEnd
\cgalNamedParamsEnd
*/
template <typename TriangleMesh, typename IsSelectedMap, typename NamedParameters>
@ -731,7 +749,7 @@ select_incident_faces(
/*!
\ingroup PkgBGLSelectionFct
Augments a selection with edges of `fg` that are adjacent
augments a selection with edges of `fg` that are adjacent
to an edge in `selection`. This process is applied `k` times considering
all edges added in the previous steps.
Two edges are said to be adjacent if they are incident to the same face or vertex.
@ -798,7 +816,7 @@ expand_edge_selection(
/*!
\ingroup PkgBGLSelectionFct
Diminishes a selection of edges from edges adjacent to a non-selected edge.
diminishes a selection of edges from edges adjacent to a non-selected edge.
This process is applied `k` times considering all edges removed in the previous steps.
Two edges are said to be adjacent if they are incident to the same face or vertex.
Each edge removed from the selection is added exactly once in `out`.
@ -884,7 +902,7 @@ reduce_edge_selection(
/*!
\ingroup PkgBGLSelectionFct
Augments a selection with vertices of `fg` that are adjacent
augments a selection with vertices of `fg` that are adjacent
to a vertex in `selection`. This process is applied `k` times considering
all vertices added in the previous steps.
Two vertices are said to be adjacent if they are part of the same face.
@ -939,7 +957,7 @@ expand_vertex_selection(
/*!
\ingroup PkgBGLSelectionFct
Diminishes a selection of vertices from vertices adjacent to a non-selected vertex.
diminishes a selection of vertices from vertices adjacent to a non-selected vertex.
This process is applied `k` times considering all vertices removed in the previous steps.
Two vertices are said to be adjacent if they are part of the same face.
Each vertex removed from the selection is added exactly once in `out`.

View File

@ -131,7 +131,7 @@ public:
}
}; // end class Less_on_G_copy_vertex_descriptors
// Splits a graph at vertices with degree higher than two and at vertices where `is_terminal` returns `true`
// splits a graph at vertices with degree higher than two and at vertices where `is_terminal` returns `true`
// The vertices are duplicated, and new incident edges created.
// `OrigGraph` must be undirected
template <typename Graph,

View File

@ -78,12 +78,14 @@ BigInt FiveTo(unsigned long exp) {
// ZERO
CGAL_INLINE_FUNCTION
const BigFloat& BigFloat::getZero() {
init_CORE();
CGAL_STATIC_THREAD_LOCAL_VARIABLE(BigFloat, Zero,0);
return Zero;
}
// ONE
CGAL_INLINE_FUNCTION
const BigFloat& BigFloat::getOne() {
init_CORE();
CGAL_STATIC_THREAD_LOCAL_VARIABLE(BigFloat, One,1);
return One;
}

View File

@ -61,11 +61,13 @@ const char* Sub::name = "-";
********************************************************/
CGAL_INLINE_FUNCTION
const Expr& Expr::getZero() {
init_CORE();
CGAL_STATIC_THREAD_LOCAL_VARIABLE(Expr, Zero,0);
return Zero;
}
CGAL_INLINE_FUNCTION
const Expr& Expr::getOne() {
init_CORE();
CGAL_STATIC_THREAD_LOCAL_VARIABLE(Expr, One,1);
return One;
}

View File

@ -26,14 +26,6 @@
#include <CGAL/config.h>
#include <CGAL/tss.h>
#include <boost/config.hpp>
#if defined(CGAL_HAS_THREADS) && defined(BOOST_GCC) && BOOST_GCC < 90100
// Force the use of Boost.Thread with g++ and C++11, because of the PR66944
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66944
// See also CGAL PR #1888
// https://github.com/CGAL/cgal/pull/1888#issuecomment-278284232
# include <boost/thread/tss.hpp>
#endif
#include <new> // for placement new
#include <cassert>
@ -85,10 +77,7 @@ public:
// Access the corresponding static global allocator.
static MemoryPool<T,nObjects>& global_allocator() {
#if defined(CGAL_HAS_THREADS) && defined(BOOST_GCC) && BOOST_GCC < 90100
if(memPool_ptr.get() == nullptr) {memPool_ptr.reset(new Self());}
Self& memPool = * memPool_ptr.get();
#elif defined(CGAL_HAS_THREADS) // use the C++11 implementation
#if defined(CGAL_HAS_THREADS) // use the C++11 implementation
static thread_local Self memPool;
#else // not CGAL_HAS_THREADS
static Self memPool;
@ -99,18 +88,8 @@ public:
private:
Thunk* head; // next available block in the pool
std::vector<void*> blocks;
#if defined(CGAL_HAS_THREADS) && defined(BOOST_GCC) && BOOST_GCC < 90100
static boost::thread_specific_ptr<Self> memPool_ptr;
#endif // not CGAL_HAS_THREADS
};
#if defined(CGAL_HAS_THREADS) && defined(BOOST_GCC) && BOOST_GCC < 90100
template <class T, int nObjects >
boost::thread_specific_ptr<MemoryPool<T, nObjects> >
MemoryPool<T, nObjects>::memPool_ptr;
#endif
template< class T, int nObjects >
void* MemoryPool< T, nObjects >::allocate(std::size_t) {
if ( head == 0 ) { // if no more memory in the pool

View File

@ -27,7 +27,9 @@
***************************************************************************/
#ifndef _CORE_REAL_H_
#define _CORE_REAL_H_
#include "RealRep.h"
#include <CGAL/use.h>
namespace CORE {
// class Real
@ -483,6 +485,12 @@ inline Real RealLong::operator-() const {
return ker < -LONG_MAX ? -BigInt(ker) : -ker;
}
inline void init_CORE() {
using RealRep = CORE::RealDouble;
CGAL_STATIC_THREAD_LOCAL_VARIABLE(MemoryPool<RealRep>*, pool_real_rep, &MemoryPool<RealRep>::global_allocator());
CGAL_USE(pool_real_rep);
}
} //namespace CORE
#ifdef CGAL_HEADER_ONLY

View File

@ -44,6 +44,7 @@ namespace CORE {
CGAL_INLINE_FUNCTION
const Real& Real::getZero() {
init_CORE();
CGAL_STATIC_THREAD_LOCAL_VARIABLE(Real, Zero, 0);
return Zero;
}

View File

@ -252,6 +252,7 @@ public:
template < class NT >
CORE_INLINE
const Polynomial<NT> & Polynomial<NT>::polyZero() {
init_CORE();
CGAL_STATIC_THREAD_LOCAL_VARIABLE_0(Polynomial<NT>, zeroP);
return zeroP;
}
@ -259,6 +260,7 @@ const Polynomial<NT> & Polynomial<NT>::polyZero() {
template < class NT >
CORE_INLINE
const Polynomial<NT> & Polynomial<NT>::polyUnity() {
init_CORE();
static const NT c[] = {1};
CGAL_STATIC_THREAD_LOCAL_VARIABLE_2(Polynomial<NT>, unityP, 0, c);
return unityP;

View File

@ -670,19 +670,20 @@ Polynomial<NT> Polynomial<NT>::pseudoRemainder (
contract(); // Let A = (*this). Contract A.
Polynomial<NT> tmpB(B);
tmpB.contract(); // local copy of B
int bTrueDegree = tmpB.degree;
C = NT(1); // Initialized to C=1.
if (B.degree == -1) {
if (bTrueDegree == -1) {
core_error("ERROR in Polynomial<NT>::pseudoRemainder :\n -- divide by zero polynomial", __FILE__, __LINE__, false);
return Polynomial(0); // Unit Polynomial (arbitrary!)
}
if (B.degree > degree) {
if (bTrueDegree > degree) {
return Polynomial(); // Zero Polynomial
// CHECK: 1*THIS = 0*B + THAT, deg(THAT) < deg(B)
}
Polynomial<NT> Quo; // accumulate the return polynomial, Quo
Polynomial<NT> tmpQuo;
while (degree >= B.degree) { // INVARIANT: C*A = B*Quo + (*this)
while (degree >= bTrueDegree) { // INVARIANT: C*A = B*Quo + (*this)
tmpQuo = reduceStep(tmpB); // Let (*this) be (*oldthis), which
// is transformed into (*newthis). Then,
// c*(*oldthis) = B*m + (*newthis)

View File

@ -44,18 +44,22 @@ void convex_hull_3(InputIterator first, InputIterator last, PolygonMesh& pm, con
* if the convex hull is a point or a segment, endpoints will be added in `pm` as isolated vertices.
*
* \tparam VertexListGraph a model of `VertexListGraph`.
* \tparam PolygonMesh must be a model of `MutableFaceGraph`.
* \tparam PolygonMesh must be a model of `MutableFaceGraph`. an internal property map for `CGAL::vertex_point_t` must be available.
* \tparam NamedParameters a sequence of named parameters
*
* \param g the graph
* \param pm the `PolygonMesh` that will contain the convex hull
* \param np optional sequence of named parameters among the ones listed below
* \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
*
* \cgalNamedParamsBegin
* \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `g`.
* If this parameter is omitted, an internal property map for
* `CGAL::vertex_point_t` must be available in `VertexListGraph`
* \cgalParamEnd
* \cgalParamNBegin{vertex_point_map}
* \cgalParamDescription{a property map associating points to the vertices of `g`}
* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<VertexListGraph>::%vertex_descriptor`
* as key type and `%Point_3` as value type}
* \cgalParamDefault{`boost::get(CGAL::vertex_point, g)`}
* \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
* must be available in `VertexListGraph`.}
* \cgalParamNEnd
* \cgalNamedParamsEnd
* \attention The user must include the header file of the `PolygonMesh` and `VertexListGraph` types.
*/

View File

@ -1,9 +1,3 @@
@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS}
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - 3D Convex Hulls"
\# macros to be used inside the code
ALIASES += "cgalNamedParamsBegin=<dl class=\"params\"><dt>Named Parameters</dt><dd> <table class=\"params\">"
ALIASES += "cgalNamedParamsEnd=</table> </dd> </dl>"
ALIASES += "cgalParamBegin{1}=<tr><td class=\"paramname\">\ref BGL_\1 \"\1\"</td><td>"
ALIASES += "cgalParamEnd=</td></tr>"

View File

@ -101,70 +101,70 @@ the following table.
<TD ALIGN=LEFT NOWRAP>
GNU 3.2.1
<TD ALIGN=LEFT NOWRAP>
<TT>__GNUC__</TT>
`__GNUC__`
<TD ALIGN=LEFT NOWRAP>
3
<TR>
<TD ALIGN=LEFT NOWRAP>
GNU 3.2.1
<TD ALIGN=LEFT NOWRAP>
<TT>__GNUC_MINOR__</TT>
`__GNUC_MINOR__`
<TD ALIGN=LEFT NOWRAP>
2
<TR>
<TD ALIGN=LEFT NOWRAP>
GNU 3.2.1
<TD ALIGN=LEFT NOWRAP>
<TT>__GNUC_PATCHLEVEL__</TT>
`__GNUC_PATCHLEVEL__`
<TD ALIGN=LEFT NOWRAP>
1
<TR>
<TD ALIGN=LEFT NOWRAP>
Microsoft VC7.1
<TD ALIGN=LEFT NOWRAP>
<TT>_MSC_VER</TT>
`_MSC_VER`
<TD ALIGN=LEFT NOWRAP>
1310
<TR>
<TD ALIGN=LEFT NOWRAP>
Microsoft VC8.0
<TD ALIGN=LEFT NOWRAP>
<TT>_MSC_VER</TT>
`_MSC_VER`
<TD ALIGN=LEFT NOWRAP>
1400
<TR>
<TD ALIGN=LEFT NOWRAP>
Intel 11.1
<TD ALIGN=LEFT NOWRAP>
<TT>__INTEL_COMPILER</TT>
`__INTEL_COMPILER`
<TD ALIGN=LEFT NOWRAP>
1110
<TR>
<TD ALIGN=LEFT NOWRAP>
Clang 2.9
<TD ALIGN=LEFT NOWRAP>
<TT>__clang_major__</TT>
`__clang_major__`
<TD ALIGN=LEFT NOWRAP>
2
<TR>
<TD ALIGN=LEFT NOWRAP>
Clang 2.9
<TD ALIGN=LEFT NOWRAP>
<TT>__clang_minor__</TT>
`__clang_minor__`
<TD ALIGN=LEFT NOWRAP>
9
<TR>
<TD ALIGN=LEFT NOWRAP>
SUN 5.3
<TD ALIGN=LEFT NOWRAP>
<TT>__SUNPRO_CC</TT>
`__SUNPRO_CC`
<TD ALIGN=LEFT NOWRAP>
0x530
<TR>
<TD ALIGN=LEFT NOWRAP>
SUN 5.10
<TD ALIGN=LEFT NOWRAP>
<TT>__SUNPRO_CC</TT>
`__SUNPRO_CC`
<TD ALIGN=LEFT NOWRAP>
0x5100
</TABLE>
@ -178,17 +178,17 @@ There are also flags to identify the architecture.
<TD ALIGN=LEFT NOWRAP>
SGI
<TD ALIGN=LEFT NOWRAP>
<TT>__sgi</TT>
`__sgi`
<TR>
<TD ALIGN=LEFT NOWRAP>
SUN
<TD ALIGN=LEFT NOWRAP>
<TT>__sun</TT>
`__sun`
<TR>
<TD ALIGN=LEFT NOWRAP>
Linux
<TD ALIGN=LEFT NOWRAP>
<TT>__linux</TT>
`__linux`
</TABLE>
</TABLE>

View File

@ -56,7 +56,7 @@ or <A HREF="https://msdn.microsoft.com/en-us/library/1fe2x6kt(v=vs.140).aspx">`h
The \stl comes with the compiler, and as such no installation is required.
\subsection thirdpartyBoost Boost
<b>Version 1.62 or later</b>
<b>Version 1.66 or later</b>
The \sc{Boost} libraries are a set of portable C++ source libraries.
Most of \sc{Boost} libraries are header-only, but a few of them need to be compiled or
@ -64,10 +64,6 @@ installed as binaries.
\cgal only requires the headers of the \sc{Boost} libraries, but some demos and examples
depend on the binary library `Boost.Program_options`.
As an exception and because of a bug in the \gcc compiler about the \cpp 11
keyword `thread_local`, the `CGAL_Core` library always requires
the binary library `Boost.Thread` if the \gcc compiler version 9.0 or
earlier is used.
In case the \sc{Boost} libraries are not installed on your system already, you
can obtain them from <A HREF="https://www.boost.org">`https://www.boost.org/`</A>.

View File

@ -299,7 +299,16 @@ ALIASES = "sc{1}=<span style=\"font-variant: small-caps;\">\1</sp
"cgalCRPSection{1}=<h2>\1</h2>" \
"cgalCRPSubsection{1}=<h3>\1</h3>" \
"cgalCite{1}=<!-- -->\cite \1" \
"cgalPackageSection{2}=\htmlonly[block] <div style=\"background-color: #EEEDF2;\">\endhtmlonly \section \1 \2 \n \htmlonly[block] </div>\endhtmlonly"
"cgalPackageSection{2}=\htmlonly[block] <div style=\"background-color: #EEEDF2;\">\endhtmlonly \section \1 \2 \n \htmlonly[block] </div>\endhtmlonly" \
"cgalNamedParamsBegin=<dl class=\"params\"><dt>Optional Named Parameters</dt><dd> <table class=\"params\">" \
"cgalNamedParamsBegin{1}=<dl class=\"params\"><dt>\1</dt><dd> <table class=\"params\">" \
"cgalNamedParamsEnd=</table> </dd> </dl>" \
"cgalParamNBegin{1}=<tr><td class> \htmlonly[block] <button class=\"collapsible\">\endhtmlonly <b>\1</b> \htmlonly[block]</button> <div class=\"content\">\endhtmlonly<ul>" \
"cgalParamDescription{1}=<li>\1</li>" \
"cgalParamType{1}=<li><b>Type: </b>\1</li>" \
"cgalParamDefault{1}=<li><b>%Default: </b>\1</li>" \
"cgalParamExtra{1}=<li><b>Extra: </b>\1</li>" \
"cgalParamNEnd=</ul> \htmlonly[block] </div> \endhtmlonly </td><td></td></tr>"
# This tag can be used to specify a number of word-keyword mappings (TCL only).
# A mapping has the form "name=value". For example adding "class=itcl::class"

View File

@ -345,3 +345,41 @@ div.summary
{
width: auto;
}
.collapsible {
background-color: white;
color: #602020;
cursor: pointer;
padding: 3px;
width: 100%;
border: none;
text-align: left;
outline: none;
font: 14px Roboto,sans-serif;
}
.active, .collapsible:hover {
background-color: white;
}
.collapsible:after {
content: '\25B6';
color: #7A93C5;
font-weight: bold;
float: left;
margin-left: -20px;
margin-right: 5px;
}
.active:after {
content: "\25BC";
}
.content {
padding: 0 18px;
color: black;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
background-color: white;
}

View File

@ -110,3 +110,19 @@ $(document).ready(function() {
}
})();
$(document).ready(function() {
var coll = document.getElementsByClassName("collapsible");
var i;
for (i = 0; i < coll.length; i++) {
coll[i].addEventListener("click", function() {
this.classList.toggle("active");
var content = this.nextElementSibling;
if (content.style.maxHeight){
content.style.maxHeight = null;
} else {
content.style.maxHeight = content.scrollHeight + "px";
}
});
}
});

View File

@ -1,15 +1,15 @@
(function() {
'use strict';
var url_re = /(cgal\.geometryfactory\.com\/CGAL\/doc\/|doc\.cgal\.org\/)(master|latest|(\d\.\d+|\d\.\d+\.\d+))\//;
var url_re = /(cgal\.geometryfactory\.com\/CGAL\/doc\/|doc\.cgal\.org\/)(master|latest|(\d\.\d+|\d\.\d+\.\d+)(-beta\d)?)\//;
var url_local = /.*\/doc_output\//;
var current_version_local = '5.1-beta1'
var current_version_local = '5.0.3'
var all_versions = [
'master',
'latest',
'5.1-beta1',
'5.0.2',
'4.14.3',
'5.1-beta2',
'5.0.3',
'4.14.2',
'4.13.2',
'4.12.2',
'4.11.3',

View File

@ -1245,10 +1245,12 @@ dl.citelist dt {
font-weight:bold;
margin-right:10px;
padding:5px;
text-align:right;
width:52px;
}
dl.citelist dd {
margin:2px 0;
margin:2px 0 2px 72px;
padding:5px 0;
}

View File

@ -300,7 +300,16 @@ ALIASES = "sc{1}=<span style=\"font-variant: small-caps;\">\1</sp
"cgalCRPSection{1}=<h2>\1</h2>" \
"cgalCRPSubsection{1}=<h3>\1</h3>" \
"cgalCite{1}=<!-- -->\cite \1" \
"cgalPackageSection{2}=\htmlonly[block] <div style=\"background-color: #EEEDF2;\">\endhtmlonly \section \1 \2 ^^ \htmlonly[block] </div>\endhtmlonly"
"cgalPackageSection{2}=\htmlonly[block] <div style=\"background-color: #EEEDF2;\">\endhtmlonly \section \1 \2 ^^ \htmlonly[block] </div>\endhtmlonly" \
"cgalNamedParamsBegin=<dl class=\"params\"><dt>Optional Named Parameters</dt><dd> <table class=\"params\">" \
"cgalNamedParamsBegin{1}=<dl class=\"params\"><dt>\1</dt><dd> <table class=\"params\">" \
"cgalNamedParamsEnd=</table> </dd> </dl>" \
"cgalParamNBegin{1}=<tr><td class> \htmlonly[block] <button class=\"collapsible\">\endhtmlonly <b>\1</b> \htmlonly[block]</button> <div class=\"content\">\endhtmlonly<ul>" \
"cgalParamDescription{1}=<li>\1</li>" \
"cgalParamType{1}=<li><b>Type: </b>\1</li>" \
"cgalParamDefault{1}=<li><b>%Default: </b>\1</li>" \
"cgalParamExtra{1}=<li><b>Extra: </b>\1</li>" \
"cgalParamNEnd=</ul> \htmlonly[block] </div> \endhtmlonly </td><td></td></tr>"
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For

View File

@ -345,3 +345,41 @@ div.summary
{
width: auto;
}
.collapsible {
background-color: white;
color: #602020;
cursor: pointer;
padding: 3px;
width: 100%;
border: none;
text-align: left;
outline: none;
font: 14px Roboto,sans-serif;
}
.active, .collapsible:hover {
background-color: white;
}
.collapsible:after {
content: '\25B6';
color: #7A93C5;
font-weight: bold;
float: left;
margin-left: -20px;
margin-right: 5px;
}
.active:after {
content: "\25BC";
}
.content {
padding: 0 18px;
color: black;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
background-color: white;
}

View File

@ -110,3 +110,19 @@ $(document).ready(function() {
}
})();
$(document).ready(function() {
var coll = document.getElementsByClassName("collapsible");
var i;
for (i = 0; i < coll.length; i++) {
coll[i].addEventListener("click", function() {
this.classList.toggle("active");
var content = this.nextElementSibling;
if (content.style.maxHeight){
content.style.maxHeight = null;
} else {
content.style.maxHeight = content.scrollHeight + "px";
}
});
}
});

View File

@ -1,15 +1,15 @@
(function() {
'use strict';
var url_re = /(cgal\.geometryfactory\.com\/CGAL\/doc\/|doc\.cgal\.org\/)(master|latest|(\d\.\d+|\d\.\d+\.\d+))\//;
var url_re = /(cgal\.geometryfactory\.com\/CGAL\/doc\/|doc\.cgal\.org\/)(master|latest|(\d\.\d+|\d\.\d+\.\d+)(-beta\d)?)\//;
var url_local = /.*\/doc_output\//;
var current_version_local = '5.1-beta1'
var current_version_local = '5.0.3'
var all_versions = [
'master',
'latest',
'5.1-beta1',
'5.0.2',
'4.14.3',
'5.1-beta2',
'5.0.3',
'4.14.2',
'4.13.2',
'4.12.2',
'4.11.3',

View File

@ -1245,10 +1245,12 @@ dl.citelist dt {
font-weight:bold;
margin-right:10px;
padding:5px;
text-align:right;
width:52px;
}
dl.citelist dd {
margin:2px 0;
margin:2px 0 2px 72px;
padding:5px 0;
}

View File

@ -305,6 +305,16 @@ ALIASES+= "cgalCite{1}=<!-- -->\cite \1"
ALIASES+= "cgalPackageSection{2}=\htmlonly <div style=\"background-color: #EEEDF2;\">\endhtmlonly \section \1 \2 \n \htmlonly </div>\endhtmlonly"
ALIASES+= "cgalNamedParamsBegin=<dl class=\"params\"><dt>Optional Named Parameters</dt><dd> <table class=\"params\">"
ALIASES+= "cgalNamedParamsBegin{1}=<dl class=\"params\"><dt>\1</dt><dd> <table class=\"params\">"
ALIASES+= "cgalNamedParamsEnd=</table> </dd> </dl>"
ALIASES+= "cgalParamNBegin{1}=<tr><td class> \htmlonly[block] <button class=\"collapsible\">\endhtmlonly <b>\1</b> \htmlonly[block]</button> <div class=\"content\">\endhtmlonly<ul>"
ALIASES+= "cgalParamDescription{1}=<li>\1</li>"
ALIASES+= "cgalParamType{1}=<li><b>Type: </b>\1</li>"
ALIASES+= "cgalParamDefault{1}=<li><b>%Default: </b>\1</li>"
ALIASES+= "cgalParamExtra{1}=<li><b>Extra: </b>\1</li>"
ALIASES+= "cgalParamNEnd=</ul> \htmlonly[block] </div> \endhtmlonly </td><td></td></tr>"
# This tag can be used to specify a number of word-keyword mappings (TCL only).
# A mapping has the form "name=value". For example adding
# "class=itcl::class" will allow you to use the command class in the

View File

@ -336,3 +336,41 @@ div.summary
{
width: auto;
}
.collapsible {
background-color: white;
color: #602020;
cursor: pointer;
padding: 3px;
width: 100%;
border: none;
text-align: left;
outline: none;
font: 14px Roboto,sans-serif;
}
.active, .collapsible:hover {
background-color: white;
}
.collapsible:after {
content: '\25B6';
color: #7A93C5;
font-weight: bold;
float: left;
margin-left: -20px;
margin-right: 5px;
}
.active:after {
content: "\25BC";
}
.content {
padding: 0 18px;
color: black;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
background-color: white;
}

View File

@ -106,3 +106,19 @@ $(document).ready(function() {
}
})();
$(document).ready(function() {
var coll = document.getElementsByClassName("collapsible");
var i;
for (i = 0; i < coll.length; i++) {
coll[i].addEventListener("click", function() {
this.classList.toggle("active");
var content = this.nextElementSibling;
if (content.style.maxHeight){
content.style.maxHeight = null;
} else {
content.style.maxHeight = content.scrollHeight + "px";
}
});
}
});

View File

@ -1,15 +1,15 @@
(function() {
'use strict';
var url_re = /(cgal\.geometryfactory\.com\/CGAL\/doc\/|doc\.cgal\.org\/)(master|latest|(\d\.\d+|\d\.\d+\.\d+))\//;
var url_re = /(cgal\.geometryfactory\.com\/CGAL\/doc\/|doc\.cgal\.org\/)(master|latest|(\d\.\d+|\d\.\d+\.\d+)(-beta\d)?)\//;
var url_local = /.*\/doc_output\//;
var current_version_local = '5.1-beta1'
var current_version_local = '5.0.3'
var all_versions = [
'master',
'latest',
'5.1-beta1',
'5.0.2',
'4.14.3',
'5.1-beta2',
'5.0.3',
'4.14.2',
'4.13.2',
'4.12.2',
'4.11.3',

View File

@ -1079,10 +1079,12 @@ dl.citelist dt {
font-weight:bold;
margin-right:10px;
padding:5px;
text-align:right;
width:52px;
}
dl.citelist dd {
margin:2px 0;
margin:2px 0 2px 72px;
padding:5px 0;
}

View File

@ -1,9 +1,3 @@
#!/bin/sh
if which python2 2>/dev/null >/dev/null; then
exec python2 ${CMAKE_BINARY_DIR}/pkglist_filter.py "$1"
elif which python2.7 2>/dev/null >/dev/null; then
exec python2.7 ${CMAKE_BINARY_DIR}/pkglist_filter.py "$1"
elif which python2.6 2>/dev/null >/dev/null; then
exec python2.6 ${CMAKE_BINARY_DIR}/pkglist_filter.py "$1"
fi
exec ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/pkglist_filter.py "$1"

View File

@ -1,18 +1,6 @@
@echo off
@where /q python
if not errorlevel 1 ( set python=python )
@where /q python2
if not errorlevel 1 ( set python=python2 )
@where /q python2.6
if not errorlevel 1 ( set python=python2.6 )
@where /q python2.7
if not errorlevel 1 ( set python=python2.7 )
:go
%python% ${CMAKE_BINARY_DIR}/pkglist_filter.py %1
${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/pkglist_filter.py %1
@echo on

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python3
import codecs
import re
@ -28,10 +28,16 @@ def main(argv):
for l in pkgdesc:
do_print = do_print or re.match(".*cgalPkgDescriptionBegin.*", l)
if(do_print):
sys.stdout.write(l.encode('utf-8'))
if hasattr(sys.stdout, 'buffer'):
sys.stdout.buffer.write(l.encode('utf-8')) #python3
else:
sys.stdout.write(l.encode('utf-8')) #python2
do_print = do_print and (not re.match(".*cgalPkgDescriptionEnd.*", l))
else:
sys.stdout.write(line.encode('utf-8'))
if hasattr(sys.stdout, 'buffer'):
sys.stdout.buffer.write(line.encode('utf-8')) #python3
else:
sys.stdout.write(line.encode('utf-8')) #python2
if __name__ == "__main__":
main(sys.argv)

View File

@ -1725,6 +1725,11 @@ CGAL_INLINE_FUNCTION
MAT(out, 3, 3) = r3[7];
return 1;
}
#undef MAT
#undef SWAP_ROWS_GLdouble
#undef SWAP_ROWS_DOUBLE
CGAL_INLINE_FUNCTION
int unProject(GLdouble winx, GLdouble winy, GLdouble winz, GLdouble *modelview, GLdouble *projection, int *viewport,
GLdouble *objX,GLdouble *objY,GLdouble *objZ)

View File

@ -4,7 +4,7 @@ Release History
[Release 5.1](https://github.com/CGAL/cgal/releases/tag/releases%2FCGAL-5.1)
-----------
Release date: July 2020
Release date: September 2020
### [Tetrahedral Remeshing](https://doc.cgal.org/5.1/Manual/packages.html#PkgTetrahedralRemeshing) (new package)
@ -30,6 +30,11 @@ Release date: July 2020
See also the associated [blog entry](https://www.cgal.org/2020/04/20/Optimal_bounding_box/).
### Installation
- The CGAL\_Core library no longer requires `Boost.Thread`, even if the g++ compiler is used.
- The minimal supported version of Boost is now 1.66.0.
### [Tutorials](https://doc.cgal.org/5.1/Manual/tutorials.html)
- Two new, detailed tutorials have been added:

View File

@ -382,8 +382,6 @@ include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake)
include(${CGAL_MODULES_DIR}/CGAL_enable_end_of_configuration_hook.cmake)
cgal_setup_module_path()
message( STATUS "CGAL_REFERENCE_CACHE_DIR=${CGAL_REFERENCE_CACHE_DIR}" )
if ( RUNNING_CGAL_AUTO_TEST )
message(STATUS "Operating system:")
execute_process(COMMAND uname -a
@ -392,41 +390,6 @@ if ( RUNNING_CGAL_AUTO_TEST )
ERROR_VARIABLE uname_a)
message(STATUS "${uname_a}")
CGAL_display_compiler_version()
if ( NOT "${CGAL_REFERENCE_CACHE_DIR}" STREQUAL "" )
if ( EXISTS ${CGAL_REFERENCE_CACHE_DIR} )
if ( EXISTS ${CGAL_REFERENCE_CACHE_DIR}/CMakeCache.txt )
message( STATUS "Loading reference cache from ${CGAL_REFERENCE_CACHE_DIR}" )
load_cache( ${CGAL_REFERENCE_CACHE_DIR}
EXCLUDE CGAL_Core_LIBRARY
CGAL_CORE_PACKAGE_DIR
WITH_CGAL_Core
CGAL_INSTALLATION_PACKAGE_DIR
CGAL_MAINTENANCE_PACKAGE_DIR
CGAL_PDB_BINARY_DIR
CGAL_PDB_SOURCE_DIR
CGAL_BINARY_DIR
CGAL_SOURCE_DIR)
# message("List of cache variables:")
## The following lines removes nasty loaded cache values. We do not
## want that the current build tree depends on binaries that were
## build in the reference build tree.
get_property(cache_variables DIRECTORY PROPERTY CACHE_VARIABLES)
foreach(var ${cache_variables})
# get_property(var_value CACHE ${var} PROPERTY VALUE)
# get_property(type CACHE ${var} PROPERTY TYPE)
string(REGEX MATCH "^CGAL(_.*_(DEPENDS|BINARY_DIR)|_.*LIBRARY)$" var_name_matches ${var})
if(var_name_matches)
unset(${var} CACHE)
# else()
# message("${var}:${var_type}=${var_value}")
endif()
endforeach()
endif()
endif()
endif()
endif()
include(CGAL_Common)
@ -916,6 +879,7 @@ if(NOT CGAL_HEADER_ONLY)
else()
install(FILES
${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfig.cmake
${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfigBuildVersion.cmake
${CMAKE_CURRENT_LIST_DIR}/lib/cmake/CGAL/CGALConfigVersion.cmake
DESTINATION ${CGAL_INSTALL_CMAKE_DIR})
if(NOT CGAL_INSTALL_CMAKE_DIR STREQUAL "${CGAL_INSTALL_LIB_DIR}/cmake/CGAL")

View File

@ -35,7 +35,7 @@ if(Boost_IOSTREAMS_FOUND AND NOT TARGET CGAL::Boost_iostreams_support)
if(CMAKE_VERSION VERSION_LESS 3.11)
set_target_properties(CGAL::Boost_iostreams_support PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_BOOST_IOSTREAMS"
INTERFACE_LINK_LIBRARIES ${Boost_LIB} ${ZLIB_LIBS})
INTERFACE_LINK_LIBRARIES "${Boost_LIB};${ZLIB_LIBS}")
else()
set_target_properties(CGAL::Boost_iostreams_support PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_BOOST_IOSTREAMS")

View File

@ -53,13 +53,6 @@ endif()
# keyword, or ``PUBLIC`` otherwise.
#
# See the release notes of CGAL-4.10: CGAL_Core now requires
# Boost.Thread, with GNU G++ < 9.1.
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.1)
include(${CMAKE_CURRENT_LIST_DIR}/CGAL_TweakFindBoost.cmake)
find_package( Boost 1.48 REQUIRED COMPONENTS thread system )
endif()
function(CGAL_setup_CGAL_Core_dependencies target)
if(ARGV1 STREQUAL INTERFACE)
set(keyword INTERFACE)
@ -71,20 +64,4 @@ function(CGAL_setup_CGAL_Core_dependencies target)
target_compile_definitions(${target} ${keyword} CGAL_USE_CORE=1)
target_link_libraries( CGAL_Core ${keyword} CGAL::CGAL )
# See the release notes of CGAL-4.10: CGAL_Core now requires
# Boost.Thread, with GNU G++.
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.1)
if(TARGET Boost::thread)
target_link_libraries( CGAL_Core ${keyword} Boost::thread)
else()
# Note that `find_package( Boost...)` must be called in the
# function `CGAL_setup_CGAL_Core_dependencies()` because the
# calling `CMakeLists.txt` may also call `find_package(Boost)`
# between the inclusion of this module, and the call to this
# function. That resets `Boost_LIBRARIES`.
find_package( Boost 1.48 REQUIRED thread system )
target_link_libraries( CGAL_Core ${keyword} ${Boost_LIBRARIES})
endif()
endif()
endfunction()

View File

@ -16,6 +16,9 @@ if(NOT POLICY CMP0064)
# Add a fake function to avoid CMake errors
function(cgal_add_compilation_test)
endfunction()
# Add a fake function to avoid CMake errors
function(cgal_setup_test_properties)
endfunction()
# Then return, to exit the file
return()

View File

@ -14,5 +14,6 @@ function(cgal_parse_version_h version_h_file name)
MATH(EXPR ${ARGV3} "${CMAKE_MATCH_5}") # minor version without leading 0
set(${ARGV3} "${${ARGV3}}" PARENT_SCOPE)
set(${ARGV4} "${CMAKE_MATCH_6}" PARENT_SCOPE) # patch number
set(${ARGV5} "${CMAKE_MATCH_7}" PARENT_SCOPE) # build number
MATH(EXPR ${ARGV5} "${CMAKE_MATCH_7}") # build number version without leading 0
set(${ARGV5} "${${ARGV5}}" PARENT_SCOPE) # build number
endfunction()

View File

@ -1,4 +1,5 @@
find_package( GMP QUIET )
find_package( MPFR QUIET )
if( GMP_FOUND AND MPFR_FOUND )

View File

@ -0,0 +1,34 @@
// Copyright (C) 2020 GeometryFactory Sarl
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
#ifndef CGAL_MESH_3_MESH_COMPLEX_3_IN_TRIANGULATION_3_FWD_H
#define CGAL_MESH_3_MESH_COMPLEX_3_IN_TRIANGULATION_3_FWD_H
/// \file Mesh_complex_3_in_triangulation_3_fwd.h
/// Forward declarations of the Mesh_3 package.
#ifndef DOXYGEN_RUNNING
namespace CGAL {
// fwdS for the public interface
template <typename Tr,
typename CornerIndex = int,
typename CurveIndex = int>
class Mesh_complex_3_in_triangulation_3;
template<class Tr, bool c3t3_loader_failed>
bool build_triangulation_from_file(std::istream& is,
Tr& tr);
} // CGAL
#endif
#endif /* CGAL_MESH_3_MESH_COMPLEX_3_IN_TRIANGULATION_3_FWD_H */

View File

@ -36,8 +36,9 @@
# define WIN64
#endif
#ifdef BOOST_MSVC
#ifdef _MSC_VER
#define _SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING 1
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING 1
#endif
#ifdef CGAL_INCLUDE_WINDOWS_DOT_H
@ -296,6 +297,10 @@
#if __cplusplus >= 201402L || _MSVC_LANG >= 201402L
# define CGAL_CXX14 1
#endif
// Same for C++17
#if __cplusplus >= 201703L || _MSVC_LANG >= 201703L
# define CGAL_CXX17 1
#endif
#if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL) || BOOST_VERSION < 105000
#define CGAL_CFG_NO_STD_HASH 1
@ -559,7 +564,7 @@ using std::max;
#define CGAL_NORETURN [[noreturn]]
// Macro to specify [[no_unique_address]] if supported
#if __has_cpp_attribute(no_unique_address)
#if CGAL_CXX11 && __has_cpp_attribute(no_unique_address)
# define CGAL_NO_UNIQUE_ADDRESS [[no_unique_address]]
#else
# define CGAL_NO_UNIQUE_ADDRESS

View File

@ -17,7 +17,7 @@
#define CGAL_VERSION_H
#ifndef SWIG
#define CGAL_VERSION 5.1-beta2
#define CGAL_VERSION 5.1-beta3
#define CGAL_GIT_HASH abcdef
#endif
#define CGAL_VERSION_NR 1050100000

View File

@ -150,6 +150,7 @@ foreach(cgal_lib ${CGAL_LIBRARIES})
endif()
endforeach()
include(${CGAL_CONFIG_DIR}/CGALConfigVersion.cmake)
#
#
@ -161,15 +162,6 @@ cgal_setup_module_path()
set(CGAL_USE_FILE ${CGAL_MODULES_DIR}/UseCGAL.cmake)
include(${CGAL_MODULES_DIR}/CGAL_target_use_TBB.cmake)
include("${CGAL_MODULES_DIR}/CGAL_parse_version_h.cmake")
cgal_parse_version_h( "${CGAL_INSTALLATION_PACKAGE_DIR}/include/CGAL/version.h"
"CGAL_VERSION_NAME"
"CGAL_MAJOR_VERSION"
"CGAL_MINOR_VERSION"
"CGAL_BUGFIX_VERSION"
"CGAL_BUILD_VERSION")
set(CGAL_VERSION "${CGAL_MAJOR_VERSION}.${CGAL_MINOR_VERSION}.${CGAL_BUGFIX_VERSION}.${CGAL_BUILD_VERSION}")
if( CGAL_DEV_MODE OR RUNNING_CGAL_AUTO_TEST )
# Do not use -isystem for CGAL include paths
set(CMAKE_NO_SYSTEM_FROM_IMPORTED TRUE)

View File

@ -0,0 +1 @@
set(CGAL_BUILD_VERSION 0)

View File

@ -1,7 +1,8 @@
set(CGAL_MAJOR_VERSION 5)
set(CGAL_MINOR_VERSION 1)
set(CGAL_BUGFIX_VERSION 0)
set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "5.1-beta2")
include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake)
set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "5.1-beta3")
set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}")
if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0)

View File

@ -153,31 +153,49 @@ do_intersect(const typename K::Sphere_3 &sp,
template <class K>
inline
typename K::Boolean
do_intersect(const typename K::Tetrahedron_3 &tet,
const typename K::Tetrahedron_3 &sp,
do_intersect(const typename K::Tetrahedron_3 &lh_tet,
const typename K::Tetrahedron_3 &rh_tet,
const K & k)
{
return do_intersect_tetrahedron_bounded(sp, tet, tet[0], k);
return do_intersect_tetrahedron_bounded(lh_tet, rh_tet, lh_tet[0], k);
}
// BBox_3 specific code since it is ok for BBox_3 to degenerate.
template <class K>
inline
typename K::Boolean
do_intersect(const typename K::Tetrahedron_3 &tet,
const CGAL::Bbox_3 &bb,
const K & k)
{
return do_intersect_tetrahedron_bounded(bb, tet, typename K::Point_3(bb.xmin(), bb.ymin(), bb.zmin()), k);
}
template <class K>
inline
typename K::Boolean
do_intersect(const CGAL::Bbox_3 &bb,
inline typename K::Boolean do_intersect(const CGAL::Bbox_3 &aabb,
const typename K::Tetrahedron_3 &tet,
const K & k)
{
return do_intersect_tetrahedron_bounded(bb, tet, typename K::Point_3(bb.xmin(), bb.ymin(), bb.zmin()), k);
const K &k) {
typename K::Construct_triangle_3 tr = k.construct_triangle_3_object();
typename K::Boolean result = false;
typename K::Boolean b = false;
b = do_intersect(aabb, tr(tet[0], tet[1], tet[2]), k);
if (certainly(b)) return b;
if (is_indeterminate(b)) result = b;
b = do_intersect(aabb, tr(tet[1], tet[2], tet[3]), k);
if (certainly(b)) return b;
if (is_indeterminate(b)) result = b;
b = do_intersect(aabb, tr(tet[2], tet[3], tet[0]), k);
if (certainly(b)) return b;
if (is_indeterminate(b)) result = b;
b = do_intersect(aabb, tr(tet[3], tet[0], tet[1]), k);
if (certainly(b)) return b;
if (is_indeterminate(b)) result = b;
b = k.has_on_bounded_side_3_object()(
tet, k.construct_point_3_object()(aabb.xmin(), aabb.ymin(), aabb.zmin()));
if (certainly(b)) return b;
if (is_indeterminate(b)) result = b;
return result;
}
template <class K>
inline typename K::Boolean do_intersect(const typename K::Tetrahedron_3 &tet,
const CGAL::Bbox_3 &bb, const K &k) {
// Swap arguments.
return do_intersect(bb, tet, k);
}
} // namespace internal

View File

@ -0,0 +1,36 @@
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Kernel/global_functions_3.h>
#include <iostream>
#include <utility>
using K = CGAL::Simple_cartesian<double>;
using Point_3 = K::Point_3;
struct query {
Point_3 p;
double expected_angle;
};
int main() {
Point_3 a = {0, 0, 0};
Point_3 b = {0, 1, 0};
Point_3 c = {1, 0, 0};
const query queries[] = {
{ { 1, 0, 0}, 0.},
{ { 1, 0, 1}, 45.},
{ { 0, 0, 1}, 90.},
{ { -1, 0, 1}, 135.},
{ { -1, 0, 0}, 180.},
{ { -1, 0, -1}, -135.},
{ { 0, 0, -1}, -90.},
{ { 1, 0, -1}, -45.},
};
for(auto query: queries) {
const auto& expected = query.expected_angle;
const auto& p = query.p;
auto approx = CGAL::approximate_dihedral_angle(a, b, c, p);
std::cout << approx << " -- " << expected << '\n';
assert( std::abs(approx - expected) < 0.1 );
}
};

View File

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

View File

@ -1,14 +1,14 @@
Subject: CGAL 5.1 Beta 1 Released, Computational Geometry Algorithms Library
Subject: CGAL 5.1 Beta 2 Released, Computational Geometry Algorithms Library
Content-Type: text/plain; charset="utf-8"
Body:
The CGAL Open Source Project is pleased to announce the release 5.1 Beta 1
The CGAL Open Source Project is pleased to announce the release 5.1 Beta 2
of CGAL, the Computational Geometry Algorithms Library.
CGAL version 5.1 Beta 1 is a public testing release. It should provide a
CGAL version 5.1 Beta 2 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.1 in July.
of the final version of CGAL 5.1 in September.
Besides fixes and general enhancement to existing packages, the following
@ -45,6 +45,11 @@ Optimal Bounding Box (new package)
See also the associated blog entry:
https://www.cgal.org/2020/04/20/Optimal_bounding_box/
Installation
- The CGAL_Core library no longer requires Boost.Thread, even if the
g++ compiler is used.
Tutorials
- Two new, detailed tutorials have been added:
@ -118,7 +123,7 @@ CGAL and the Boost Graph Library (BGL)
uses this alpha expansion graphcut to regularize the borders of a
selected faces on a triangle mesh.
See https://www.cgal.org/2020/06/09/cgal51-beta1/ for a complete list of
See https://www.cgal.org/2020/07/28/cgal51-beta2/ for a complete list of
changes.

View File

@ -1,19 +1,8 @@
@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS}
# macros to be used inside the code
ALIASES += "cgalNamedParamsBegin=<dl class=\"params\"><dt>Named Parameters</dt><dd> <table class=\"params\">"
ALIASES += "cgalNamedParamsEnd=</table> </dd> </dl>"
ALIASES += "cgalParamBegin{1}=<tr><td class=\"paramname\">\ref PMP_\1 \"\1\"</td><td>"
ALIASES += "cgalParamEnd=</td></tr>"
ALIASES += "cgalDescribePolylineType=A polyline is defined as a sequence of points, each pair of contiguous points defines a segment of the polyline. If the first and last points of the polyline are identical, the polyline is closed."
#macros for NamedParameters.txt
ALIASES += "cgalNPTableBegin=<dl class=\"params\"><dt></dt><dd> <table class=\"params\">"
ALIASES += "cgalNPTableEnd=</table> </dd> </dl>"
ALIASES += "cgalNPBegin{1}=<tr><td class=\"paramname\">\1 </td><td>"
ALIASES += "cgalNPEnd=</td></tr>"
INPUT += \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_complex_mesh_domain_3.h \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_domain_with_polyline_features_3.h

View File

@ -133,23 +133,26 @@ else()
message( STATUS "NOTICE: Some examples need the CGAL_ImageIO library, and will not be compiled." )
endif()
if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support AND TARGET ${target})
if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support)
foreach(target
mesh_3D_image_with_features
mesh_3D_image
mesh_polyhedral_domain
mesh_3D_image_variable_size
mesh_3D_image_with_custom_initialization
mesh_two_implicit_spheres_with_balls
mesh_optimization_lloyd_example
mesh_optimization_example
mesh_3D_image_with_features
mesh_implicit_sphere
mesh_polyhedral_complex_sm
mesh_implicit_sphere_variable_size
mesh_polyhedral_domain_sm
mesh_polyhedral_domain_with_lipschitz_sizing
mesh_optimization_example
mesh_optimization_lloyd_example
mesh_polyhedral_complex
mesh_polyhedral_complex_sm
mesh_polyhedral_domain
mesh_polyhedral_domain_sm
mesh_polyhedral_domain_with_features
mesh_3D_image_variable_size)
mesh_polyhedral_domain_with_features_sm
mesh_polyhedral_domain_with_lipschitz_sizing
mesh_two_implicit_spheres_with_balls)
if(TARGET ${target})
target_link_libraries(${target} PUBLIC CGAL::TBB_support)
endif()
endforeach()
endif()

View File

@ -17,6 +17,7 @@
#include <CGAL/license/Triangulation_3.h>
#include <CGAL/Mesh_3/config.h>
#include <CGAL/Mesh_3/Mesh_complex_3_in_triangulation_3_fwd.h>
#include <CGAL/utility.h>
#include <CGAL/basic.h>
@ -893,6 +894,23 @@ output_to_medit(std::ostream& os,
}
}
template<typename T3>
void write_MEDIT(std::ostream& os, const T3& t3)
{
CGAL::Mesh_complex_3_in_triangulation_3<T3, int, int> c3t3;
c3t3.triangulation() = t3;
c3t3.rescan_after_load_of_triangulation();
output_to_medit(os, c3t3);
}
template<typename T3>
bool read_MEDIT(std::istream& in, T3& t3)
{
CGAL_assertion(!(!in));
return CGAL::build_triangulation_from_file<T3, true>(in, t3);
}
} // end namespace CGAL
#endif // CGAL_IO_FILE_MEDIT_H

View File

@ -1224,8 +1224,8 @@ private:
if(update_c3t3)
{
// Update status in c3t3
if(surface != boost::none)
c3t3_.add_to_complex(facet, surface.get());
if((bool)surface)
c3t3_.add_to_complex(facet, *surface);
else
c3t3_.remove_from_complex(facet);
}
@ -1246,7 +1246,7 @@ private:
}
}
return surface;
return surface ? surface : Surface_patch();
}
@ -1572,10 +1572,17 @@ private:
Cell_vector c3t3_cells(const Cell_vector& cells) const
{
Cell_vector c3t3_cells;
#ifdef CGAL_CXX17
std::remove_copy_if(cells.begin(),
cells.end(),
std::back_inserter(c3t3_cells),
std::not_fn(Is_in_c3t3<Cell_handle>(c3t3_)));
#else
std::remove_copy_if(cells.begin(),
cells.end(),
std::back_inserter(c3t3_cells),
std::not1(Is_in_c3t3<Cell_handle>(c3t3_)) );
#endif
return c3t3_cells;
}
@ -2047,7 +2054,7 @@ private:
true); /* update surface centers */
// false means "do not update the c3t3"
if ( c3t3_.is_in_complex(*fit) != (bool)sp ||
((bool)sp && !(c3t3_.surface_patch_index(*fit) == sp.get()) ) )
((bool)sp && !(c3t3_.surface_patch_index(*fit) == *sp) ) )
return false;
}

View File

@ -1155,6 +1155,7 @@ insert_balls(const Vertex_handle& vp,
// n = 2(d-sq) / (sp+sq)
// =======================
const FT d_signF = static_cast<FT>(d_sign);
int n = static_cast<int>(std::floor(FT(2)*(d-sq) / (sp+sq))+.5);
// if( minimal_weight_ != 0 && n == 0 ) return;
@ -1180,7 +1181,7 @@ insert_balls(const Vertex_handle& vp,
const Bare_point new_point =
domain_.construct_point_on_curve(cp(vp_wp),
curve_index,
d_sign * d / 2);
d_signF * d / 2);
const int dim = 1; // new_point is on edge
const Index index = domain_.index_from_curve_index(curve_index);
const FT point_weight = CGAL::square(size_(new_point, dim, index));
@ -1230,7 +1231,6 @@ insert_balls(const Vertex_handle& vp,
FT norm_step_size = dleft_frac * step_size;
// Initial distance
FT d_signF = static_cast<FT>(d_sign);
FT pt_dist = d_signF * norm_step_size;
Vertex_handle prev = vp;
const Bare_point& p = cp(c3t3_.triangulation().point(vp));

View File

@ -105,13 +105,14 @@ bool build_finite_cells(Tr& tr,
const std::vector<typename Tr::Vertex_handle>& vertex_handle_vector,
boost::unordered_map<std::array<typename Tr::Vertex_handle, 3>,
std::vector<std::pair<typename Tr::Cell_handle, int> > >& incident_cells_map,
const std::map<std::array<int,3>, int>& border_facets,
const std::map<std::array<int,3>, typename Tr::Cell::Surface_patch_index>& border_facets,
const bool verbose)
{
typedef std::array<int, 5> Tet_with_ref; // 4 ids + 1 reference
typedef typename Tr::Vertex_handle Vertex_handle;
typedef typename Tr::Cell_handle Cell_handle;
typedef typename Tr::Cell::Surface_patch_index Surface_patch_index;
CGAL_assertion_code(
typename Tr::Geom_traits::Construct_point_3 cp =
@ -171,7 +172,8 @@ bool build_finite_cells(Tr& tr,
++k;
} while(f[0] != n0);
typename std::map<std::array<int,3>, int>::const_iterator it = border_facets.find(f);
typename std::map<std::array<int,3>, Surface_patch_index>::const_iterator
it = border_facets.find(f);
if(it != border_facets.end())
{
c->set_surface_patch_index(j, it->second);
@ -186,7 +188,7 @@ bool build_finite_cells(Tr& tr,
if(it != border_facets.end())
c->set_surface_patch_index(j, it->second);
else
c->set_surface_patch_index(j, 0);
c->set_surface_patch_index(j, Surface_patch_index());
}
}
}
@ -259,6 +261,8 @@ bool build_infinite_cells(Tr& tr,
// the only finite facet
it->second.push_back(std::make_pair(opp_c, 0));
CGAL_assertion(it->second.size() == 2);
opp_c->set_surface_patch_index(0, c->surface_patch_index(i));
}
#ifdef CGAL_TET_SOUP_TO_C3T3_DEBUG
@ -322,7 +326,7 @@ template<class Tr, bool c3t3_loader_failed>
bool build_triangulation(Tr& tr,
const std::vector<typename Tr::Point>& points,
const std::vector<std::array<int,5> >& finite_cells,
const std::map<std::array<int,3>, int>& border_facets,
const std::map<std::array<int,3>, typename Tr::Cell::Surface_patch_index>& border_facets,
std::vector<typename Tr::Vertex_handle>& vertex_handle_vector,
const bool verbose = false)
{
@ -389,7 +393,7 @@ bool build_triangulation_from_file(std::istream& is,
std::vector<Tet_with_ref> finite_cells;
std::vector<Point_3> points;
std::map<Facet, int> border_facets;
std::map<Facet, typename Tr::Cell::Surface_patch_index> border_facets;
// grab the vertices
int dim;
@ -420,7 +424,8 @@ bool build_triangulation_from_file(std::istream& is,
is >> nf;
for(int i=0; i<nf; ++i)
{
int n1, n2, n3, surface_patch_id;
int n1, n2, n3;
typename Tr::Cell::Surface_patch_index surface_patch_id;
is >> n1 >> n2 >> n3 >> surface_patch_id;
Facet facet;
facet[0] = n1 - 1;

View File

@ -20,6 +20,7 @@
#include <CGAL/license/Triangulation_3.h>
#include <CGAL/Mesh_3/Mesh_complex_3_in_triangulation_3_fwd.h>
#include <CGAL/disable_warnings.h>
#include <CGAL/iterator.h>
#include <CGAL/Mesh_3/utilities.h>
@ -38,8 +39,8 @@ namespace CGAL {
template <typename Tr,
typename CornerIndex = int,
typename CurveIndex = int>
typename CornerIndex,
typename CurveIndex>
class Mesh_complex_3_in_triangulation_3 :
public Mesh_3::Mesh_complex_3_in_triangulation_3_base<
Tr, typename Tr::Concurrency_tag>

View File

@ -73,17 +73,13 @@ public:
}
void extend(const Point_3& p) {
FT q[3];
q[0] = p.x();
q[1] = p.y();
q[2] = p.z();
FT q[3] = { p.x(), p.y(), p.z() };
if(initialized)
Base::extend(q);
else {
initialized = true;
std::copy( q, q + 3, Base::lo );
std::copy( q, q + 3, Base::hi );
*this = Bounding_box_3(q);
}
}
};

View File

@ -229,9 +229,10 @@ public:
Vertex_handle v = this->sncp()->new_vertex(p , boundary);
CGAL_NEF_TRACEN( v->point());
SM_decorator SD(&*v);
Sphere_point sp[] = { Sphere_point(NT(-x), 0, 0),
Sphere_point(0, NT(-y), 0),
Sphere_point(0, 0, NT(-z)) };
const NT zero(0);
Sphere_point sp[] = { Sphere_point(NT(-x), zero, zero),
Sphere_point(zero, NT(-y), zero),
Sphere_point(zero, zero, NT(-z)) };
/* create box vertices */
SVertex_handle sv[3];

View File

@ -56,7 +56,8 @@ namespace Nef_3_internal{
BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Has_nested_Exact_kernel,Exact_kernel,false)
template <class R,bool has_exact_kernel=Has_nested_Exact_kernel<R>::value, class FT = typename R::RT, class Kernel_tag=typename R::Kernel_tag>
template <class R,bool has_exact_kernel=Has_nested_Exact_kernel<R>::value &&
!std::is_floating_point<typename R::RT>::value, class FT = typename R::RT, class Kernel_tag=typename R::Kernel_tag>
struct Type_converter{
typedef const CGAL::Point_3<R>& Point_3;
typedef const CGAL::Vector_3<R>& Vector_3;
@ -670,8 +671,9 @@ template<typename Tag, typename Kernel> class Geometry_io;
template<typename Kernel>
class Geometry_io<Cartesian_tag, Kernel> {
public:
template <typename EK, typename K> static
typename EK::Point_3 read_point(std::istream& in) {
template <typename EK, typename K, typename Compose_> static
typename EK::Point_3 read_point_impl(std::istream& in, Compose_) {
typedef Fraction_traits<typename K::FT> FracTraits;
typename FracTraits::Type hx, hy, hz, hw;
typename FracTraits::Numerator_type num;
@ -688,8 +690,8 @@ class Geometry_io<Cartesian_tag, Kernel> {
return typename EK::Point_3(hx,hy,hz,hw);
}
template <typename EK, typename K> static
typename EK::Plane_3 read_plane(std::istream& in) {
template <typename EK, typename K, typename Compose_> static
typename EK::Plane_3 read_plane_impl(std::istream& in, Compose_) {
typedef Fraction_traits<typename K::FT> FracTraits;
typename FracTraits::Type a, b, c, d;
typename FracTraits::Numerator_type num;
@ -706,8 +708,32 @@ class Geometry_io<Cartesian_tag, Kernel> {
return typename EK::Plane_3(a,b,c,d);
}
template <typename R> static
void print_point_impl(std::ostream& out, const CGAL::Point_3<R> p) {
template <typename EK, typename K> static
typename EK::Point_3 read_point_impl(std::istream& in, Null_functor) {
typename K::FT hx, hy, hz, hw;
in >> hx >> hy >> hz >> hw;
return typename EK::Point_3(hx,hy,hz,hw);
}
template <typename EK, typename K> static
typename EK::Plane_3 read_plane_impl(std::istream& in, Null_functor) {
typename K::FT a, b, c, d;
in >> a >> b >> c >> d;
return typename EK::Plane_3(a,b,c,d);
}
template <typename EK, typename K> static
typename EK::Point_3 read_point(std::istream& in) {
return read_point_impl<EK,K>(in, typename Fraction_traits<typename K::FT>::Compose());
}
template <typename EK, typename K> static
typename EK::Plane_3 read_plane(std::istream& in) {
return read_plane_impl<EK,K>(in, typename Fraction_traits<typename K::FT>::Compose());
}
template <typename R, typename Decompose_> static
void print_point_impl(std::ostream& out, const CGAL::Point_3<R> p, Decompose_) {
typedef Fraction_traits<typename R::FT> FracTraits;
typedef std::vector<typename FracTraits::Numerator_type> NV;
@ -737,8 +763,8 @@ class Geometry_io<Cartesian_tag, Kernel> {
<< vec[2] << " " << vec[3];
}
template <typename R> static
void print_vector_impl(std::ostream& out, const CGAL::Vector_3<R> p) {
template <typename R, typename Decompose_> static
void print_vector_impl(std::ostream& out, const CGAL::Vector_3<R> p, Decompose_) {
typedef Fraction_traits<typename R::FT> FracTraits;
typedef typename FracTraits::Numerator_type NumType;
typedef std::vector<NumType> NV;
@ -766,8 +792,8 @@ class Geometry_io<Cartesian_tag, Kernel> {
<< vec[2] << " " << NumType(1);
}
template <typename R> static
void print_plane_impl(std::ostream& out, const CGAL::Plane_3<R> p) {
template <typename R, typename Decompose_> static
void print_plane_impl(std::ostream& out, const CGAL::Plane_3<R> p, Decompose_) {
typedef Fraction_traits<typename R::FT> FracTraits;
typedef std::vector<typename FracTraits::Numerator_type> NV;
@ -803,19 +829,37 @@ class Geometry_io<Cartesian_tag, Kernel> {
<< vec[2] << " " << vec[3];
}
template <typename R> static
void print_point_impl(std::ostream& out, const CGAL::Point_3<R> p, Null_functor)
{
out << p.x() << " " << p.y() << " " << p.z() << " " << 1;
}
template <typename R> static
void print_vector_impl(std::ostream& out, const CGAL::Vector_3<R> v, Null_functor)
{
out << v.x() << " " << v.y() << " " << v.z() << " " << 1;
}
template <typename R> static
void print_plane_impl(std::ostream& out, const CGAL::Plane_3<R> p, Null_functor)
{
out << p.a() << " " << p.b() << " " << p.c() << " " << p.d();
}
template <class R> static
void print_point(std::ostream& out, const CGAL::Point_3<R>& p) {
print_point_impl(out, Nef_3_internal::get_point(p) );
print_point_impl(out, Nef_3_internal::get_point(p), typename Fraction_traits<typename R::FT>::Decompose() );
}
template <class R> static
void print_vector(std::ostream& out, const CGAL::Vector_3<R>& v) {
print_vector_impl(out, Nef_3_internal::get_vector(v) );
print_vector_impl(out, Nef_3_internal::get_vector(v), typename Fraction_traits<typename R::FT>::Decompose() );
}
template <class R> static
void print_plane(std::ostream& out, const CGAL::Plane_3<R>& p) {
print_plane_impl(out, Nef_3_internal::get_plane(p) );
print_plane_impl(out, Nef_3_internal::get_plane(p), typename Fraction_traits<typename R::FT>::Decompose() );
}
};

View File

@ -563,7 +563,7 @@ public:
Partial_facet pf;
#endif
bool hit = false;
Point_3 eor; // 'end of ray', the latest ray's hit point
Point_3 eor = CGAL::ORIGIN; // 'end of ray', the latest ray's hit point
Objects_along_ray objects = candidate_provider->objects_along_ray(ray);
Objects_along_ray_iterator objects_iterator = objects.begin();
while( !hit && objects_iterator != objects.end()) {

View File

@ -24,6 +24,7 @@ if ( CGAL_FOUND )
execution___of__test_nef_3_io_Cartesian
execution___of__test_nef_3_io_Cartesian_Lazy
execution___of__test_nef_3_io_EPEC
execution___of__test_nef_3_io_EPIC
execution___of__test_nef_3_io_Homogeneous
execution___of__test_nef_3_io_Homogenoeus_Lazy
execution___of__test_with_extended_homogeneous

View File

@ -0,0 +1,57 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Nef_polyhedron_3.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Nef_polyhedron_iostream_3.h>
#include <fstream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel EPEC;
template <class Kernel>
void test_write_read()
{
typedef CGAL::Nef_polyhedron_3< Kernel > Nef_polyhedron;
typedef CGAL::Polyhedron_3< Kernel > Polyhedron;
typedef typename Kernel::Point_3 Point;
typename Kernel::RT n, d;
std::istringstream str_n("5");
str_n >> n;
std::istringstream str_d("1");
str_d >> d;
Point p(n, 0, 0, d);
Point q(0, n, 0, d);
Point r(0, 0, n, d);
Point s(0, 0, 0, 1);
std::cout << " build...\n";
Polyhedron P;
P.make_tetrahedron( p, q, r, s);
Nef_polyhedron nef_1( P );
std::cout << " write...\n";
std::ofstream out ("temp.nef");
out << std::setprecision(17) << nef_1;
out.close();
std::cout << " read...\n";
std::ifstream in ("temp.nef");
Nef_polyhedron nef_2;
in >> nef_2;
in.close();
std::cout << " check...\n";
assert( nef_1 == nef_2);
}
int main()
{
std::cout << "Testing Exact_predicates_inexact_constructions_kernel\n";
test_write_read<EPEC>();
std::cout << "Testing Simple_cartesian<double>\n";
test_write_read<CGAL::Simple_cartesian<double>>();
return 0;
}

View File

@ -49,12 +49,10 @@ typedef unspecified_type Exact_algebraic;
#else // not DOXYGEN_RUNNING
#ifdef CGAL_USE_CORE
typedef CORE::Expr Exact_algebraic;
#endif
#ifdef CGAL_USE_LEDA
typedef leda_real Exact_algebraic;
#elif defined CGAL_USE_CORE
typedef CORE::Expr Exact_algebraic;
#endif
#endif

View File

@ -68,6 +68,7 @@ if ( CGAL_FOUND )
create_single_source_cgal_program( "to_interval_test.cpp" )
create_single_source_cgal_program( "unsigned.cpp" )
create_single_source_cgal_program( "utilities.cpp" )
find_package( GMP )
if( GMP_FOUND )
create_single_source_cgal_program( "CORE_Expr_ticket_4296.cpp" )
find_package( MPFI )

View File

@ -98,7 +98,8 @@ void test_lazy_exact_nt() {
#ifdef CGAL_USE_CORE
CGAL_assertion_code(typedef CGAL::Lazy_exact_nt<leda_integer> T1;)
CGAL_assertion_code(typedef CGAL::Lazy_exact_nt<CORE::Expr> T2;)
CGAL_assertion_code(typedef CGAL::Coercion_traits<T1, T2> CT;)
typedef CGAL::Coercion_traits<T1, T2> CT;
CGAL_USE_TYPE(CT);
CGAL_static_assertion((boost::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_false>::value));
CGAL_static_assertion((boost::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_false>::value));
#endif
@ -115,4 +116,3 @@ int main() {
#endif
return 0;
}

View File

@ -5,18 +5,6 @@ EXTRACT_ALL = false
HIDE_UNDOC_CLASSES = true
WARN_IF_UNDOCUMENTED = true
# macros to be used inside the code
ALIASES += "cgalNamedParamsBegin=<dl class=\"params\"><dt>Named Parameters</dt><dd> <table class=\"params\">"
ALIASES += "cgalNamedParamsEnd=</table> </dd> </dl>"
ALIASES += "cgalParamBegin{1}=<tr><td class=\"paramname\">\ref OBB_\1 \"\1\"</td><td>"
ALIASES += "cgalParamEnd=</td></tr>"
#macros for NamedParameters.txt
ALIASES += "cgalNPTableBegin=<dl class=\"params\"><dt></dt><dd> <table class=\"params\">"
ALIASES += "cgalNPTableEnd=</table> </dd> </dl>"
ALIASES += "cgalNPBegin{1}=<tr><td class=\"paramname\">\1 </td><td>"
ALIASES += "cgalNPEnd=</td></tr>"
MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES
EXPAND_AS_DEFINED = CGAL_BGL_NP_TEMPLATE_PARAMETERS \

View File

@ -1,65 +0,0 @@
/*!
\defgroup obb_namedparameters Named Parameters for the package Optimal Bounding Box
\ingroup PkgOptimalBoundingBoxRef
In this package, the optional parameters of all functions are implemented as BGL optional
named parameters (see \ref BGLNamedParameters for more information on how to use them).
Since the parameters of the various functions defined in this package are redundant,
their long descriptions are centralized below.
The sequence of named parameters should start with `CGAL::parameters::`.
`CGAL::parameters::all_default()` can be used to indicate
that default values of optional named parameters must be used.
In the following, we assume that the following types are provided as template parameters
of functions and classes. Note that, for some of these functions,
the type is more specific:
<ul>
<li>`PolygonMesh` is a model of the concept `FaceGraph`</li>.
<li>`GeomTraits` a geometric traits class in which constructions are performed and
predicates evaluated. Everywhere in this package, a \cgal `Kernel` fulfills the requirements.</li>
</ul>
The following named parameters, offered by the package \ref PkgBGL
(see \ref bgl_namedparameters), are used in this package:
\cgalNPTableBegin
\cgalNPBegin{vertex_point_map} \anchor OBB_vertex_point_map
is the property map with the points associated to the vertices of the polygon mesh `pmesh`.\n
<b>Type:</b> a class model of `ReadablePropertyMap` with
`boost::graph_traits<PolygonMesh>::%vertex_descriptor` as key type and
`GeomTraits::Point_3` as value type. \n
<b>Default:</b> \code boost::get(CGAL::vertex_point, pmesh) \endcode
\cgalNPEnd
\cgalNPBegin{point_map} \anchor OBB_point_map
is the property map containing the points associated to the elements of the point range `points`.\n
<b>Type:</b> a class model of `ReadablePropertyMap` with `PointRange::iterator::value_type` as key type
and `geom_traits::Point_3` as value type. \n
<b>Default:</b> \code CGAL::Identity_property_map<geom_traits::Point_3>\endcode
\cgalNPEnd
\cgalNPTableEnd
In addition to these named parameters, this package offers the following named parameters:
\cgalNPTableBegin
\cgalNPBegin{geom_traits} \anchor OBB_geom_traits
is the geometric traits instance in which the mesh processing operation should be performed.\n
<b>Type:</b> a Geometric traits class.\n
<b>Default:</b>
\code typename CGAL::Kernel_traits<
typename boost::property_traits<
typename boost::property_map<PolygonMesh, CGAL::vertex_point_t>::type>::value_type>::Kernel \endcode
\cgalNPEnd
\cgalNPBegin{use_convex_hull} \anchor OBB_use_convex_hull
Parameter used in the construction of oriented bounding box to indicate whether the algorithm should
first extract the extreme points (points that are on the 3D convex hull) of the input data range
to accelerate the computation of the bounding box.
\n
<b>Type:</b> `bool` \n
<b>Default:</b> `true`
\cgalNPEnd
\cgalNPTableEnd
*/

View File

@ -94,7 +94,7 @@ and is enabled by default.
\subsection OBBInnOut Input and Output
The input can be a range of 3D points, or a mesh, with a variety of \ref obb_namedparameters "Named Parameters"
The input can be a range of 3D points, or a mesh, with a variety of \ref bgl_namedparameters "Named Parameters"
enabling using further custom inputs.
The result of the algorithm can be retrieved as:
@ -177,7 +177,7 @@ from the eight points.
\subsection OBBExampleNP Using Named Parameters
The following example illustrates how to use \ref obb_namedparameters "Named Parameters"
The following example illustrates how to use \ref bgl_namedparameters "Named Parameters"
to efficiently compute the oriented bounding box of a mesh whose vertices' positions are
modified on the fly.

View File

@ -35,7 +35,7 @@
\cgalCRPSection{Parameters}
Optional parameters of the functions of this package are implemented as \ref BGLNamedParameters.
The page \ref obb_namedparameters describes their usage and provides a list of the parameters
The page \ref bgl_namedparameters describes their usage and provides a list of the parameters
that are used in this package.
\cgalCRPSection{Concepts}

View File

@ -288,27 +288,34 @@ void construct_oriented_bounding_box(const PointRange& points,
/// \tparam Output either the type `Aff_transformation_3` of the traits class,
/// or `std::array<Point, 8>` with `Point` being equivalent to the type `%Point_3` of the traits class,
/// or a model of `MutableFaceGraph`
/// \tparam NamedParameters a sequence of \ref obb_namedparameters "Named Parameters"
/// \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
///
/// \param points the input range
/// \param out the resulting array of points or affine transformation
/// \param np an optional sequence of \ref obb_namedparameters "Named Parameters" among the ones listed below:
/// \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
///
/// \cgalNamedParamsBegin
/// \cgalParamBegin{point_map}
/// a model of `ReadablePropertyMap` with value type the type `%Point_3` of the traits class.
/// If this parameter is omitted, `CGAL::Identity_property_map<%Point_3>` is used.
/// \cgalParamEnd
/// \cgalParamBegin{geom_traits}
/// a geometric traits class instance, model of the concept `OrientedBoundingBoxTraits_3`.
/// %Default is a default construction object of type `CGAL::Oriented_bounding_box_traits_3<K>`
/// where `K` is a kernel type deduced from the point type.
/// \cgalParamEnd
/// \cgalParamBegin{use_convex_hull}
/// a Boolean value to indicate whether the algorithm should first extract the so-called extreme
/// points of the data range (i.e. construct the convex hull) to reduce the input data range
/// and accelerate the algorithm. %Default is `true`.
/// \cgalParamEnd
/// \cgalParamNBegin{point_map}
/// \cgalParamDescription{a property map associating points to the elements of the point range}
/// \cgalParamType{a model of `ReadablePropertyMap` with value type `geom_traits::Point_3`}
/// \cgalParamDefault{`CGAL::Identity_property_map<geom_traits::Point_3>`}
/// \cgalParamNEnd
///
/// \cgalParamNBegin{geom_traits}
/// \cgalParamDescription{an instance of a geometric traits class}
/// \cgalParamType{a model of `OrientedBoundingBoxTraits_3`}
/// \cgalParamDefault{a default-constructed object of type `CGAL::Oriented_bounding_box_traits_3<K>`,
/// where `K` is a kernel type deduced from the point type.}
/// \cgalParamNEnd
///
/// \cgalParamNBegin{use_convex_hull}
/// \cgalParamDescription{Parameter used in the construction of oriented bounding box to indicate
/// whether the algorithm should first extract the extreme points (points
/// that are on the 3D convex hull) of the input data range
/// to accelerate the computation of the bounding box.}
/// \cgalParamType{Boolean}
/// \cgalParamDefault{`true`}
/// \cgalParamNEnd
/// \cgalNamedParamsEnd
///
template <typename PointRange,
@ -379,28 +386,37 @@ void oriented_bounding_box(const PointRange& points,
/// \tparam Output either the type `Aff_transformation_3` of the traits class,
/// or `std::array<Point, 8>` with `Point` being equivalent to the type `%Point_3` of the traits class,
/// or a model of `MutableFaceGraph`
/// \tparam NamedParameters a sequence of \ref obb_namedparameters "Named Parameters"
/// \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
///
/// \param pmesh the input mesh
/// \param out the resulting array of points or affine transformation
/// \param np an optional sequence of \ref obb_namedparameters "Named Parameters" among the ones listed below:
/// \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
///
/// \cgalNamedParamsBegin
/// \cgalParamBegin{vertex_point_map}
/// the property map with the points associated to the vertices of `pmesh`.
/// If this parameter is omitted, an internal property map for
/// `CGAL::vertex_point_t` must be available in `PolygonMesh`.
/// \cgalParamEnd
/// \cgalParamBegin{geom_traits}
/// a geometric traits class instance, model of the concept `OrientedBoundingBoxTraits_3`.
/// %Default is a default construction object of type `CGAL::Oriented_bounding_box_traits_3<K>`
/// where `K` is a kernel type deduced from the point type.
/// \cgalParamEnd
/// \cgalParamBegin{use_convex_hull}
/// a Boolean value to indicate whether the algorithm should first extract the so-called extreme
/// points of the data range (i.e. construct the convex hull) to reduce the input data range
/// and accelerate the algorithm. %Default is `true`.
/// \cgalParamEnd
/// \cgalParamNBegin{vertex_point_map}
/// \cgalParamDescription{a property map associating points to the vertices of `pmesh`}
/// \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits<PolygonMesh>::%vertex_descriptor`
/// as key type and `%Point_3` as value type}
/// \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`}
/// \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
/// should be available for the vertices of `pmesh`.}
/// \cgalParamNEnd
///
/// \cgalParamNBegin{geom_traits}
/// \cgalParamDescription{an instance of a geometric traits class}
/// \cgalParamType{a model of `OrientedBoundingBoxTraits_3`}
/// \cgalParamDefault{a default-constructed object of type `CGAL::Oriented_bounding_box_traits_3<K>`,
/// where `K` is a kernel type deduced from the point type.}
/// \cgalParamNEnd
///
/// \cgalParamNBegin{use_convex_hull}
/// \cgalParamDescription{Parameter used in the construction of oriented bounding box to indicate
/// whether the algorithm should first extract the extreme points (points
/// that are on the 3D convex hull) of the input data range
/// to accelerate the computation of the bounding box.}
/// \cgalParamType{Boolean}
/// \cgalParamDefault{`true`}
/// \cgalParamNEnd
/// \cgalNamedParamsEnd
///
template <typename PolygonMesh,

View File

@ -113,6 +113,7 @@ template <class Circulator>
class Construct_circulator_2
{
public:
typedef Circulator result_type;
Circulator operator()(Circulator p1) const { return p1; }
};

View File

@ -40,6 +40,14 @@ public:
using Base::operator();
template<typename F>
struct result : Base::template result<F> {};
template<typename F>
struct result<F(Point_3)> {
typedef const Point_3& type;
};
const Point_3& operator()(const Point_3& p) const { return p; }
};

View File

@ -49,6 +49,14 @@ public:
using Base::operator(); // for K::Weighted_point_3 to Point_3
template<typename F>
struct result : Base::template result<F> {};
template<typename F>
struct result<F(Weighted_point_3)> {
typedef Point_3 type;
};
Point_3 operator()(const Weighted_point_3& wp) const {
return std::make_pair(operator()(wp.first), wp.second /* offset */);
}

View File

@ -1,14 +1,2 @@
@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS}
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - 3D Point Set"
# macros to be used inside the code
ALIASES += "cgalNamedParamsBegin=<dl class=\"params\"><dt>Named Parameters</dt><dd> <table class=\"params\">"
ALIASES += "cgalNamedParamsEnd=</table> </dd> </dl>"
ALIASES += "cgalParamBegin{1}=<tr><td class=\"paramname\">\ref PSP_\1 \"\1\"</td><td>"
ALIASES += "cgalParamEnd=</td></tr>"
#macros for NamedParameters.txt
ALIASES += "cgalNPTableBegin=<dl class=\"params\"><dt></dt><dd> <table class=\"params\">"
ALIASES += "cgalNPTableEnd=</table> </dd> </dl>"
ALIASES += "cgalNPBegin{1}=<tr><td class=\"paramname\">\1 </td><td>"
ALIASES += "cgalNPEnd=</td></tr>"

View File

@ -947,13 +947,12 @@ public:
/*!
\brief Returns a sequence of \ref psp_namedparameters "Named Parameters" for Point Set Processing algorithms.
\brief Returns a sequence of \ref bgl_namedparameters "Named Parameters" to be used in Point Set Processing algorithms.
\cgalNamedParamsBegin
\cgalParamBegin{point_map} contains the point map (see `point_map()`)\cgalParamEnd
\cgalParamBegin{normal_map} contains the normal map (see `normal_map()`)\cgalParamEnd
\cgalParamBegin{geom_traits} contains the kernel `typename Kernel_traits<Point>`::`Kernel`\cgalParamEnd
\cgalNamedParamsEnd
The following named parameters are used:
- `point_map`: contains the point property map (see `point_map()`)
- `normal_map`: contains the normal map (see `normal_map()`)
- `geom_traits`: contains the kernel `typename Kernel_traits<Point>`::`Kernel`
\warning this method does not check if the normal map was
instanciated or not. The normal map named parameter should not be

View File

@ -3,17 +3,5 @@
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Point Set Processing"
EXCLUDE_PATTERNS += property_map.h
# macros to be used inside the code
ALIASES += "cgalNamedParamsBegin=<dl class=\"params\"><dt>Named Parameters</dt><dd> <table class=\"params\">"
ALIASES += "cgalNamedParamsEnd=</table> </dd> </dl>"
ALIASES += "cgalParamBegin{1}=<tr><td class=\"paramname\">\ref PSP_\1 \"\1\"</td><td>"
ALIASES += "cgalParamEnd=</td></tr>"
#macros for NamedParameters.txt
ALIASES += "cgalNPTableBegin=<dl class=\"params\"><dt></dt><dd> <table class=\"params\">"
ALIASES += "cgalNPTableEnd=</table> </dd> </dl>"
ALIASES += "cgalNPBegin{1}=<tr><td class=\"paramname\">\1 </td><td>"
ALIASES += "cgalNPEnd=</td></tr>"
EXPAND_AS_DEFINED = CGAL_BGL_NP_TEMPLATE_PARAMETERS \
CGAL_BGL_NP_CLASS

View File

@ -1,280 +0,0 @@
/*!
\defgroup psp_namedparameters Named Parameters for Point Set Processing
\ingroup PkgPointSetProcessing3Ref
In this package, all functions optional parameters are implemented as BGL optional named parameters (see \ref BGLNamedParameters for more information on how to use them).
Since the parameters of the various point set processing functions defined in this
package are redundant, their long descriptions are centralized below.
In the following, we assume that the following types are provided as template parameters of point set processing functions and classes. Note that, for some of these functions, the type is more specific.
<ul>
<li>`PointRange` is a model of `Range`. The value type of its iterator is the key type of the related property maps (see below).</li>
<li>`GeomTraits` a geometric traits class in which constructions are performed and predicates evaluated. Everywhere in this package, a \cgal `Kernel` fulfills the requirements.</li>
</ul>
`CGAL::parameters::all_default()` can be used to indicate
that default values of optional named parameters must be used.
Here is the list of the named parameters available in this package:
\cgalNPTableBegin
\cgalNPBegin{geom_traits} \anchor PSP_geom_traits
the geometric traits instance in which the point set processing operation should be performed.\n
\b Type: a Geometric traits class.\n
\b Default \b type: is
\code
typename CGAL::Kernel_traits<point_map::value_type>::Kernel
\endcode
\cgalNPEnd
\cgalNPBegin{point_map} \anchor PSP_point_map
is the property map containing the points associated to the elements of the point range `points`.\n
\b Type: a class model of `ReadablePropertyMap` with
`PointRange::iterator::value_type` as key type and
`geom_traits::Point_3` as value type. \n
<b>Default value</b>: \code CGAL::Identity_property_map<geom_traits::Point_3>\endcode
\cgalNPEnd
\cgalNPBegin{normal_map} \anchor PSP_normal_map
is the property map containing the normal vectors associated to the elements of the point range `points`.\n
\b Type: a class model of `ReadablePropertyMap` with
`PointRange::iterator::value_type` as key type and
`geom_traits::Vector_3` as value type. \n
No default value.
\cgalNPEnd
\cgalNPBegin{diagonalize_traits} \anchor PSP_diagonalize_traits
is the solver used for diagonalizing covariance matrices.\n
\b Type: a class model of `DiagonalizeTraits`.\n
\b Default: `CGAL::Eigen_diagonalize_traits` if \ref thirdpartyEigen "Eigen" 3.2 (or greater) is available and `CGAL_EIGEN3_ENABLED` is defined.\n
\cgalNPEnd
\cgalNPBegin{svd_traits} \anchor PSP_svd_traits
is the linear algebra algorithm required by the jet fitting method. For more information, please refer to the documentation of `CGAL::Monge_via_jet_fitting`.\n
\b Type: a class fitting the requirements of `CGAL::Monge_via_jet_fitting`.\n
\b Default: if \ref thirdpartyEigen "Eigen" 3.2 (or greater) is available and `CGAL_EIGEN3_ENABLED` is defined, then `CGAL::Eigen_svd` is used.\n
\cgalNPEnd
\cgalNPBegin{callback} \anchor PSP_callback
is a mechanism to get feedback on the advancement of the algorithm while it's running and to interrupt it if needed. It is called regularly when the algorithm is running: the current advancement (between 0. and 1.) is passed as parameter. If it returns `true`, then the algorithm continues its execution normally; if it returns `false`, the algorithm is stopped.\n
The callback will be copied and therefore needs to be lightweight.\n
Note that when a callback is run on a parallelized algorithm with `CGAL::Parallel_tag`, it is called asynchronously on a separate thread and shouldn't access or modify the variables that are parameters of the algorithm.\n
\b Type: `std::function<bool(double)>`.\n
\b Default: empty function.\n
\cgalNPEnd
\cgalNPBegin{query_point_map} \anchor PSP_query_point_map
is the property map containing the points associated to the elements of the point range `queries`.\n
\b Type: a class model of `ReadablePropertyMap` with
`PointRange::iterator::value_type` as key type and
`geom_traits::Point_3` as value type. \n
<b>Default value</b>: \code CGAL::Identity_property_map<geom_traits::Point_3>\endcode
\cgalNPEnd
\cgalNPBegin{sharpness_angle} \anchor PSP_sharpness_angle
controls the sharpness of the result. The larger the value is, the smoother the result will be.
The range of possible value is [0, 90].\n
\b Type: floating scalar value\n
<b>Default value</b>: `30.`
\cgalNPEnd
\cgalNPBegin{edge_sensitivity} \anchor PSP_edge_sensitivity
controls the priority of points inserted along sharp features. Larger
values of edge-sensitivity give higher priority to inserting points
along sharp features. The range of possible values is `[0, 1]`. \n
\b Type: floating scalar value\n
<b>Default value</b>: `1`.
\cgalNPEnd
\cgalNPBegin{neighbor_radius} \anchor PSP_neighbor_radius
is the spherical neighborhood radius.\n
\b Type: floating scalar value\n
<b>Default value</b>: `-1`, in which case it is not used.
\cgalNPEnd
\cgalNPBegin{number_of_output_points} \anchor PSP_number_of_output_points
is the number of output points to generate.\n
\b Type: \c unsigned \c int \n
<b>Default value</b>: `1000`
\cgalNPEnd
\cgalNPBegin{size} \anchor PSP_size
maximum cluster size for hierarchical clustering. Must be strictly greather than 0.\n
\b Type: \c unsigned \c int \n
<b>Default value</b>: `10`
\cgalNPEnd
\cgalNPBegin{maximum_variation} \anchor PSP_maximum_variation
maximum cluster size for hierarchical clustering. Must be strictly greather than 0.\n
\b Type: \c unsigned \c int \n
<b>Default value</b>: `10`
\cgalNPEnd
\cgalNPBegin{degree_fitting} \anchor PSP_degree_fitting
is the degree of fitting (see `CGAL::Monge_via_jet_fitting`).\n
\b Type: \c unsigned \c int \n
<b>Default value</b>: `2`
\cgalNPEnd
\cgalNPBegin{degree_monge} \anchor PSP_degree_monge
is the Monge degree (see `CGAL::Monge_via_jet_fitting`).\n
\b Type: \c unsigned \c int \n
<b>Default value</b>: `2`
\cgalNPEnd
\cgalNPBegin{threshold_distance} \anchor PSP_threshold_distance
is the minimum distance for a point to be considered as outlier
(distance here is the square root of the average squared distance to K nearest neighbors).\n
\b Type: floating scalar value\n
<b>Default value</b>: `0`
\cgalNPEnd
\cgalNPBegin{threshold_percent} \anchor PSP_threshold_percent
is the maximum percentage (between 0 and 100) of points to remove in `remove_outliers()`.\n
\b Type: floating scalar value\n
<b>Default value</b>: `10`
\cgalNPEnd
\cgalNPBegin{attraction_factor} \anchor PSP_attraction_factor
multiplication factor used for adjacency computations.
\b Type: floating scalar value\n
<b>Default value</b>: `3`
\cgalNPEnd
\cgalNPBegin{plane_map} \anchor PSP_plane_map
is the property map containing the planes associated to the elements of the plane range `planes`.\n
\b Type: a class model of `ReadablePropertyMap` with
`PlaneRange::iterator::value_type` as key type and
`geom_traits::Plane_3` as value type. \n
<b>Default value</b>: \code CGAL::Identity_property_map<geom_traits::Plane_3>\endcode
\cgalNPEnd
\cgalNPBegin{plane_index_map} \anchor PSP_plane_index_map
is the property map that associates the index of a point in the input range to the index of plane (-1 if
point is not assigned to a plane).\n
\b Type: a class model of `ReadablePropertyMap` with
`std::size_t` as key type and
`int` as value type. \n
No default value.
\cgalNPEnd
\cgalNPBegin{select_percentage} \anchor PSP_select_percentage
percentage of points to retain (between 0 and 100) in `wlop_simplify_and_regularize_point_set()`.\n
\b Type: floating scalar value\n
<b>Default value</b>: 5.
\cgalNPEnd
\cgalNPBegin{number_of_iterations} \anchor PSP_number_of_iterations
number of iterations to solve the optimsation problem in `wlop_simplify_and_regularize_point_set()`.\n
\b Type: \c unsigned \c int \n
<b>Default value</b>: 35.
\cgalNPEnd
\cgalNPBegin{require_uniform_sampling} \anchor PSP_require_uniform_sampling
turn on or off an optional preprocessing of `wlop_simplify_and_regularize_point_set()`, which will
give better result if the distribution of the input points is highly non-uniform.\n
\b Type: `bool`\n
<b>Default value</b>: `false`
\cgalNPEnd
\cgalNPBegin{point_is_constrained_map} \anchor PSP_point_is_constrained_map
is the property map containing information about points being constrained or not.
Constrained points are left unaltered and are used as seeds in `mst_orient_normals()`.\n
\b Type: a class model of `ReadablePropertyMap` with
`PointRange::iterator::value_type` as key type and
`bool` as value type. \n
<b>Default value</b>: a property map with only the highest point constrained.
\cgalNPEnd
\cgalNPBegin{number_of_samples} \anchor PSP_number_of_samples
is the number of input points used for computation.\n
\b Type: \c unsigned \c int \n
<b>Default value</b>: `200`
\cgalNPEnd
\cgalNPBegin{accuracy} \anchor PSP_accuracy
is the wanted output accuracy, expressed in scene units.\n
\b Type: floating scalar value\n
<b>Default value</b>: `5.00`
\cgalNPEnd
\cgalNPBegin{maximum_normal_deviation} \anchor PSP_maximum_normal_deviation
is the maximum angle between the normals of a pair of points, expressed in degrees.\n
\b Type: floating scalar value\n
<b>Default value</b>: `90.00`
\cgalNPEnd
\cgalNPBegin{overlap} \anchor PSP_overlap
is the expected overlap ratio (between 0 and 1) between two points sets to register.\n
\b Type: floating scalar value\n
<b>Default value</b>: `0.20`
\cgalNPEnd
\cgalNPBegin{maximum_running_time} \anchor PSP_maximum_running_time
is the maximum time (in seconds) allowed to the function before ending and returning the best solution found so far.\n
\b Type: floating scalar value\n
<b>Default value</b>: `1000`
\cgalNPEnd
\cgalNPBegin{transformation} \anchor PSP_transformation
is the transformation to be applied to the point set before the function starts to further process.\n
\b Type: Aff_transformation_3\n
No default value.
\cgalNPEnd
\cgalNPBegin{point_set_filters} \anchor PSP_point_set_filters
is the chain of filters to be applied to the point set.\n
\b Type: a model of `Range` with `CGAL::pointmatcher::ICP_config` as value type.\n
No default value.
\cgalNPEnd
\cgalNPBegin{matcher} \anchor PSP_matcher
is the method used for matching (linking) the point set to the reference point set.\n
\b Type: a model of `CGAL::pointmatcher::ICP_config`\n
No default value.
\cgalNPEnd
\cgalNPBegin{outlier_filters} \anchor PSP_outlier_filters
is the chain of filters to be applied to the matched (linked) point set after each processing iteration of the registration to reject the outliers for the next iteration.\n
\b Type: a model of `Range` with `CGAL::pointmatcher::ICP_config` as value type.\n
No default value.
\cgalNPEnd
\cgalNPBegin{error_minimizer} \anchor PSP_error_minimizer
is the error minimizer that computes a transformation matrix such as to minimize the error between the point sets in registration process.\n
\b Type: a model of `CGAL::pointmatcher::ICP_config`\n
No default value.
\cgalNPEnd
\cgalNPBegin{transformation_checkers} \anchor PSP_transformation_checkers
is the chain of transformation checkers that can stop the iteration depending on the conditions it defines.\n
\b Type: a model of `Range` with `CGAL::pointmatcher::ICP_config` as value type.\n
No default value.
\cgalNPEnd
\cgalNPBegin{inspector} \anchor PSP_inspector
is the inspector that allows to log data at different steps of the running algorithm to allow analysis.\n
\b Type: a model of `CGAL::pointmatcher::ICP_config`\n
No default value.
\cgalNPEnd
\cgalNPBegin{logger} \anchor PSP_logger
is for logging information regarding the process.\n
\b Type: a model of `CGAL::pointmatcher::ICP_config`\n
No default value.
\cgalNPBegin{adjacencies} \anchor PSP_adjacencies
is an output iterator used to store adjacencies.\n
\b Type: a class model of `OutputIterator` that accepts objects of
type `std::pair<std::size_t, std::size_t>`. \n
<b>Default value</b>: `CGAL::Emptyset_iterator`.
\cgalNPEnd
\cgalNPTableEnd
*/

View File

@ -68,8 +68,7 @@ on how to upgrade from the outdated API.
Named parameters are used to deal with optional parameters. The page
\ref BGLNamedParameters explains the rationale and API in general.
The page \ref psp_namedparameters describes their usage
and provides a list of the parameters that are used in this package.
The page \ref bgl_namedparameters describes their usage.
\subsection Point_set_processing_3PropertyMaps Property Maps
@ -172,8 +171,7 @@ The following functions are available:
All of these functions (with the exception of the LAS format) can read
and write either points alone or points with normals (depending on
whether the [normal_map](@ref PSP_normal_map) is provided by the user
or not).
whether the `normal_map` named parameter is used by the user or not).
Note that the %PLY format handles both ASCII and binary formats. In
addition, %PLY and %LAS are extensible formats that can embed additional

View File

@ -428,12 +428,20 @@ bool read_las_points_with_properties (std::istream& stream,
\param stream input stream.
\param output output iterator over points.
\param np optional sequence of \ref psp_namedparameters "Named Parameters" among the ones listed below.
\param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
\cgalNamedParamsBegin
\cgalParamBegin{point_map} a model of `WritablePropertyMap` with value type `geom_traits::Point_3`.
If this parameter is omitted, `CGAL::Identity_property_map<geom_traits::Point_3>` is used.\cgalParamEnd
\cgalParamBegin{geom_traits} an instance of a geometric traits class, model of `Kernel`\cgalParamEnd
\cgalParamNBegin{point_map}
\cgalParamDescription{a property map associating points to the elements of the point range}
\cgalParamType{a model of `WritablePropertyMap` with value type `geom_traits::Point_3`}
\cgalParamDefault{`CGAL::Identity_property_map<geom_traits::Point_3>`}
\cgalParamNEnd
\cgalParamNBegin{geom_traits}
\cgalParamDescription{an instance of a geometric traits class}
\cgalParamType{a model of `Kernel`}
\cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`}
\cgalParamNEnd
\cgalNamedParamsEnd
\return true on success.

Some files were not shown because too many files have changed in this diff Show More