Merge remote-tracking branch 'cgal/master' into Triangulation_3-CDT_3-lrineau

# Conflicts:
#	Installation/CHANGES.md
This commit is contained in:
Jane Tournois 2025-06-10 11:18:38 +02:00
commit 0ab9d3eebf
471 changed files with 50959 additions and 758 deletions

View File

@ -29,6 +29,7 @@ permissions:
jobs: jobs:
pre_build_checks: pre_build_checks:
if: ${{ inputs.pr_number || startsWith(github.event.comment.body, '/build:') || startsWith(github.event.comment.body, '/force-build:') }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: Trigger the build? name: Trigger the build?
outputs: outputs:

View File

@ -1,4 +1,4 @@
/// \defgroup PkgAABBTreeRef AABB Tree Reference /// \defgroup PkgAABBTreeRef Reference Manual
/// \defgroup PkgAABBTreeConcepts Concepts /// \defgroup PkgAABBTreeConcepts Concepts
/// \ingroup PkgAABBTreeRef /// \ingroup PkgAABBTreeRef

View File

@ -395,15 +395,15 @@ public:
public: public:
CGAL::Comparison_result operator()(const Point& p, const Bounding_box& bb, const Point& bound, Tag_true) const CGAL::Comparison_result operator()(const Point& p, const Bounding_box& bb, const Point& bound, Tag_true) const
{ {
return GeomTraits().do_intersect_2_object() return do_intersect_circle_iso_rectangle_2
(GeomTraits().construct_circle_2_object() (GeomTraits().construct_circle_2_object()
(p, GeomTraits().compute_squared_distance_2_object()(p, bound)), bb,true)? (p, GeomTraits().compute_squared_distance_2_object()(p, bound)), bb)?
CGAL::SMALLER : CGAL::LARGER; CGAL::SMALLER : CGAL::LARGER;
} }
CGAL::Comparison_result operator()(const Point& p, const Bounding_box& bb, const Point& bound, Tag_false) const CGAL::Comparison_result operator()(const Point& p, const Bounding_box& bb, const Point& bound, Tag_false) const
{ {
return GeomTraits().do_intersect_2_object() return do_intersect_circle_iso_rectangle_2
(GeomTraits().construct_circle_2_object() (GeomTraits().construct_circle_2_object()
(p, GeomTraits().compute_squared_distance_2_object()(p, bound)), bb)? (p, GeomTraits().compute_squared_distance_2_object()(p, bound)), bb)?
CGAL::SMALLER : CGAL::LARGER; CGAL::SMALLER : CGAL::LARGER;
@ -433,6 +433,45 @@ public:
CGAL::SMALLER : CGAL::SMALLER :
CGAL::LARGER; CGAL::LARGER;
} }
typename GeomTraits::Boolean do_intersect_circle_iso_rectangle_2(const typename GeomTraits::Circle_2& circle,
const typename GeomTraits::Iso_rectangle_2& rec) const
{
typedef typename GeomTraits::FT FT;
typedef typename GeomTraits::Point_2 Point;
Point center = circle.center();
// Check that the minimum distance to the box is smaller than the radius, otherwise there is
// no intersection. `distance` stays at 0 if the center is inside or on `rec`.
FT distance = FT(0);
if (center.x() < rec.xmin())
{
FT d = rec.xmin() - center.x();
distance += d * d;
}
else if (center.x() > rec.xmax())
{
FT d = center.x() - rec.xmax();
distance += d * d;
}
if (center.y() < rec.ymin())
{
FT d = rec.ymin() - center.y();
distance += d * d;
}
else if (center.y() > rec.ymax())
{
FT d = center.y() - rec.ymax();
distance += d * d;
}
if (distance <= circle.squared_radius())
return true;
return false;
}
}; };
Closest_point closest_point_object() const {return Closest_point(*this);} Closest_point closest_point_object() const {return Closest_point(*this);}

View File

@ -0,0 +1,80 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Exact_rational.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits_2.h>
#include <CGAL/AABB_triangle_primitive_2.h>
#include <CGAL/IO/polygon_soup_io.h>
#include <array>
#include <iostream>
#include <string>
#include <vector>
template<typename Kernel>
void test(const std::vector<CGAL::Simple_cartesian<double>::Point_2> &points, const std::vector<std::array<std::size_t, 3> > &faces) {
using Point_2 = typename Kernel::Point_2;
using Triangle_2 = typename Kernel::Triangle_2;
using Iterator = typename std::vector<Triangle_2>::const_iterator;
using Primitive = CGAL::AABB_triangle_primitive_2<Kernel, Iterator>;
using Tree_traits = CGAL::AABB_traits_2<Kernel, Primitive>;
using Tree = CGAL::AABB_tree<Tree_traits>;
std::vector<Triangle_2> triangles(faces.size());
for (std::size_t i = 0; i < faces.size(); ++i) {
const auto& f = faces[i];
triangles[i] = Triangle_2(Point_2(points[f[0]].x(), points[f[0]].y()), Point_2(points[f[1]].x(), points[f[1]].y()), Point_2(points[f[2]].x(), points[f[2]].y()));
}
Tree tree(triangles.begin(), triangles.end());
// Without hint
Point_2 query(-0.092372499264859229, -0.5067061545706153);
Point_2 closest_point = tree.closest_point(query);
std::cout << "Closest point to " << query << " is " << closest_point << std::endl;
// With hint
Point_2 hint(-0.077185400000000001, -0.42269299999999999);
Point_2 closest_point_hint = tree.closest_point(query, hint);
std::cout << "Closest point to " << query << " with hint " << hint << " is " << closest_point_hint << std::endl << std::endl;
assert(closest_point == closest_point_hint);
}
int main(int argc, char** argv)
{
std::cout.precision(17);
// Read the input
const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/camel.off");
std::cout << "Reading " << filename << "..." << std::endl;
std::vector<CGAL::Simple_cartesian<double>::Point_3> points;
std::vector<std::array<std::size_t, 3> > faces;
if (!CGAL::IO::read_polygon_soup(filename, points, faces) || faces.empty())
{
std::cerr << "Invalid input:" << filename << std::endl;
return EXIT_FAILURE;
}
std::cout << "Input: " << points.size() << " points, " << faces.size() << " faces" << std::endl;
// Project onto the XY plane
std::vector<CGAL::Simple_cartesian<double>::Point_2> points_2(points.size());
for (std::size_t i = 0; i < points.size(); ++i)
points_2[i] = CGAL::Simple_cartesian<double>::Point_2(points[i].x(), points[i].y());
std::cout << "Testing closest point with Simple_cartesian<double>:" << std::endl;
test<CGAL::Simple_cartesian<double> >(points_2, faces);
std::cout << "Testing closest point with Epick:" << std::endl;
test<CGAL::Exact_predicates_inexact_constructions_kernel>(points_2, faces);
std::cout << "Testing closest point with Epeck:" << std::endl;
test<CGAL::Exact_predicates_exact_constructions_kernel>(points_2, faces);
std::cout << "Testing closest point with Simple_cartesian<Exact_rational>:" << std::endl;
test<CGAL::Simple_cartesian<CGAL::Exact_rational>>(points_2, faces);
std::cout << "Done." << std::endl;
return EXIT_SUCCESS;
}

View File

@ -49,7 +49,7 @@ We describe next the algorithm and provide examples.
\note A \ref tuto_reconstruction "detailed tutorial on surface reconstruction" \note A \ref tuto_reconstruction "detailed tutorial on surface reconstruction"
is provided with a guide to choose the most appropriate method along is provided with a guide to choose the most appropriate method along
with pre- and post-processing. with pre- and postprocessing.
\section AFSR_Definitions Definitions and the Algorithm \section AFSR_Definitions Definitions and the Algorithm

View File

@ -1,4 +1,4 @@
/// \defgroup PkgAdvancingFrontSurfaceReconstructionRef Advancing Front Surface Reconstruction Reference /// \defgroup PkgAdvancingFrontSurfaceReconstructionRef Reference Manual
/// \defgroup PkgAdvancingFrontSurfaceReconstructionRefConcepts Concepts /// \defgroup PkgAdvancingFrontSurfaceReconstructionRefConcepts Concepts
/// \ingroup PkgAdvancingFrontSurfaceReconstructionRef /// \ingroup PkgAdvancingFrontSurfaceReconstructionRef

View File

@ -382,7 +382,7 @@ namespace CGAL {
int _facet_number; int _facet_number;
//--------------------------------------------------------------------- //---------------------------------------------------------------------
// For post-processing // For postprocessing
mutable int _postprocessing_counter; mutable int _postprocessing_counter;
int _size_before_postprocessing; int _size_before_postprocessing;
@ -2432,7 +2432,7 @@ namespace CGAL {
std::size_t itmp, L_v_size_mem; std::size_t itmp, L_v_size_mem;
L_v_size_mem = L_v.size(); L_v_size_mem = L_v.size();
if ((vh_on_border_inserted != 0)&& // to post-process only the borders if ((vh_on_border_inserted != 0)&& // to postprocess only the borders
(L_v.size() < .1 * _size_before_postprocessing)) (L_v.size() < .1 * _size_before_postprocessing))
{ {
{ {

View File

@ -80,12 +80,12 @@ using overloaded functions. However, for ease of use and backward
compatibility all functionality is also compatibility all functionality is also
accessible through global functions defined within namespace `CGAL`, accessible through global functions defined within namespace `CGAL`,
e.g., \link sqrt `CGAL::sqrt(x)` \endlink. This is realized via function templates using e.g., \link sqrt `CGAL::sqrt(x)` \endlink. This is realized via function templates using
the according functor of the traits class. For an overview see the according functor of the traits class. For an overview see the section "Global Functions" in the
Section \ref PkgAlgebraicFoundationsRef in the reference manual. \ref PkgAlgebraicFoundationsRef.
\subsection Algebraic_foundationsTagsinAlgebraicStructure Tags in Algebraic Structure Traits \subsection Algebraic_foundationsTagsinAlgebraicStructure Tags in Algebraic Structure Traits
\subsection Algebraic_foundationsAlgebraicCategory Algebraic Category \subsubsection Algebraic_foundationsAlgebraicCategory Algebraic Category
For a type `AS`, `Algebraic_structure_traits<AS>` For a type `AS`, `Algebraic_structure_traits<AS>`
provides several tags. The most important tag is the `Algebraic_category` provides several tags. The most important tag is the `Algebraic_category`
@ -100,7 +100,7 @@ The tags are derived from each other such that they reflect the
hierarchy of the algebraic structure concept, e.g., hierarchy of the algebraic structure concept, e.g.,
`Field_with_sqrt_tag` is derived from `Field_tag`. `Field_with_sqrt_tag` is derived from `Field_tag`.
\subsection Algebraic_foundationsExactandNumericalSensitive Exact and Numerical Sensitive \subsubsection Algebraic_foundationsExactandNumericalSensitive Exact and Numerical Sensitive
Moreover, `Algebraic_structure_traits<AS>` provides the tags `Is_exact` Moreover, `Algebraic_structure_traits<AS>` provides the tags `Is_exact`
and `Is_numerical_sensitive`, which are both `Boolean_tag`s. and `Is_numerical_sensitive`, which are both `Boolean_tag`s.

View File

@ -1,4 +1,4 @@
/// \defgroup PkgAlgebraicFoundationsRef Algebraic Foundations Reference /// \defgroup PkgAlgebraicFoundationsRef Reference Manual
/// \defgroup PkgAlgebraicFoundationsAlgebraicStructuresConcepts Concepts /// \defgroup PkgAlgebraicFoundationsAlgebraicStructuresConcepts Concepts
/// \ingroup PkgAlgebraicFoundationsRef /// \ingroup PkgAlgebraicFoundationsRef

View File

@ -1,4 +1,4 @@
/// \defgroup PkgAlgebraicKernelDRef Algebraic Kernel Reference /// \defgroup PkgAlgebraicKernelDRef Reference Manual
/// \defgroup PkgAlgebraicKernelDConcepts Concepts /// \defgroup PkgAlgebraicKernelDConcepts Concepts
/// \ingroup PkgAlgebraicKernelDRef /// \ingroup PkgAlgebraicKernelDRef

View File

@ -1,4 +1,4 @@
/// \defgroup PkgAlphaShapes2Ref 2D Alpha Shapes Reference /// \defgroup PkgAlphaShapes2Ref Reference Manual
/// \defgroup PkgAlphaShapes2Concepts Concepts /// \defgroup PkgAlphaShapes2Concepts Concepts
/// \ingroup PkgAlphaShapes2Ref /// \ingroup PkgAlphaShapes2Ref

View File

@ -1,4 +1,4 @@
/// \defgroup PkgAlphaShapes3Ref 3D Alpha Shapes Reference /// \defgroup PkgAlphaShapes3Ref Reference Manual
/// \defgroup PkgAlphaShapes3Concepts Concepts /// \defgroup PkgAlphaShapes3Concepts Concepts
/// \ingroup PkgAlphaShapes3Ref /// \ingroup PkgAlphaShapes3Ref
/*! /*!

View File

@ -1,4 +1,4 @@
/// \defgroup PkgAlphaWrap3Ref 3D Alpha Wrapping /// \defgroup PkgAlphaWrap3Ref Reference Manual
/// \defgroup AW3_free_functions_grp Free Functions /// \defgroup AW3_free_functions_grp Free Functions
/// Functions to create a wrap from point clouds, triangle soups, and triangle meshes. /// Functions to create a wrap from point clouds, triangle soups, and triangle meshes.

View File

@ -348,7 +348,7 @@ public:
#ifdef CGAL_AW3_TIMER #ifdef CGAL_AW3_TIMER
t.stop(); t.stop();
std::cout << "Manifoldness post-processing took: " << t.time() << " s." << std::endl; std::cout << "Manifoldness postprocessing took: " << t.time() << " s." << std::endl;
t.reset(); t.reset();
t.start(); t.start();
#endif #endif

View File

@ -1,4 +1,4 @@
/// \defgroup PkgApolloniusGraph2Ref 2D Apollonius Graphs (Delaunay Graphs of Disks) Reference /// \defgroup PkgApolloniusGraph2Ref Reference Manual
/// \defgroup PkgApolloniusGraph2Concepts Concepts /// \defgroup PkgApolloniusGraph2Concepts Concepts
/// \ingroup PkgApolloniusGraph2Ref /// \ingroup PkgApolloniusGraph2Ref
/*! /*!

View File

@ -4196,7 +4196,7 @@ are both parameterized by a geometric kernel and model the concepts
`AosTraits_2` and `AosLandmarkTraits_2`. `AosTraits_2` and `AosLandmarkTraits_2`.
\cgalFootnote{They also model the refined concept \cgalFootnote{They also model the refined concept
\cgalFootnoteCode{AosDirectionalXMonotoneTraits_2}, which enables Boolean set \cgalFootnoteCode{AosDirectionalXMonotoneTraits_2}, which enables Boolean set
operations; see Package \ref PkgBooleanSetOperations2Ref.} The class operations; see Package \ref PkgBooleanSetOperations2.} The class
template `Arr_non_caching_segment_traits_2<Kernel>` derives from the template `Arr_non_caching_segment_traits_2<Kernel>` derives from the
instance `Arr_non_caching_segment_basic_traits_2<Kernel>`, which instance `Arr_non_caching_segment_basic_traits_2<Kernel>`, which
models the `AosLandmarkTraits_2` traits concept but not the models the `AosLandmarkTraits_2` traits concept but not the
@ -4937,7 +4937,7 @@ template models the concepts `AosTraits_2` and
`AosOpenBoundaryTraits_2`, but it does not model the `AosOpenBoundaryTraits_2`, but it does not model the
`AosLandmarkTraits_2` concept. It also models the refined `AosLandmarkTraits_2` concept. It also models the refined
concept `AosDirectionalXMonotoneTraits_2`, which enables concept `AosDirectionalXMonotoneTraits_2`, which enables
Boolean set operations; see Package \ref PkgBooleanSetOperations2Ref. Boolean set operations; see Package \ref PkgBooleanSetOperations2.
Note that it is not a model of `AosLandmarkTraits_2` concept, Note that it is not a model of `AosLandmarkTraits_2` concept,
so it is impossible to use the landmark point-location strategy with so it is impossible to use the landmark point-location strategy with
this traits class. this traits class.
@ -5167,7 +5167,7 @@ Every instance of the `Arr_Bezier_curve_traits_2` class templates
models the concept `AosTraits_2` (but it does not model the models the concept `AosTraits_2` (but it does not model the
`AosLandmarkTraits_2` concept). It also models the refined `AosLandmarkTraits_2` concept). It also models the refined
concept `AosDirectionalXMonotoneTraits_2`, which enables concept `AosDirectionalXMonotoneTraits_2`, which enables
Boolean set operations; see Package \ref PkgBooleanSetOperations2Ref. Boolean set operations; see Package \ref PkgBooleanSetOperations2.
<!-- ----------------------------------------------------------------------- --> <!-- ----------------------------------------------------------------------- -->
\cgalFigureBegin{aos_fig-bezier_curves,bezier_curves.png} \cgalFigureBegin{aos_fig-bezier_curves,bezier_curves.png}

View File

@ -1,4 +1,4 @@
/// \defgroup PkgArrangementOnSurface2Ref 2D Arrangement Reference /// \defgroup PkgArrangementOnSurface2Ref Reference Manual
/// \defgroup PkgArrangementOnSurface2Concepts Concepts /// \defgroup PkgArrangementOnSurface2Concepts Concepts
/// \ingroup PkgArrangementOnSurface2Ref /// \ingroup PkgArrangementOnSurface2Ref

View File

@ -698,7 +698,7 @@ using one of the following tags:
- `CGAL::Alpha_expansion_boost_adjacency_list_tag` (default) - `CGAL::Alpha_expansion_boost_adjacency_list_tag` (default)
- `CGAL::Alpha_expansion_boost_compressed_sparse_raw_tag` - `CGAL::Alpha_expansion_boost_compressed_sparse_raw_tag`
- `CGAL::Alpha_expansion_MaxFlow_tag`, released under GPL - `CGAL::Alpha_expansion_MaxFlow_tag`, released under GPL
license and provided by the \ref PkgSurfaceMeshSegmentationRef license and provided by the \ref PkgSurfaceMeshSegmentation
package package
All these implementations produce the exact same result but behave All these implementations produce the exact same result but behave

View File

@ -1,4 +1,4 @@
/// \defgroup PkgBGLRef CGAL and the Boost Graph Library Reference /// \defgroup PkgBGLRef Reference Manual
/*! \defgroup PkgBGLConcepts Concepts /*! \defgroup PkgBGLConcepts Concepts
\ingroup PkgBGLRef \ingroup PkgBGLRef

View File

@ -509,7 +509,8 @@ class Alpha_expansion_MaxFlow_impl;
\cgalParamNEnd \cgalParamNEnd
\cgalNamedParamsEnd \cgalNamedParamsEnd
\note The `MaxFlow` implementation is provided by the \ref PkgSurfaceMeshSegmentationRef
\note The `MaxFlow` implementation is provided by the \ref PkgSurfaceMeshSegmentation package
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. must be included if users want to use this implementation.
*/ */

View File

@ -53,7 +53,7 @@ All analytic barycentric coordinates for polygons can be computed either by inst
or through one of the free functions. Harmonic coordinates can be computed only by or through one of the free functions. Harmonic coordinates can be computed only by
instantiating a class that must be parameterized by a model of the concept `DiscretizedDomain_2`. instantiating a class that must be parameterized by a model of the concept `DiscretizedDomain_2`.
Segment and triangle coordinates can be computed only through the free functions. Segment and triangle coordinates can be computed only through the free functions.
For more information see the \ref PkgBarycentricCoordinates2Ref "Reference Manual". For more information see the \ref PkgBarycentricCoordinates2Ref.
Any point in the plane may be taken as a query point. However, we do not recommend using Any point in the plane may be taken as a query point. However, we do not recommend using
Wachspress and discrete harmonic coordinates with query points outside the closure Wachspress and discrete harmonic coordinates with query points outside the closure

View File

@ -1,8 +1,5 @@
namespace CGAL {
namespace Barycentric_coordinates {
/*! /*!
\defgroup PkgBarycentricCoordinates2Ref 2D Generalized Barycentric Coordinates Reference \defgroup PkgBarycentricCoordinates2Ref Reference Manual
\defgroup PkgBarycentricCoordinates2RefConcepts Concepts \defgroup PkgBarycentricCoordinates2RefConcepts Concepts
\ingroup PkgBarycentricCoordinates2Ref \ingroup PkgBarycentricCoordinates2Ref
@ -77,6 +74,3 @@ coordinates from the Package \ref PkgInterpolation2.}
- `discrete_harmonic_coordinates_2()` - `discrete_harmonic_coordinates_2()`
- `boundary_coordinates_2()` - `boundary_coordinates_2()`
*/ */
} /* namespace Barycentric_coordinates */
} /* namespace CGAL */

View File

@ -1,4 +1,4 @@
/// \defgroup PkgBasicViewerRef Basic Viewer Reference /// \defgroup PkgBasicViewerRef Reference Manual
/// \defgroup PkgBasicViewerConcepts Concepts /// \defgroup PkgBasicViewerConcepts Concepts
/// \ingroup PkgBasicViewerRef /// \ingroup PkgBasicViewerRef

View File

@ -116,7 +116,7 @@ In our context, a polygon must uphold the following conditions:
<OL> <OL>
<LI><I>Closed Boundary</I> - the polygon's outer boundary must be a connected sequence of curves, that start and end at the same vertex. <LI><I>Closed Boundary</I> - the polygon's outer boundary must be a connected sequence of curves, that start and end at the same vertex.
<LI><I>Simplicity</I> - the polygon must be simple. <LI><I>Simplicity</I> - the polygon must be simple.
<LI><I>Orientation</I> - the polygon's outer boundary must be <I>counter-clockwise oriented</I>. <LI><I>Orientation</I> - the polygon's outer boundary must be <I>counterclockwise oriented</I>.
</OL> </OL>
\subsection bso_ssecpolygon_with_holes_validation Conditions for Valid Polygons with Holes \subsection bso_ssecpolygon_with_holes_validation Conditions for Valid Polygons with Holes

View File

@ -1,4 +1,4 @@
/// \defgroup PkgBooleanSetOperations2Ref 2D Regularized Boolean Set-Operations Reference /// \defgroup PkgBooleanSetOperations2Ref Reference Manual
/// \defgroup PkgBooleanSetOperations2Concepts Concepts /// \defgroup PkgBooleanSetOperations2Concepts Concepts
/// \ingroup PkgBooleanSetOperations2Ref /// \ingroup PkgBooleanSetOperations2Ref

View File

@ -52,7 +52,7 @@ public:
return (ic % 2) == 1; return (ic % 2) == 1;
} }
//! after_scan post-processing after bfs scan. //! after_scan postprocessing after bfs scan.
/*! The function fixes some of the curves, to be in the same direction as the /*! The function fixes some of the curves, to be in the same direction as the
half-edges. half-edges.

View File

@ -16,7 +16,6 @@ optimization algorithms using the two-dimensional \cgal kernel.
\sa `CGAL::Min_annulus_d<Traits>` \sa `CGAL::Min_annulus_d<Traits>`
\sa `CGAL::Min_sphere_annulus_d_traits_3<K,ET,NT>` \sa `CGAL::Min_sphere_annulus_d_traits_3<K,ET,NT>`
\sa `CGAL::Min_sphere_annulus_d_traits_d<K,ET,NT>` \sa `CGAL::Min_sphere_annulus_d_traits_d<K,ET,NT>`
\sa `MinSphereAnnulusDTraits`
*/ */
template< typename K, typename ET, typename NT > template< typename K, typename ET, typename NT >

View File

@ -16,8 +16,6 @@ optimization algorithms using the three-dimensional \cgal kernel.
\sa `CGAL::Min_annulus_d<Traits>` \sa `CGAL::Min_annulus_d<Traits>`
\sa `CGAL::Min_sphere_annulus_d_traits_2<K,ET,NT>` \sa `CGAL::Min_sphere_annulus_d_traits_2<K,ET,NT>`
\sa `CGAL::Min_sphere_annulus_d_traits_d<K,ET,NT>` \sa `CGAL::Min_sphere_annulus_d_traits_d<K,ET,NT>`
\sa `Min_sphere_annulusDTraits`
*/ */
template< typename K, typename ET, typename NT > template< typename K, typename ET, typename NT >
class Min_sphere_annulus_d_traits_3 { class Min_sphere_annulus_d_traits_3 {

View File

@ -17,7 +17,6 @@ optimization algorithms using the \f$ d\f$-dimensional \cgal kernel.
\sa `CGAL::Polytope_distance_d<Traits>` \sa `CGAL::Polytope_distance_d<Traits>`
\sa `CGAL::Min_sphere_annulus_d_traits_2<K,ET,NT>` \sa `CGAL::Min_sphere_annulus_d_traits_2<K,ET,NT>`
\sa `CGAL::Min_sphere_annulus_d_traits_3<K,ET,NT>` \sa `CGAL::Min_sphere_annulus_d_traits_3<K,ET,NT>`
\sa `MinSphereAnnulusDTraits`
*/ */
template< typename K, typename ET, typename NT > template< typename K, typename ET, typename NT >

View File

@ -74,25 +74,25 @@ typedef unspecified_type Equal_2;
/*! /*!
a model for a model for
`Kernel::Less_xy_2`. `Kernel::LessXY_2`.
*/ */
typedef unspecified_type Less_xy_2; typedef unspecified_type Less_xy_2;
/*! /*!
a model for a model for
`Kernel::Less_yx_2`. `Kernel::LessYX_2`.
*/ */
typedef unspecified_type Less_yx_2; typedef unspecified_type Less_yx_2;
/*! /*!
a model for a model for
`Kernel::Has_on_negative_side_2`. `Kernel::HasOnNegativeSide_2`.
*/ */
typedef unspecified_type Has_on_negative_side_2; typedef unspecified_type Has_on_negative_side_2;
/*! /*!
a model for a model for
`Kernel::Compare_angle_with_x_axis_2`. `Kernel::CompareAngleWithXAxis_2`.
*/ */
typedef unspecified_type Compare_angle_with_x_axis_2; typedef unspecified_type Compare_angle_with_x_axis_2;
@ -101,7 +101,7 @@ AdaptableFunctor
`op`: `op`:
`Rectangle_2` \f$ \times\f$ `Rectangle_2` \f$ \rightarrow\f$ `Rectangle_2` \f$ \times\f$ `Rectangle_2` \f$ \rightarrow\f$
`bool`. `bool`.
`op(r1,r2)` returns true, iff the area of \f$ r1\f$ is `op(r1,r2)` returns `true`, iff the area of \f$ r1\f$ is
strictly less than the area of \f$ r2\f$. strictly less than the area of \f$ r2\f$.
*/ */
typedef unspecified_type Area_less_rectangle_2; typedef unspecified_type Area_less_rectangle_2;
@ -112,7 +112,7 @@ AdaptableFunctor
`Parallelogram_2` \f$ \times\f$ `Parallelogram_2` \f$ \times\f$
`Parallelogram_2` \f$ \rightarrow\f$ `bool`. `Parallelogram_2` \f$ \rightarrow\f$ `bool`.
`op(p1,p2)` returns true, iff the area of \f$ p1\f$ is strictly less `op(p1,p2)` returns `true`, iff the area of \f$ p1\f$ is strictly less
than the area of \f$ p2\f$. than the area of \f$ p2\f$.
*/ */
typedef unspecified_type Area_less_parallelogram_2; typedef unspecified_type Area_less_parallelogram_2;
@ -122,7 +122,7 @@ AdaptableFunctor
`op`: `op`:
`Strip_2` \f$ \times\f$ `Strip_2` \f$ \rightarrow\f$ `bool`. `Strip_2` \f$ \times\f$ `Strip_2` \f$ \rightarrow\f$ `bool`.
`op(s1,s2)` returns true, iff the width of \f$ s1\f$ is strictly less `op(s1,s2)` returns `true`, iff the width of \f$ s1\f$ is strictly less
than the width of \f$ s2\f$. than the width of \f$ s2\f$.
*/ */
typedef unspecified_type Width_less_strip_2; typedef unspecified_type Width_less_strip_2;
@ -143,7 +143,7 @@ typedef unspecified_type Orientation_2;
/*! /*!
a model for a model for
`Kernel::Construct_vector_2`. `Kernel::ConstructVector_2`.
*/ */
typedef unspecified_type Construct_vector_2; typedef unspecified_type Construct_vector_2;
@ -158,25 +158,25 @@ typedef unspecified_type Construct_vector_from_direction_2;
/*! /*!
a model for a model for
`Kernel::Construct_perpendicular_vector_2`. `Kernel::ConstructPerpendicularVector_2`.
*/ */
typedef unspecified_type Construct_perpendicular_vector_2; typedef unspecified_type Construct_perpendicular_vector_2;
/*! /*!
a model for a model for
`Kernel::Construct_direction_2`. `Kernel::ConstructDirection_2`.
*/ */
typedef unspecified_type Construct_direction_2; typedef unspecified_type Construct_direction_2;
/*! /*!
a model for a model for
`Kernel::Construct_opposite_direction_2`. `Kernel::ConstructOppositeDirection_2`.
*/ */
typedef unspecified_type Construct_opposite_direction_2; typedef unspecified_type Construct_opposite_direction_2;
/*! /*!
a model for a model for
`Kernel::Construct_line_2`. `Kernel::ConstructLine_2`.
*/ */
typedef unspecified_type Construct_line_2; typedef unspecified_type Construct_line_2;

View File

@ -34,31 +34,31 @@ typedef unspecified_type Point_2;
/*! /*!
model for model for
`Kernel::Iso_rectangle_2`. `Kernel::IsoRectangle_2`.
*/ */
typedef unspecified_type Iso_rectangle_2; typedef unspecified_type Iso_rectangle_2;
/*! /*!
model for model for
`Kernel::Less_x_2`. `Kernel::LessX_2`.
*/ */
typedef unspecified_type Less_x_2; typedef unspecified_type Less_x_2;
/*! /*!
model for model for
`Kernel::Less_y_2`. `Kernel::LessY_2`.
*/ */
typedef unspecified_type Less_y_2; typedef unspecified_type Less_y_2;
/*! /*!
model for model for
`Kernel::Construct_vertex_2`. `Kernel::ConstructVertex_2`.
*/ */
typedef unspecified_type Construct_vertex_2; typedef unspecified_type Construct_vertex_2;
/*! /*!
model for model for
`Kernel::Construct_iso_rectangle_2`. `Kernel::ConstructIsoRectangle_2`.
*/ */
typedef unspecified_type Construct_iso_rectangle_2; typedef unspecified_type Construct_iso_rectangle_2;

View File

@ -1,4 +1,4 @@
/// \defgroup PkgBoundingVolumesRef Bounding Volumes Reference /// \defgroup PkgBoundingVolumesRef Reference Manual
/// \defgroup PkgBoundingVolumesConcepts Concepts /// \defgroup PkgBoundingVolumesConcepts Concepts
/// \ingroup PkgBoundingVolumesRef /// \ingroup PkgBoundingVolumesRef
/*! /*!

View File

@ -6,3 +6,4 @@ Circulator
Stream_support Stream_support
Matrix_search Matrix_search
Polytope_distance_d Polytope_distance_d
Number_types

View File

@ -1,4 +1,4 @@
/// \defgroup PkgBoxIntersectionDRef Intersecting Sequences of dD Iso-oriented Boxes Reference /// \defgroup PkgBoxIntersectionDRef Reference Manual
/// \defgroup PkgBoxIntersectionDConcepts Concepts /// \defgroup PkgBoxIntersectionDConcepts Concepts
/// \ingroup PkgBoxIntersectionDRef /// \ingroup PkgBoxIntersectionDRef

View File

@ -1,4 +1,4 @@
/// \defgroup PkgCGALIpeletsRef CGAL Ipelets Reference /// \defgroup PkgCGALIpeletsRef Reference Manual
/*! /*!
\addtogroup PkgCGALIpeletsRef \addtogroup PkgCGALIpeletsRef
\cgalPkgDescriptionBegin{CGAL Ipelets,PkgCGALIpelets} \cgalPkgDescriptionBegin{CGAL Ipelets,PkgCGALIpelets}

View File

@ -1,4 +1,4 @@
/// \defgroup PkgCircularKernel2Ref 2D Circular Geometry Kernel Reference /// \defgroup PkgCircularKernel2Ref Reference Manual
/// \defgroup PkgCircularKernel2GeometricConcepts Geometric Concepts /// \defgroup PkgCircularKernel2GeometricConcepts Geometric Concepts
/// \ingroup PkgCircularKernel2Ref /// \ingroup PkgCircularKernel2Ref

View File

@ -1,4 +1,4 @@
/// \defgroup PkgCircularKernel3Ref 3D Spherical Geometry Kernel Reference /// \defgroup PkgCircularKernel3Ref Reference Manual
/// \defgroup PkgCircularKernel3GeometricConcepts Geometric Concepts /// \defgroup PkgCircularKernel3GeometricConcepts Geometric Concepts
/// \ingroup PkgCircularKernel3Ref /// \ingroup PkgCircularKernel3Ref

View File

@ -1,4 +1,4 @@
/// \defgroup PkgHandlesAndCirculatorsRef Handles and Circulators Reference /// \defgroup PkgHandlesAndCirculatorsRef Reference Manual
/// \defgroup PkgHandlesAndCirculatorsConcepts Concepts /// \defgroup PkgHandlesAndCirculatorsConcepts Concepts
/// \ingroup PkgHandlesAndCirculatorsRef /// \ingroup PkgHandlesAndCirculatorsRef

View File

@ -1,4 +1,4 @@
/// \defgroup PkgClassificationRef Classification Reference /// \defgroup PkgClassificationRef Reference Manual
/*! /*!
\defgroup PkgClassificationConcepts Concepts \defgroup PkgClassificationConcepts Concepts

View File

@ -1,4 +1,4 @@
/// \defgroup PkgCombinatorialMapsRef Combinatorial Maps Reference /// \defgroup PkgCombinatorialMapsRef Reference Manual
/// \defgroup PkgCombinatorialMapsConcepts Concepts /// \defgroup PkgCombinatorialMapsConcepts Concepts
/// \ingroup PkgCombinatorialMapsRef /// \ingroup PkgCombinatorialMapsRef

View File

@ -1,4 +1,4 @@
/// \defgroup PkgConeSpanners2Ref Cone-Based Spanners Reference /// \defgroup PkgConeSpanners2Ref Reference Manual
/*! /*!
\addtogroup PkgConeSpanners2Ref \addtogroup PkgConeSpanners2Ref

View File

@ -137,7 +137,7 @@ public:
The direction of the first ray can be specified by the parameter The direction of the first ray can be specified by the parameter
initial_direction, which allows the first ray to start at any direction. initial_direction, which allows the first ray to start at any direction.
The remaining directions are calculated in counter-clockwise order. The remaining directions are calculated in counterclockwise order.
\param cone_number The number of cones \param cone_number The number of cones
\param initial_direction The direction of the first ray \param initial_direction The direction of the first ray

View File

@ -169,7 +169,7 @@ protected:
/* Construct edges in one cone bounded by two directions. /* Construct edges in one cone bounded by two directions.
\param cwBound The direction of the clockwise boundary of the cone. \param cwBound The direction of the clockwise boundary of the cone.
\param ccwBound The direction of the counter-clockwise boundary. \param ccwBound The direction of the counterclockwise boundary.
\param g The Theta graph to be built. \param g The Theta graph to be built.
*/ */
void add_edges_in_cone(const Direction_2& cwBound, const Direction_2& ccwBound, Graph_& g) { void add_edges_in_cone(const Direction_2& cwBound, const Direction_2& ccwBound, Graph_& g) {

View File

@ -164,7 +164,7 @@ protected:
/* Construct edges in one cone bounded by two directions. /* Construct edges in one cone bounded by two directions.
\param cwBound The direction of the clockwise boundary of the cone. \param cwBound The direction of the clockwise boundary of the cone.
\param ccwBound The direction of the counter-clockwise boundary. \param ccwBound The direction of the counterclockwise boundary.
\param g The Yao graph to be built. \param g The Yao graph to be built.
*/ */
void add_edges_in_cone(const Direction_2& cwBound, const Direction_2& ccwBound, Graph_& g) { void add_edges_in_cone(const Direction_2& cwBound, const Direction_2& ccwBound, Graph_& g) {

View File

@ -1,4 +1,4 @@
/// \defgroup PkgConvexDecomposition3Ref Convex Decomposition of Polyhedra Reference /// \defgroup PkgConvexDecomposition3Ref Reference Manual
/*! /*!
\addtogroup PkgConvexDecomposition3Ref \addtogroup PkgConvexDecomposition3Ref

View File

@ -1,4 +1,4 @@
/// \defgroup PkgConvexHull2Ref 2D Convex Hulls and Extreme Points Reference /// \defgroup PkgConvexHull2Ref Reference Manual
/// \defgroup PkgConvexHull2Concepts Concepts /// \defgroup PkgConvexHull2Concepts Concepts
/// \ingroup PkgConvexHull2Ref /// \ingroup PkgConvexHull2Ref

View File

@ -1,4 +1,4 @@
/// \defgroup PkgConvexHull3Ref 3D Convex Hulls Reference /// \defgroup PkgConvexHull3Ref Reference Manual
/// \defgroup PkgConvexHull3Concepts Concepts /// \defgroup PkgConvexHull3Concepts Concepts
/// \ingroup PkgConvexHull3Ref /// \ingroup PkgConvexHull3Ref

View File

@ -1,4 +1,4 @@
/// \defgroup PkgConvexHullDRef dD Convex Hulls and Delaunay Triangulations Reference /// \defgroup PkgConvexHullDRef Reference Manual
/// \defgroup PkgConvexHullDConcepts Concepts /// \defgroup PkgConvexHullDConcepts Concepts
/// \ingroup PkgConvexHullDRef /// \ingroup PkgConvexHullDRef
/*! /*!

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -30,7 +30,7 @@ there are <I>convincing</I> reasons.
<LI>Words in the names of concepts (<I>e.g.</I>, template parameters) <LI>Words in the names of concepts (<I>e.g.</I>, template parameters)
should be separated using capital letters. The only use of underscores should be separated using capital letters. The only use of underscores
in concept names is before the dimension suffix. For example, one in concept names is before the dimension suffix. For example, one
should use a name such as ConvexHullTraits_2 for the concept should use a name such as `ConvexHullTraits_2` for the concept
in contrast to `Convex_hull_traits_2` for the name of the class that in contrast to `Convex_hull_traits_2` for the name of the class that
is a model of this concept. This different naming scheme for concepts is a model of this concept. This different naming scheme for concepts
and classes was adopted mainly for two reasons (a) it is consistent with and classes was adopted mainly for two reasons (a) it is consistent with
@ -49,10 +49,10 @@ there are <I>convincing</I> reasons.
<LI>The first word of a class or enumeration name should be capitalized <LI>The first word of a class or enumeration name should be capitalized
(<I>e.g.</I>, `Quotient`, `Orientation`). (<I>e.g.</I>, `Quotient`, `Orientation`).
<LI>Function names are in lowercase <LI>Function names are in lowercase
(<I>e.g.</I>, `is_zero`). (<I>e.g.</I>, `is_zero()`).
<LI>Boolean function names should begin with a verb. For example, use <LI>Boolean function names should begin with a verb. For example, use
`is_empty` instead of simply `empty` and `is_empty()` instead of simply `empty()` and
`has_on_bounded_side` instead of `on_bounded_side`. `has_on_bounded_side()` instead of `on_bounded_side()`.
<LI>Names of macros should begin with the prefix `CGAL_`. <LI>Names of macros should begin with the prefix `CGAL_`.
</UL> </UL>
@ -72,23 +72,23 @@ there are <I>convincing</I> reasons.
<UL> <UL>
<LI>Names for geometric data structures and algorithms should follow <LI>Names for geometric data structures and algorithms should follow
the "spirit" of the rules given so far, <I>e.g.</I> a data structure for the "spirit" of the rules given so far, <I>e.g.</I>, a data structure for
triangulations in the plane is named `Triangulation_2`, and a triangulations in the plane is named `Triangulation_2`, and a
convex hull algorithm in 3-space is named `convex_hull_3`. convex hull algorithm in 3-space is named `convex_hull_3()`.
<LI>Member functions realizing predicates should start with `is_` or <LI>Member functions realizing predicates should start with `is_` or
`has_`, <I>e.g.</I> the data structure `Min_ellipse_2` has member `has_`, <I>e.g.</I>, the data structure `Min_ellipse_2` has member
functions `is_empty` and `has_on_bounded_side`. functions `is_empty()` and `has_on_bounded_side()`.
<LI>Access to data structures is given via iterators and <LI>Access to data structures is given via iterators and
circulators (Chapter \ref devman_iterators_and_circulators ). circulators (Chapter \ref devman_iterators_and_circulators ).
For iterators and functions For iterators and functions
returning them we extend returning them we extend
the \stl names with a prefix describing the items to be accessed. the \stl names with a prefix describing the items to be accessed.
For example, the functions `vertices_begin` and `vertices_end` For example, the functions `vertices_begin()` and `vertices_end()`
return a `Vertex_iterator`. (Note that we use the name of the items return a `Vertex_iterator`. (Note that we use the name of the items
in singular for the iterator type name and in plural for the functions in singular for the iterator type name and in plural for the functions
returning the iterator.) Names related to circulators are handled returning the iterator.) Names related to circulators are handled
similarly, using the suffix `_circulator`. For example, the similarly, using the suffix `_circulator`. For example, the
function `edges_circulator` returns an `Edge_circulator`. function `edges_circulator()` returns an `Edge_circulator`.
</UL> </UL>
\subsection Developer_manualKerneltraits Kernel traits \subsection Developer_manualKerneltraits Kernel traits
@ -183,7 +183,7 @@ In addition, for each functor the kernel traits class has a member
function that returns an instance of this functor. The name of this function that returns an instance of this functor. The name of this
function should be the (uncapitalized) name of the function should be the (uncapitalized) name of the
functor followed by the suffix `_object`.For example, the function that returns an instance of the functor followed by the suffix `_object`.For example, the function that returns an instance of the
`Less_xy_2` functor is called `less_xy_2_object`. `Less_xy_2` functor is called `less_xy_2_object()`.
\subsection Developer_manualFilenames File names \subsection Developer_manualFilenames File names

View File

@ -7,8 +7,8 @@
\section Developer_manualReferencecounting Reference counting \section Developer_manualReferencecounting Reference counting
As of release 2.1, a reference counting scheme is used for As of release 2.1, a reference counting scheme is used for
the kernel objects in the kernels `Cartesian` and the kernel objects in the kernels `CGAL::Cartesian` and
`Homogeneous`. `CGAL::Homogeneous`.
All copies of an object share a common representation object storing All copies of an object share a common representation object storing
the data associated with a kernel object; see \cgalFigureRef{figrefcounted}. the data associated with a kernel object; see \cgalFigureRef{figrefcounted}.
@ -19,7 +19,7 @@ of the data that we would have to copy without sharing representations.
The drawback is an indirection in accessing the data. Such an indirection is The drawback is an indirection in accessing the data. Such an indirection is
bad in terms of cache efficiency. bad in terms of cache efficiency.
Thus there are also non-reference-counting kernels available Thus there are also non-reference-counting kernels available
`Simple_cartesian` and `Simple_homogeneous`. `CGAL::Simple_cartesian` and `CGAL::Simple_homogeneous`.
\cgalFigureBegin{figrefcounted,reference_counting.png} \cgalFigureBegin{figrefcounted,reference_counting.png}
Objects using reference counting (bottom) share common representation; copying creates a new handle (drawn at the right) pointing to the same representation as the object copied. Without reference counting (top) all data are copied to the new object (drawn at the right); Objects using reference counting (bottom) share common representation; copying creates a new handle (drawn at the right) pointing to the same representation as the object copied. Without reference counting (top) all data are copied to the new object (drawn at the right);
@ -161,13 +161,13 @@ following member functions
to manage its internal reference counting: to manage its internal reference counting:
<UL> <UL>
<LI>`add_reference` <LI>`add_reference()`
<LI>`remove_reference` <LI>`remove_reference()`
<LI>`bool is_referenced` <LI>`bool is_referenced()`
<LI>`bool is_shared` <LI>`bool is_shared()`
</UL> </UL>
See the UML class diagram in \cgalFigureRef{figHandleFor}. See the UML class diagram in \cgalFigureRef{figHandleFor}.
@ -257,7 +257,7 @@ You get this functionality by including `CGAL/Handle_for.h`
\section Developer_manualAllocation Allocation \section Developer_manualAllocation Allocation
Class `Handle_for` has two template parameters. Besides the Class `CGAL::Handle_for` has two template parameters. Besides the
type of the stored object, there is also a parameter specifying an type of the stored object, there is also a parameter specifying an
allocator. allocator.
Any concrete argument must be a model for the `Allocator` concept Any concrete argument must be a model for the `Allocator` concept

View File

@ -150,28 +150,8 @@ and used to output values to the output stream to which it is bound.
\cgal provides extensions of the classes `istream_iterator` \cgal provides extensions of the classes `istream_iterator`
and `ostream_iterator`. The class `CGAL::Ostream_iterator<T,Stream>` and `ostream_iterator`. The class `CGAL::Ostream_iterator<T,Stream>`
is an output iterator adaptor for the stream class `Stream` and value is an output iterator adaptor for the stream class `Stream` and value
type `T`. It provides output iterators that can be used to output values type `T`. It provides output iterators that can be used to output values
of type `T` to objects of the class `Stream`. of type `T` to objects of the class `Stream`.
For example, the following code fragment inserts a list of segments into
a window stream (<I>i.e.</I>, it draws the segments in the window) using the
standard copy function:
\code{.cpp}
typedef CGAL::Cartesian<double> K;
typedef K::Segment_2 Segment;
std::vector<Segment> segments;
Window_stream W( 400, 400);
int main (int argc, char** argv)
{
// initialize segments
std::copy( segments.begin(),
segments.end(),
CGAL::Ostream_iterator< Segment, Window_stream>( W));
}
\endcode
Likewise, the class `CGAL::Istream_iterator<T,Stream>` is an input Likewise, the class `CGAL::Istream_iterator<T,Stream>` is an input
iterator adaptor for the stream class `Stream` and value type `T`. iterator adaptor for the stream class `Stream` and value type `T`.

View File

@ -7,56 +7,55 @@
Names, in particular (member) function names and class names should Names, in particular (member) function names and class names should
be descriptive and easily remembered. So it is not surprising that be descriptive and easily remembered. So it is not surprising that
different libraries or packages choose the same name for corresponding different libraries or packages choose the same name for corresponding
or similar classes and functions. A common approach to solving the or similar classes and functions. A common approach to avoid ambiguities
naming problem is to add a prefix, for example, is to add a prefix, for example, OpenGL adds `gl` and FLTK adds `fl`,
OpenGL adds `gl` but the better alternative is the usage of `namespace`.
and FLTK adds `fl`. \leda uses prefix `leda_`
to some extent,
but you have to tell \leda not to make the corresponding unprefixed names
available as well.\cgalFootnote{\cgal's makefile does this by setting \cgalFootnoteCode{-DLEDA_PREFIX}.} Initially, \cgal used
prefix `CGAL_`.
At the beginning of 1999, it was decided to drop prefix `CGAL_` and to
introduce namespace `CGAL`.
\section Developer_manualNamespaceCGAL Namespace CGAL \section Developer_manualNamespaceCGAL Namespace CGAL
All names introduced by \cgal should be in namespace `CGAL`, <I>e.g.</I>: All names introduced by \cgal should be in namespace `CGAL`, or in a subnamespace
corresponding to a package, <I>e.g.</I>:
\code{.cpp} \code{.cpp}
#include <something> #include <something>
namespace CGAL { namespace CGAL {
class My_new_cgal_class {}; /*!
* This class ...
*/
class Foo {};
My_new_cgal_class
my_new_function( My_new_cgal_class& );
namespace Polygon_mesh_processing {
/*!
* modifies `f` by ...
*/
void
bar( foo & f);
} // namespace Polygon_mesh_processing
} // namespace CGAL } // namespace CGAL
\endcode \endcode
Make sure not to have include statements nested between
<TT> namespace CGAL { </TT> and <TT> } // namespace CGAL</TT>. Make sure not to have include statements inside the
Otherwise all names defined in the file included will be `namespace CGAL`. Otherwise, all names defined in the file included will be
added to namespace `CGAL`. added to the namespace.
\section Developer_manualNamespaceinternal Namespace internal \section Developer_manualNamespaceinternal Namespace internal
All names introduced by \cgal which are not documented to the user All names introduced by \cgal which are not documented to the user
should be under an `internal` subnamespace of `CGAL`, <I>e.g.</I>: should be under an `internal` subnamespace of `CGAL`, <I>e.g.</I>:
\code{.cpp} \code{.cpp}
namespace CGAL { namespace internal { namespace CGAL {
namespace Polygon_mesh_processing {
namespace internal {
class My_undocumented_class {}; class Baz_used_by_foo {};
void my_new_function( My_undocumented_class& ); } // namespace internal
} // namespace Polygon_mesh_processing
}} // namespace CGAL::internal } // namespace CGAL
namespace CGAL { namespace internal { namespace Package { namespace tags {
class Some_further_class_local_to_Package;
}}}} // namespace CGAL::internal::Package::tags
\endcode \endcode
\section Developer_manualNoteonglobaltemplatefunctions Note on global template functions \section Developer_manualNoteonglobaltemplatefunctions Note on global template functions

View File

@ -16,7 +16,7 @@ appropriate base class interface functions (besides `draw()`).
\cgal has chosen a different approach, since \cgal wants to avoid large \cgal has chosen a different approach, since \cgal wants to avoid large
class hierarchies. With the \cgal class hierarchies. With the \cgal
class `Object`, you can fake a common class `CGAL::Object`, you can fake a common
base class, see \cgalFigureRef{FigObject}. base class, see \cgalFigureRef{FigObject}.
\cgalFigureBegin{FigObject,Object.png } \cgalFigureBegin{FigObject,Object.png }
@ -24,7 +24,7 @@ UML class diagram for faked object hierarchies (since 2.2-I-4).
\cgalFigureEnd \cgalFigureEnd
Functions having a polymorphic return type create an object of the actual Functions having a polymorphic return type create an object of the actual
result type and wrap it into an object of type `Object`. result type and wrap it into an object of type `CGAL::Object`.
Refer to the documentation of `CGAL::Object` class for more details. Refer to the documentation of `CGAL::Object` class for more details.
An alternative is to use a class handling several output iterators at the same time such as the classes `CGAL::Dispatch_output_iterator`. An alternative is to use a class handling several output iterators at the same time such as the classes `CGAL::Dispatch_output_iterator`.

View File

@ -65,7 +65,7 @@ probably must be deprecated and phased out), trying not to break backward
compatibility too much. compatibility too much.
A list of reasonable Boost libraries to use in the \cgal API is A list of reasonable Boost libraries to use in the \cgal API is
Graph, Optional, Parameter (for packages already using it), Graph, Parameter (for packages already using it),
Property Map, Smart Pointers (for packages already using it), Property Map, Smart Pointers (for packages already using it),
Variant. Variant.

View File

@ -60,7 +60,7 @@ that (are still fairly generic and) guarantee exact predicate results and
much higher efficiency than exact number types like arbitrary precision much higher efficiency than exact number types like arbitrary precision
integers or rationals. The efficiency relies on the use of speedy integers or rationals. The efficiency relies on the use of speedy
floating-point arithmetic in order to filter out reliable floating-point floating-point arithmetic in order to filter out reliable floating-point
computations. Interval arithmetic is largely used in such filter steps. computations. %Interval arithmetic is largely used in such filter steps.
\section Developer_manualRequirementsandrecommendations Requirements and recommendations \section Developer_manualRequirementsandrecommendations Requirements and recommendations

View File

@ -9,26 +9,6 @@ Before submitting a change for integration into \cgal it is good style
to run the testsuite of the modified package and all packages that to run the testsuite of the modified package and all packages that
could be impacted. could be impacted.
All examples and tests in CGAL are now compatible with `ctest`. So to test all examples or all tests For details see <a href="https://github.com/CGAL/cgal/wiki/Testing">Testing</a> on the CGAL wiki on github.
of a package, you simply need to configure with `cmake` the examples/tests of the package you want to
test, adding the option `CGAL_ENABLE_TESTING` and setting its value to `ON`. In order to report more
warnings, it is recommended to also add the option `CGAL_DEV_MODE` and to set it to `ON`.
Then a call to the command `ctest` will compile and run the tests/examples.
\section fullTestsuite Running the Whole Testsuite
We describe here how to proceed to the testing of a full copy of `master` or any branch by creating a <i>flat release</i>
(that is having a layout similar to a release rather than a branch layout with header files gathered by packages).
The creation of the flat release is done using the `cmake` script `cgal_create_release_with_cmake.cmake` located in the directory `Scripts/developer_scripts`.
You can run it using the option `-P` of `cmake`: `cmake -P cgal_create_release_with_cmake.cmake`.
For an up-to-date documentation of available options, check the comments at the beginning of the script.
Then for testing all examples, tests, and demos, in a build directory call `cmake` on the created release
(the path is given by the script if not manually specified)
`cmake -DBUILD_TESTING=ON -DWITH_examples=ON -DWITH_tests=ON -DWITH_demos=ON ../CGAL-X.XX/`
Finally, a call to the command `ctest` will compile and run the tests, examples, and demos.
*/ */

View File

@ -19,7 +19,7 @@ sections.
\section secwhat_is_a_traits_class What are traits classes in CGAL? \section secwhat_is_a_traits_class What are traits classes in CGAL?
The algorithms in CGAL's basic library are implemented as function templates The algorithms in \cgal's basic library are implemented as function templates
or class templates, usually having a template parameter whose name contains or class templates, usually having a template parameter whose name contains
the word `Traits`. This template parameter the word `Traits`. This template parameter
represents a concept and so has a corresponding set of requirements that represents a concept and so has a corresponding set of requirements that

View File

@ -67,6 +67,8 @@ To enable checking, users have to define one of the following macros:
The license checking is not a mean to control users as no information The license checking is not a mean to control users as no information
is collected or transmitted. is collected or transmitted.
\note With `Clang`, paths to CGAL headers shall not be passed with `-isystem` option in order for the warning messages to be emitted.
\section licensesWhere Determining the license of a CGAL file \section licensesWhere Determining the license of a CGAL file
It is specified in each file of the \cgal library which license applies to it. It is specified in each file of the \cgal library which license applies to it.

View File

@ -143,7 +143,7 @@ The \eigen web site is <A HREF="https://eigen.tuxfamily.org/index.php?title=Main
\opengr is a set C++ libraries for 3D Global Registration released under the terms of the APACHE V2 license. \opengr is a set C++ libraries for 3D Global Registration released under the terms of the APACHE V2 license.
\cgal provides wrappers for the Super4PCS algorithm of \opengr in the \ref PkgPointSetProcessing3Ref \cgal provides wrappers for the Super4PCS algorithm of \opengr in the \ref PkgPointSetProcessing3
packages. In order to use \opengr in \cgal programs, the executables should be linked with the CMake imported target `CGAL::OpenGR_support` provided in `CGAL_OpenGR_support.cmake`. packages. In order to use \opengr in \cgal programs, the executables should be linked with the CMake imported target `CGAL::OpenGR_support` provided in `CGAL_OpenGR_support.cmake`.
The \opengr web site is <A HREF="https://github.com/STORM-IRIT/OpenGR">`https://github.com/STORM-IRIT/OpenGR`</A>. The \opengr web site is <A HREF="https://github.com/STORM-IRIT/OpenGR">`https://github.com/STORM-IRIT/OpenGR`</A>.
@ -152,7 +152,7 @@ The \opengr web site is <A HREF="https://github.com/STORM-IRIT/OpenGR">`https://
\libpointmatcher is a modular library implementing the Iterative Closest Point (ICP) algorithm for aligning point clouds, released under a permissive BSD license. \libpointmatcher is a modular library implementing the Iterative Closest Point (ICP) algorithm for aligning point clouds, released under a permissive BSD license.
\cgal provides wrappers for the ICP algorithm of \libpointmatcher in the \ref PkgPointSetProcessing3Ref \cgal provides wrappers for the ICP algorithm of \libpointmatcher in the \ref PkgPointSetProcessing3
packages. In order to use \libpointmatcher in \cgal programs, the packages. In order to use \libpointmatcher in \cgal programs, the
executables should be linked with the CMake imported target executables should be linked with the CMake imported target
`CGAL::pointmatcher_support` provided in `CGAL::pointmatcher_support` provided in
@ -160,11 +160,12 @@ executables should be linked with the CMake imported target
The \libpointmatcher web site is <A The \libpointmatcher web site is <A
HREF="https://github.com/ethz-asl/libpointmatcher">`https://github.com/ethz-asl/libpointmatcher`</A>. HREF="https://github.com/ethz-asl/libpointmatcher">`https://github.com/ethz-asl/libpointmatcher`</A>.
\attention On Windows, we only support version 1.3.1 of PointMatcher with version 3.3.7 of Eigen, with some changes to the recipe at \attention On Windows, \libpointmatcher needs to be compiled with the flag BOOST_TIMER_ENABLE_DEPRECATED set as it uses a deprecated module from \boost.
\attention On Windows, we support version 1.4.4 of \libpointmatcher with version 3.4.0 of Eigen.
Alternatively, version 1.3.1 of \libpointmatcher is supported with version 3.3.7 of Eigen, with some changes to the recipe at
`https://github.com/ethz-asl/libpointmatcher/blob/master/doc/Compilation.md`:`NABO_INCLUDE_DIR` becomes `libnabo_INCLUDE_DIRS` `https://github.com/ethz-asl/libpointmatcher/blob/master/doc/Compilation.md`:`NABO_INCLUDE_DIR` becomes `libnabo_INCLUDE_DIRS`
and `NABO_LIBRARY` becomes `libnabo_LIBRARIES` in the "Build libpointmatcher" section. and `NABO_LIBRARY` becomes `libnabo_LIBRARIES` in the "Build libpointmatcher" section.
\subsection thirdpartyLeda LEDA \subsection thirdpartyLeda LEDA
<b>Version 6.2 or later</b> <b>Version 6.2 or later</b>
@ -276,7 +277,7 @@ for instance, on Windows, you can download it from <A HREF="https://www.zlib.net
\ceres is an open source C++ library for modeling and solving large, complicated optimization problems. \ceres is an open source C++ library for modeling and solving large, complicated optimization problems.
In \cgal, \ceres is used by the \ref PkgPolygonMeshProcessingRef package for mesh smoothing, which In \cgal, \ceres is used by the \ref PkgPolygonMeshProcessing package for mesh smoothing, which
requires solving complex non-linear least squares problems. requires solving complex non-linear least squares problems.
Visit the official website of the library at <A HREF="http://ceres-solver.org/index.html">`ceres-solver.org`</A> Visit the official website of the library at <A HREF="http://ceres-solver.org/index.html">`ceres-solver.org`</A>

View File

@ -303,14 +303,14 @@ described in this tutorial.
This tutorial is based on the following \cgal packages: This tutorial is based on the following \cgal packages:
- \ref PkgTriangulation2Ref - \ref PkgTriangulation2
- \ref PkgPointSet3Ref - \ref PkgPointSet3
- \ref PkgPointSetProcessing3Ref - \ref PkgPointSetProcessing3
- \ref PkgSurface_mesh - \ref PkgSurface_mesh
- \ref PkgBGLRef - \ref PkgBGL
- \ref PkgPolygonMeshProcessingRef - \ref PkgPolygonMeshProcessing
- \ref PkgPolylineSimplification2Ref - \ref PkgPolylineSimplification2
- \ref PkgClassificationRef - \ref PkgClassification
The data set used throughout this tutorial comes from the The data set used throughout this tutorial comes from the
https://www.usgs.gov/ database, licensed under the _US Government https://www.usgs.gov/ database, licensed under the _US Government

View File

@ -255,7 +255,7 @@ through the points.
Each of these methods produce a triangle mesh stored in different Each of these methods produce a triangle mesh stored in different
ways. If this output mesh is hampered by defects such as holes or ways. If this output mesh is hampered by defects such as holes or
self-intersections, \cgal provide several algorithms to post-process self-intersections, \cgal provide several algorithms to postprocess
it (hole filling, remeshing, etc.) in the package \ref PkgPolygonMeshProcessing "Polygon Mesh Processing". it (hole filling, remeshing, etc.) in the package \ref PkgPolygonMeshProcessing "Polygon Mesh Processing".
We do not discuss these functions here as there are many We do not discuss these functions here as there are many

View File

@ -5,7 +5,7 @@
\cgal provides a large number of data structures and algorithms dedicated to \cgal provides a large number of data structures and algorithms dedicated to
various applications. Most of these data structures and algorithms can be various applications. Most of these data structures and algorithms can be
combined to achieve extensive and complex geometric tasks. The tutorials aim at combined to achieve extensive and complex geometric tasks. The tutorials aim at
providing help and ideas on how to use CGAL beyond the simple examples of the providing help and ideas on how to use \cgal beyond the simple examples of the
User Manual. User Manual.
\section tuto_list List of Available Tutorials \section tuto_list List of Available Tutorials

View File

@ -2,7 +2,7 @@
\page deprecated Deprecation Notice \page deprecated Deprecation Notice
In \cgal, we are trying as much as possible not to break the backward compatibility. If we have to do it, it will be announced in the <a href="https://www.cgal.org/releases.html">release notes</a> , In \cgal, we are trying as much as possible not to break the backward compatibility. If we have to do it, it will be announced in the <a href="https://www.cgal.org/releases.html">release notes</a>,
and a solution will always be provided. When possible, we keep the deprecated API for two releases before removing it. and a solution will always be provided. When possible, we keep the deprecated API for two releases before removing it.
If you reached this page after clicking on a link, it must probably mean that the documentation page you were trying to reach If you reached this page after clicking on a link, it must probably mean that the documentation page you were trying to reach
is now deprecated. Have a look at the <a href="https://www.cgal.org/releases.html">release notes</a> for more information. is now deprecated. Have a look at the <a href="https://www.cgal.org/releases.html">release notes</a> for more information.

View File

@ -39,6 +39,7 @@
\package_listing{Straight_skeleton_2} \package_listing{Straight_skeleton_2}
\package_listing{Minkowski_sum_2} \package_listing{Minkowski_sum_2}
\package_listing{Polyline_simplification_2} \package_listing{Polyline_simplification_2}
\package_listing{Frechet_distance}
\package_listing{Visibility_2} \package_listing{Visibility_2}
\package_listing{Set_movable_separability_2} \package_listing{Set_movable_separability_2}

View File

@ -116,6 +116,46 @@
,update = "04.03 kettner, 01.06 hoffmann" ,update = "04.03 kettner, 01.06 hoffmann"
} }
@inproceedings{cgal:bkn-wdfp-19,
author = {Karl Bringmann and
Marvin K{\"{u}}nnemann and
Andr{\'{e}} Nusser},
editor = {Gill Barequet and
Yusu Wang},
title = {Walking the Dog Fast in Practice: Algorithm Engineering of the Fr{\'{e}}chet
Distance},
booktitle = {35th International Symposium on Computational Geometry, SoCG 2019,
June 18-21, 2019, Portland, Oregon, {USA}},
series = {LIPIcs},
volume = {129},
pages = {17:1--17:21},
publisher = {Schloss Dagstuhl - Leibniz-Zentrum f{\"{u}}r Informatik},
year = {2019},
url = {https://doi.org/10.4230/LIPIcs.SoCG.2019.17},
doi = {10.4230/LIPICS.SOCG.2019.17},
timestamp = {Wed, 21 Aug 2024 22:46:00 +0200},
biburl = {https://dblp.org/rec/conf/compgeom/BringmannKN19.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@article{cgal:bkn-wdfp-21,
author = {Karl Bringmann and
Marvin K{\"{u}}nnemann and
Andr{\'{e}} Nusser},
title = {Walking the dog fast in practice: Algorithm engineering of the Fr{\'{e}}chet
distance},
journal = {J. Comput. Geom.},
volume = {12},
number = {1},
pages = {70--108},
year = {2021},
url = {https://doi.org/10.20382/jocg.v12i1a4},
doi = {10.20382/JOCG.V12I1A4},
timestamp = {Mon, 09 May 2022 16:20:13 +0200},
biburl = {https://dblp.org/rec/journals/jocg/BringmannKN21.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@inproceedings{ cgal:b-digph-01 @inproceedings{ cgal:b-digph-01
,author = "Herv{\'e} Br{\"o}nnimann" ,author = "Herv{\'e} Br{\"o}nnimann"
,title = "Designing and implementing a general purpose halfedge ,title = "Designing and implementing a general purpose halfedge
@ -1829,7 +1869,7 @@ ABSTRACT = {We present the first complete, exact and efficient C++ implementatio
@manual{ cgal:mnsu-lum @manual{ cgal:mnsu-lum
,author = {Mehlhorn, K. and N\"aher, S. and Seel, M. and Uhrig, C.} ,author = {Mehlhorn, K. and N\"aher, S. and Seel, M. and Uhrig, C.}
,title = {The {LEDA} {U}ser {M}anual} ,title = {The {LEDA} {U}ser {M}anual}
,organization = {Max-Planck-Insitut f\"ur Informatik} ,organization = {Max-Planck-Institut f\"ur Informatik}
,address = {66123 Saarbr\"ucken, Germany} ,address = {66123 Saarbr\"ucken, Germany}
,url = {https://domino.mpi-inf.mpg.de/internet/reports.nsf/efc044f1568a0058c125642e0064c817/cff150e000ddc461c12562a80045cb82/$FILE/MPI-I-95-1-002.pdf} ,url = {https://domino.mpi-inf.mpg.de/internet/reports.nsf/efc044f1568a0058c125642e0064c817/cff150e000ddc461c12562a80045cb82/$FILE/MPI-I-95-1-002.pdf}
,update = "99.05 schirra, 00.09 hert" ,update = "99.05 schirra, 00.09 hert"

View File

@ -73,9 +73,7 @@ The \cgal Project.
""" """
RESULT_TXT_FOOTER = r"""</td> RESULT_TXT_FOOTER = r"""</table><hr>
</tr>
</table><hr>
*/ */
""" """
@ -222,6 +220,7 @@ def protect_accentuated_letters(authors):
.replace("É", r"{\'E}") .replace("É", r"{\'E}")
.replace("ä", r"{\"a}") .replace("ä", r"{\"a}")
.replace("ö", r"{\"o}") .replace("ö", r"{\"o}")
.replace("ü", r"{\"u}")
.replace("ñ", r"{\~n}") .replace("ñ", r"{\~n}")
.replace("ã", r"{\~a}") .replace("ã", r"{\~a}")
.replace("ë", r"{\"e}") .replace("ë", r"{\"e}")
@ -321,7 +320,7 @@ def main():
) )
assert not foundDouble, ( assert not foundDouble, (
"""Multiple use of citation name '{}' package '{}' """Multiple use of citation name '{}' package '{}'
first occurence package '{}' first occurrence package '{}'
""".format(bib,pkg,citeDic[bib]) """.format(bib,pkg,citeDic[bib])
) )
result_txt += gen_txt_entry(title, authors, bib, anchor, k) result_txt += gen_txt_entry(title, authors, bib, anchor, k)

View File

@ -91,7 +91,7 @@ else
bash -$- ./compare_testsuites.sh $PWD/build_doc/doc_output $PWD/doc_ref 1> /dev/null bash -$- ./compare_testsuites.sh $PWD/build_doc/doc_output $PWD/doc_ref 1> /dev/null
fi fi
echo "done." echo "done."
#add post-processing #add postprocessing
cd ./build_doc cd ./build_doc
echo "Adding postprocessing..." echo "Adding postprocessing..."
make -j$NB_CORES doc_with_postprocessing &>> ./build_logs make -j$NB_CORES doc_with_postprocessing &>> ./build_logs

View File

@ -1,4 +1,4 @@
/// \defgroup PkgEnvelope2Ref 2D Envelopes Reference /// \defgroup PkgEnvelope2Ref Reference Manual
/// \defgroup PkgEnvelope2Concepts Concepts /// \defgroup PkgEnvelope2Concepts Concepts
/// \ingroup PkgEnvelope2Ref /// \ingroup PkgEnvelope2Ref
/*! /*!

View File

@ -1,4 +1,4 @@
/// \defgroup PkgEnvelope3Ref 3D Envelopes Reference /// \defgroup PkgEnvelope3Ref Reference Manual
/// \defgroup PkgEnvelope3Concepts Concepts /// \defgroup PkgEnvelope3Concepts Concepts
/// \ingroup PkgEnvelope3Ref /// \ingroup PkgEnvelope3Ref
/*! /*!

View File

@ -51,6 +51,9 @@
namespace CGAL { namespace CGAL {
template <typename D>
class Bbox_d;
template <class E, template <class E,
class A, class A,
class E2A, class E2A,
@ -97,6 +100,10 @@ CGAL_LAZY_FORWARD(Bbox_2)
CGAL_LAZY_FORWARD(Bbox_3) CGAL_LAZY_FORWARD(Bbox_3)
#undef CGAL_LAZY_FORWARD #undef CGAL_LAZY_FORWARD
template<class A> Bbox_d<A> const& approx(Bbox_d<A> const& d) { return d; }
template<class A> Bbox_d<A> const& exact (Bbox_d<A> const& d) { return d; }
template<class A> int depth (Bbox_d<A> const& ) { return 0; }
template<class T>inline std::enable_if_t<std::is_arithmetic<T>::value||std::is_enum<T>::value, T> approx(T d){return d;} template<class T>inline std::enable_if_t<std::is_arithmetic<T>::value||std::is_enum<T>::value, T> approx(T d){return d;}
template<class T>inline std::enable_if_t<std::is_arithmetic<T>::value||std::is_enum<T>::value, T> exact (T d){return d;} template<class T>inline std::enable_if_t<std::is_arithmetic<T>::value||std::is_enum<T>::value, T> exact (T d){return d;}
template<class T>inline std::enable_if_t<std::is_arithmetic<T>::value||std::is_enum<T>::value, int> depth(T){return -1;} template<class T>inline std::enable_if_t<std::is_arithmetic<T>::value||std::is_enum<T>::value, int> depth(T){return -1;}

View File

@ -0,0 +1,88 @@
/*!
\ingroup PkgFrechetDistanceConcepts
\cgalConcept
The concept `FrechetDistanceTraits` defines the requirements of the
first template parameter of the functions `CGAL::is_Frechet_distance_larger()`
and `CGAL::bounded_error_Frechet_distance()`, as well as of the
class template `CGAL::Frechet_distance::Neighbor_search`.
\cgalHasModelsBegin
\cgalHasModels{CGAL::Frechet_distance_traits_2}
\cgalHasModels{CGAL::Frechet_distance_traits_3}
\cgalHasModels{CGAL::Frechet_distance_traits_d}
\cgalHasModelsEnd
*/
class FrechetDistanceTraits {
public:
/// \name Types
/// @{
/*!
Dimension type with the ambient dimension `d`.
*/
using Dimension = CGAL::Dimension_tag<d>;
/*!
Point type.
*/
using Point_d = unspecified_type;
/*!
The number type of the %Cartesian coordinates of type `Point_d`. It must be a model of `FieldNumberType`.
For a given `FT n`, `to_interval(n)` must be a valid expression and it must
return an interval containing `n`, represented by a `std::pair<double, double>`.
*/
using FT = unspecified_type;
/*!
Either `CGAL::Bbox_2`, `CGAL::Bbox_3` or `CGAL::Bbox_d` depending on `Dimension`
*/
using Bbox_d = unspecified_type;
/*!
A random access iterator type to enumerate the
%Cartesian coordinates of a point, with `FT` as value type.
*/
using Cartesian_const_iterator_d = unspecified_type;
/*!
Functor with `operator()(const Point_d&)` and `operator()(const Point_d&, int)` for constructing
a begin and past-the-end `Cartesian_const_iterator_d`, respectively.
*/
using Construct_cartesian_const_iterator_d = unspecified_type;
/*!
Functor with operator to construct the bounding box of an object of type `Point_d`.
*/
using Construct_bbox_d = unspecified_type;
/*!
Functor with operator to compare the squared distance of two objects of type `Point_d` with a bound of type `FT`,
returning a `CGAL::Comparison_result`.
\note Only needed by class template `CGAL::Frechet_distance::Neighbor_search`.
*/
using Compare_squared_distance_d = unspecified_type;
/// @}
/// \name Operations
/// @{
/*!
Function used to construct an object of type `Construct_cartesian_const_iterator_d`.
*/
Construct_cartesian_const_iterator_d construct_cartesian_const_iterator_d_object() const;
/*!
Function used to construct an object of type `Construct_bbox_d`.
*/
Construct_bbox_d construct_bbox_d_object() const;
/*!
Function used to construct an object of type `Compare_squared_distance_d`.
*/
Compare_squared_distance_d compare_squared_distance_d_object() const;
/// @}
};

View File

@ -0,0 +1,3 @@
@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS}
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - dD Frechet Distance"

View File

@ -0,0 +1,138 @@
namespace CGAL {
/*!
\mainpage User Manual
\anchor Chapter_dD_Frechet_distance
\cgalAutoToc
\authors André Nusser, Marvin Künnemann, and Karl Bringmann
<center>
<img src="FrechetTeaser.png" style="max-width:30%;"/>
</center>
This package provides the means to compute an approximation of the Fréchet distance between two polylines, as well as a near neighbor data structure for polylines under the Fréchet distance, both in d-dimensional Euclidean space.
A polyline is defined by a sequence of points where we interpolate linearly between each pair of consecutive points.
In order to determine the Fréchet distance, an exact decision algorithm and a function that approximates the Fréchet distance arbitrarily well are included in the package.
The approximation algorithm is simply a binary search that repeatedly calls the decision algorithm, hence, if possible, the latter should preferably be used when optimizing for performance.
\section secFrechetDistanceIntroduction Introduction
The Fréchet distance is a classical dissimilarity measure between polylines.
Its advantages over other measures are that it both considers the polylines as continuous objects and takes into account the ordering of the points.
Intuitively, the Fréchet distance is commonly explained as follows: Imagine a human walking on one polyline while a dog walks on the other polyline,
they are connected by a leash, and they are only allowed to walk forward.
The Fréchet distance is the shortest leash length that allows the human
and the dog to jointly walk from start to end on their respective trajectories where they can each vary their speed arbitrarily.
The Fréchet distance is a metric. This implies that it is symmetric and that two polylines have distance zero if and only if they are equal (after removing redundant vertices).
The applications of this distance measure are plenty, for example:
- comparing the GPS traces of migrating animals to find the different routes that are being used
- measuring the similarity between movement patterns recorded via motion capture
- perform map matching to match a GPS trace to a transportation network
\section secFrechetDistanceAPI API
The main entry points are the following functions and classes:
- The function `bounded_error_Frechet_distance()`, which computes an approximation of the Fréchet distance between two polylines, up to a given approximation error.
It returns an interval that contains the exact distance.
- The function `is_Frechet_distance_larger()`, which determines if the Fréchet distance between two polylines is larger than a given bound.
- The class `Frechet_distance::Neighbor_search`, which stores a set of polylines and offers a query function to find polylines closer to a query curve than a given bound.
\section secFrechetTraits Traits Classes and Choice of Kernel
Both functions and the class have as template parameter a traits class defining the dimension and the point type.
The traits classes have as template parameter a kernel.
The guarantees offered by the algorithms of this package follow from the kernel choice.
In case the static constant `Has_filtered_predicates` of the kernel is `true`, the functions
combine interval arithmetic with a fallback to exact computing in case comparisons of intervals
are uncertain. This means for `Simple_cartesian<double>` that there are no guarantees, for
`Simple_cartesian<Exact_rational>` that all computations are performed with exact rationals,
and for kernels such as `Exact_predicates_inexact_constructions_kernel`, `Exact_predicates_exact_constructions_kernel`,
as well as `Epick_d` and `Epeck_d`, the computation is filtered and hence both fast and guaranteed to be correct.
\section secFrechetDistancePerformance Performance
The performance of the algorithm is quadratic in the number of vertices in the worst case.
Kernels with filtered predicates have roughly the same performance as others: the overhead of using interval arithmetic is negligible.
The algorithm is not concerned by the <em>curse of dimensionality</em>.
The running time increases when the curves are closer or when the bound for the approximation error becomes smaller.
For a very detailed analysis in practice, we refer to the journal paper entitled <em>Walking the Dog Fast in Practice: Algorithm Engineering of the Fréchet Distance</em>
\cgalCite{cgal:bkn-wdfp-21}.
\section secFrechetDistanceImplementation Implementation
The algorithms in this package are an adaption of the implementation devised by Bringmann et al. (\cgalCite{cgal:bkn-wdfp-19}
and \cgalCite{cgal:bkn-wdfp-21}). In particular, the implementation can decide non-difficult cases very
quickly, while it still has the quadratic running time guarantee of the classical Fréchet distance algorithm
by Alt and Godau \cgalCite{ag-cfdbt-95} for difficult cases. This is achieved by using fast bounding
box filtering methods and a divide-and-conquer algorithm with pruning rules on the free-space diagram.
\section secFrechetDistanceExamples Examples
In the examples, we use different kernels to illustrate that the functions
can be used with either inexact or exact kernels.
\subsection subsecFrechetDistanceFirstExample Decision for 2D Polylines
The following example shows how we can use `is_Frechet_distance_larger()`
to determine if the Frechet distance between two polylines is larger than a given distance bound.
\cgalExample{Frechet_distance/Frechet_distance_2.cpp}
\subsection subsecFrechetDistanceSecondExample Distance Computation for 3D Polylines
The following example shows how we can compute the Fréchet distance up to a given error bound on two
polylines in 3-dimensional Euclidean space using `bounded_error_Frechet_distance()`.
As we use `Simple_cartesian<double>`, the algorithm uses plain floating point arithmetic
without guarantees for correctness.
\cgalExample{Frechet_distance/Frechet_distance_3.cpp}
\subsection subsecFrechetDistanceThirdExample Distance Computation for dD Polylines
The following example shows how we can compute the Fréchet distance up to a given error bound on two
polylines in 4-dimensional Euclidean space using `bounded_error_Frechet_distance()`.
\cgalExample{Frechet_distance/Frechet_distance_d.cpp}
\subsection subsecFrechetDistanceDSExample Searching Close Curves
The following example shows how to store many curves in a data structure and to find all curves
closer than a distance bound to a query curve.
\cgalExample{Frechet_distance/Frechet_DS_3.cpp}
In the example below, we can see a query where:
- the query polyline is in bold green
- the query distance is 16
- the colorful polylines are in distance at most 16 from the query and are therefore returned
- the light gray polylines are filtered out early on and no significant computation is performed on them
- the dark gray polyline is not filtered out early on but only later by our exact decision algorithm
<center>
<img src="example_2d.png" style="max-width:30%;"/>
</center>
\subsection subsecFrechetDistanceImageCredits Image Credits
The character image is a visualization of two data points from the <a href="https://archive.ics.uci.edu/dataset/175/character+trajectories">Character Trajectories</a> data set.
\subsection subsecFrechetDistanceImplementation Implementation History
An initial version using floating point arithmetic was developed by the authors
while working at the Max-Planck Institute for Informatics in Saarbrücken, Germany.
André Nusser, together with Sebastien Loriot and Andreas Fabri, introduced
the usage of interval arithmetic and square root extensions to alleviate issues stemming from rounding errors and hence ensure correctness of the computation.
*/
} /* namespace CGAL */

View File

@ -0,0 +1,45 @@
/// \defgroup PkgFrechetDistanceRef Reference Manual
/// \defgroup PkgFrechetDistanceConcepts Concepts
/// \ingroup PkgFrechetDistanceRef
/// \defgroup PkgFrechetDistanceFunctions Functions
/// \ingroup PkgFrechetDistanceRef
/// \defgroup PkgFrechetDistanceTraits Traits Classes
/// \ingroup PkgFrechetDistanceRef
/*!
\addtogroup PkgFrechetDistanceRef
\cgalPkgDescriptionBegin{dD Fréchet Distance,PkgFrechetDistance}
\cgalPkgPicture{pdist-pkg-small.png}
\cgalPkgSummaryBegin
\cgalPkgAuthors{André Nusser, Marvin Künnemann, and Karl Bringmann}
\cgalPkgDesc{This package provides functions for computing an approximation of the Fréchet distance of two polylines in any dimension under the Euclidean metric.}
\cgalPkgManuals{Chapter_dD_Frechet_distance,PkgFrechetDistanceRef}
\cgalPkgSummaryEnd
\cgalPkgShortInfoBegin
\cgalPkgSince{6.1}
\cgalPkgBib{cgal:nkb-fd}
\cgalPkgLicense{\ref licensesGPL "GPL"}
\cgalPkgShortInfoEnd
\cgalPkgDescriptionEnd
This package provides functions for computing an approximation of the Fréchet distance of two polylines in any dimension under the Euclidean metric.
\cgalClassifedRefPages
\cgalCRPSection{Concepts}
- `FrechetDistanceTraits`
\cgalCRPSection{Classes}
- `CGAL::Frechet_distance::Neighbor_search`
- `CGAL::Frechet_distance_traits_2`
- `CGAL::Frechet_distance_traits_3`
- `CGAL::Frechet_distance_traits_d`
\cgalCRPSection{Functions}
- `CGAL::bounded_error_Frechet_distance()`
- `CGAL::is_Frechet_distance_larger()`
*/

View File

@ -0,0 +1,9 @@
Manual
Number_types
Kernel_23
Kernel_d
STL_Extension
Algebraic_foundations
Circulator
Stream_support
BGL

View File

@ -0,0 +1,10 @@
/*!
\example Frechet_distance/Frechet_distance_2.cpp
\example Frechet_distance/Frechet_distance_3.cpp
\example Frechet_distance/Frechet_distance_d.cpp
\example Frechet_distance/Frechet_distance_d_2.cpp
\example Frechet_distance/Frechet_DS_2.cpp
\example Frechet_distance/parallel_Frechet_DS_2.cpp
\example Frechet_distance/Frechet_DS_3.cpp
\example Frechet_distance/Frechet_DS_d.cpp
*/

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

View File

@ -0,0 +1,38 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
project( Frechet_distance_Examples )
find_package(CGAL REQUIRED QUIET OPTIONAL_COMPONENTS Core )
find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater)
include(CGAL_Eigen3_support)
create_single_source_cgal_program( "Frechet_distance_2.cpp" )
create_single_source_cgal_program( "Frechet_distance_3.cpp" )
create_single_source_cgal_program( "Frechet_DS_2.cpp" )
create_single_source_cgal_program( "Frechet_DS_3.cpp" )
if(TARGET CGAL::Eigen3_support)
create_single_source_cgal_program( "Frechet_DS_d.cpp" )
target_link_libraries(Frechet_DS_d PUBLIC CGAL::Eigen3_support)
create_single_source_cgal_program( "Frechet_distance_d_2.cpp" )
target_link_libraries(Frechet_distance_d_2 PUBLIC CGAL::Eigen3_support)
create_single_source_cgal_program( "Frechet_distance_d.cpp" )
target_link_libraries(Frechet_distance_d PUBLIC CGAL::Eigen3_support)
endif()
create_single_source_cgal_program("parallel_Frechet_DS_2.cpp")
find_package(TBB QUIET)
include(CGAL_TBB_support)
if(TARGET CGAL::TBB_support)
message(STATUS "Found TBB")
target_link_libraries(parallel_Frechet_DS_2 PRIVATE CGAL::TBB_support)
else()
message(STATUS "NOTICE: The example 'parallel_Frechet_DS_2' requires TBB, and will not be compiled")
endif()

View File

@ -0,0 +1,49 @@
#include <CGAL/Frechet_distance.h>
#include <CGAL/Frechet_distance_traits_2.h>
#include <CGAL/Frechet_distance/Neighbor_search.h>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/IO/WKT.h>
#include <ostream>
#include <fstream>
#include <filesystem>
using Kernel = CGAL::Simple_cartesian<double>;
using Traits = CGAL::Frechet_distance_traits_2<Kernel>;
using Point = Traits::Point_d;
using Curve = std::vector<Point>;
using Curves = std::vector<Curve>;
int main()
{
Curves curves;
const std::filesystem::path data{"./data_2d"};
std::vector<std::string> filenames;
for (auto const& dir_entry : std::filesystem::directory_iterator{data}) {
filenames.push_back(dir_entry.path().string());
}
std::sort(filenames.begin(), filenames.end());
for (auto const& filename : filenames) {
std::cout << filename << std::endl;
std::ifstream in(filename);
curves.push_back(Curve());
CGAL::IO::read_linestring_WKT(in, curves.back());
}
// last curve is the query curve
Curve query = curves.back();
curves.pop_back();
CGAL::Frechet_distance::Neighbor_search<Curve, Traits> ds(curves);
for(const Curve& c : curves){
std::pair<double, double> res = CGAL::bounded_error_Frechet_distance(c, query, 0.000001);
std::cout << "The Frechet distance between the polylines is between " << res.first << " and " << res.second << std::endl;
}
double distance = 16;
std::vector<std::size_t> result = ds.get_close_curves(query, distance);
std::cout << result.size() << " curves at Frechet distance closer than " << distance << std::endl;
}

View File

@ -0,0 +1,42 @@
#include <CGAL/Frechet_distance.h>
#include <CGAL/Frechet_distance_traits_3.h>
#include <CGAL/Frechet_distance/Neighbor_search.h>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/IO/WKT.h>
#include <ostream>
#include <fstream>
#include <filesystem>
using Kernel = CGAL::Simple_cartesian<double>;
using Traits = CGAL::Frechet_distance_traits_3<Kernel>;
using Point = Traits::Point_d;
using Curve = std::vector<Point>;
using Curves = std::vector<Curve>;
int main()
{
Curves curves;
const std::filesystem::path data{"./data_3d"};
for (auto const& dir_entry : std::filesystem::directory_iterator{data}){
std::ifstream in(dir_entry.path());
curves.push_back(Curve());
CGAL::IO::read_linestring_WKT(in, curves.back());
}
Curve query = curves.back();
curves.pop_back();
CGAL::Frechet_distance::Neighbor_search<Curve, Traits> ds(curves);
for(const Curve& c : curves){
std::pair<double, double> res = CGAL::bounded_error_Frechet_distance(c, query, 0.000001);
std::cout << "The Frechet distance between the polylines is between " << res.first << " and " << res.second << std::endl;
}
double distance = 16;
std::vector<std::size_t> result = ds.get_close_curves(query, distance);
std::cout << result.size() << " curves at Frechet distance closer than " << distance << std::endl;
return 0;
}

View File

@ -0,0 +1,41 @@
#include <CGAL/Frechet_distance.h>
#include <CGAL/Frechet_distance_traits_d.h>
#include <CGAL/Frechet_distance/Neighbor_search.h>
#include <CGAL/Epick_d.h>
#include <CGAL/IO/WKT.h>
#include <ostream>
#include <fstream>
#include <filesystem>
using Kernel = CGAL::Epick_d<CGAL::Dimension_tag<4>>;
using Traits = CGAL::Frechet_distance_traits_d<Kernel>;
using Point = Traits::Point_d;
using Curve = std::vector<Point>;
using Curves = std::vector<Curve>;
int main()
{
Curves curves;
Curve polylineA = { Point(0,0,0,0), Point(1,0,0,0), Point(1,1,0,1),Point(1,1,1,0)};
Curve polylineB = { Point(0,0,0,0), Point(1,0,0,0), Point(1,1,0,0),Point(1,1,1,0)};
Curve polylineC = { Point(0,0,0,1), Point(1,0,0,0), Point(1,1,1,0),Point(1,1,0,0)};
curves.push_back(polylineA);
curves.push_back(polylineB);
curves.push_back(polylineC);
// last curve is the query curve
Curve query = curves.back();
curves.pop_back();
CGAL::Frechet_distance::Neighbor_search<Curve,Traits> ds(curves);
for(const Curve& c : curves){
std::pair<double, double> res = CGAL::bounded_error_Frechet_distance(c, query, 0.000001);
std::cout << "The Frechet distance between the polylines is between " << res.first << " and " << res.second << std::endl;
}
double distance = 1.1;
std::vector<std::size_t> result = ds.get_close_curves(query, distance);
std::cout << result.size() << " curves at Frechet distance closer than " << distance << std::endl;
}

View File

@ -0,0 +1,25 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Frechet_distance.h>
#include <CGAL/IO/WKT.h>
#include <ostream>
#include <fstream>
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
using Point = Kernel::Point_2;
int main(int argc, char* argv[])
{
std::vector<Point> polylineA, polylineB;
{
std::ifstream in((argc > 1) ? argv[1] : CGAL::data_file_path("wkt/LetterA.wkt"));
CGAL::IO::read_linestring_WKT(in, polylineA);
}
{
std::ifstream in((argc > 1) ? argv[2] : CGAL::data_file_path("wkt/LetterAbis.wkt"));
CGAL::IO::read_linestring_WKT(in, polylineB);
}
bool res = CGAL::is_Frechet_distance_larger(polylineA, polylineB, 0.001);
std::cout << std::boolalpha << res << std::endl;
return 0;
}

View File

@ -0,0 +1,26 @@
#include <CGAL/Frechet_distance.h>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/IO/WKT.h>
#include <ostream>
#include <fstream>
using Kernel = CGAL::Simple_cartesian<double>;
using Point = Kernel::Point_3;
int main(int argc, char* argv[])
{
std::vector<Point> polylineA, polylineB;
{
std::ifstream in((argc > 1) ? argv[1] : CGAL::data_file_path("wkt/moebius.wkt"));
CGAL::IO::read_linestring_WKT(in, polylineA);
}
{
std::ifstream in((argc > 2) ? argv[2] : CGAL::data_file_path("wkt/moebius2.wkt"));
CGAL::IO::read_linestring_WKT(in, polylineB);
}
std::pair<double, double> res = CGAL::bounded_error_Frechet_distance(polylineA, polylineB, 0.000001);
std::cout << "The Frechet distance between the polylines is between " << res.first << " and " << res.second << std::endl;
return 0;
}

View File

@ -0,0 +1,18 @@
#include <CGAL/Epick_d.h>
#include <CGAL/Frechet_distance.h>
#include <iostream>
#include <vector>
using Kernel = CGAL::Epick_d<CGAL::Dimension_tag<4>>;
using Point = Kernel::Point_d;
int main()
{
std::array<Point,4> polylineA = { Point(0,0,0,0), Point(1,0,0,0), Point(1,1,0,1),Point(1,1,1,0)};
std::array<Point,4> polylineB = { Point(0,0,0,0), Point(1,0,0,0), Point(1,1,0,0),Point(1,1,1,0)};
std::pair<double, double> res = CGAL::bounded_error_Frechet_distance(polylineA, polylineB, 0.000001);
std::cout << "The Frechet distance between the polylines is between " << res.first << " and " << res.second << std::endl;
return 0;
}

View File

@ -0,0 +1,27 @@
#include <CGAL/Epick_d.h>
#include <CGAL/Frechet_distance.h>
#include <CGAL/Frechet_distance_traits_d.h>
#include <CGAL/IO/WKT.h>
#include <ostream>
#include <fstream>
using Kernel = CGAL::Epick_d<CGAL::Dimension_tag<2>>;
using Traits = CGAL::Frechet_distance_traits_d<Kernel>;
using Point = Kernel::Point_d;
int main(int argc, char* argv[])
{
std::vector<Point> polylineA, polylineB;
{
std::ifstream in((argc > 1) ? argv[1] : CGAL::data_file_path("wkt/LetterA.wkt"));
//CGAL::IO::read_linestring_WKT(in, polylineA);
}
{
std::ifstream in((argc > 1) ? argv[2] : CGAL::data_file_path("wkt/LetterAbis.wkt"));
//CGAL::IO::read_linestring_WKT(in, polylineB);
}
bool res = CGAL::is_Frechet_distance_larger(polylineA, polylineB, 0.001);
std::cout << std::boolalpha << res << std::endl;
return 0;
}

View File

@ -0,0 +1,2 @@
LINESTRING(6.112736426119762 2.5849084464443317,6.501049052879937 2.390391196918605,6.883833621191689 4.334182329531962,7.639112858623561 4.634677324131037,9.691271973819742 5.0957391854984895,11.904041889400174 7.457813982738608,11.30475904837998 9.221831012645808,12.296720789522718 8.465625336792279,11.3207832271736 8.014256670719847,13.04799700450235 10.541649605085587,12.300080072924043 12.737768821184451,10.984339257084162 10.903617159410555,12.716617366098665 14.235674883475793,12.821662505363737 16.421178652993788,11.839123527180595 15.515532938905183,13.628492284122434 16.55693104057619,15.493538853828085 16.683964523464393,16.275208717635653 16.255696297793957,18.858812339402956 16.80817069567398,22.235205116182488 16.28750871944834,22.90601643170122 17.805603796398028,24.417199016263403 20.0550904367781,25.757592249946025 17.41739857761013,27.10905957048304 19.673488489872295,25.952437469177035 17.01088844747414,26.387832960426003 18.54349559831854,26.929749055464796 19.095489805656012,25.82342848997007 17.903050856831406,26.290184536448784 18.149866370177104,25.663217476841055 19.172746737482793,26.537461204748098 18.85081255764949,27.469105872909328 18.12041090796789,28.009534738591192 19.43657505082113,29.847351736473414 20.41694899615554,30.486554274610448 20.928621687009652,30.491547890940137 22.26049494051073,31.24434340842259 22.232356743890033,28.332460591596295 24.31958744800812,28.80370324387856 23.831761593566185,30.43244788708311 23.663343237495393,30.148612366570386 21.5853595340168,34.56761385235253 20.232991274455237,37.019173653846906 21.948310496402765,36.771895970419145 21.672116576722477,38.305044193604076 24.072813320631848,38.215691747139616 25.245543953994428,40.27577696386372 26.50149591740307,38.80301159039378 28.533901620798943,38.02674030668347 29.324640233227306,38.31472929979067 28.851969187295943,39.4646206910235 30.71321530361502,42.01701190374664 32.05245582410859,40.07661986990507 31.05867972580265,40.03763507126249 30.934055179538525,39.45615647553251 33.717567454159386,39.453528101704784 34.438132713745084,40.508308894471085 32.739901143973796,40.39303085233719 32.358212288322584,39.680772959580054 34.081031617009785,39.55186085623523 37.97747084181259,41.11637591166774 38.029459096525954,41.53011718460247 36.04710225923277,40.18936807967981 37.692381847670156,41.620207917541734 38.948600287828796,43.92792185551297 38.78421284149372,43.34296080598699 38.589744553990066,42.99654963518208 39.873736110190286,43.798680003206165 40.78096274589837,45.43584633879475 40.399265130378254,43.45743934535254 41.9964067266641,42.23323067470436 42.58727403657232,41.95099722767706 44.10468566381274,40.651668619936586 46.82649921912456,40.5737268634038 47.796125454708005,38.60974737967981 49.68465905157728,38.689409346492035 48.997096076152786,38.10194905704237 48.82055753105994,36.688280838559585 48.31206855564419,37.89240786312759 48.56654262167785,40.102184310977634 49.15265993054243,39.83955484720906 51.45158141073415,41.97560726056646 55.50236471976186,38.873072181634136 55.626498937665374,42.833451477983935 54.20964124504376,44.28884597868468 54.052215669865774,44.03801607431774 55.00252616281501,42.10068924768651 53.85377994750452,40.87397833085806 53.909203285527866)

View File

@ -0,0 +1,2 @@
LINESTRING(6.112736426119762 2.5849084464443317,9.55004184253794 4.346711112361094,11.021672898753518 5.175861725684602,8.81645594695718 5.805660090303784,8.952641136956633 7.280822834631713,8.553472536489505 7.02096504930979,10.851479338265268 7.183492137662747,12.825544133108801 6.546563178189812,13.305927006829108 5.68908048211941,12.506989504265004 6.439512509733016,12.826977810223545 7.725191567225053,13.82979001582113 8.645867901247579,14.700539069810704 8.768825228923944,15.693594208914497 10.150378065831454,17.6792258584685 11.564404878404725,18.04040215861766 12.837595224279333,19.430446414570014 13.895599124340885,18.72728829781045 15.2808091709534,18.434029123330962 17.65856240003161,17.83707339164928 18.00314471214978,17.812017540950144 19.846176298247975,20.017676666684952 20.79742722248111,21.670677566618007 21.41745142238163,23.35119189070371 24.251310008561497,24.49990721940751 25.79751109217751,25.61931179191424 24.442414560189807,24.50066204813484 27.938091996739278,24.813857871531518 31.401052958842424,26.610627840574075 31.756870288757103,27.49699471589814 32.90472571825882,26.73716466147739 34.14274199067649,29.006030846950978 36.11350861544451,30.404003810442838 36.89758911096305,31.437317520476252 37.55774370432037,30.66401264285286 36.09229818724383,32.51577254733746 38.47654723229892,33.69893147202734 38.985439576385666,34.20453801830198 38.33416917174882,34.34907986763562 38.132531195672605,34.056398385133505 38.36149667599551,35.03302625657435 39.0113740308418,35.161996686768575 40.1704043625404,34.63654392062766 40.00441944105327,36.0321821630311 42.728356861069415,35.05526077742724 42.34580673425689,35.33389036074344 42.00185144746638,35.67818268947223 42.63883881365268,37.2403571449757 43.67454141579547,37.26015016832056 44.77703463486736,41.33195032667662 47.03006290695366,40.821275447159366 48.833229539384035,40.132158229914594 49.69010610526692,39.15809499961496 52.33435060225923,39.942185797917865 54.626193900783775,40.87397833085806 53.909203285527866)

View File

@ -0,0 +1,2 @@
LINESTRING(0.01920316881197575 2.7173302153220606,1.952283026968674 3.9940842018488003,4.303908177656949 5.520392238978189,6.567305156718921 5.830410573746775,8.183158119580595 7.217471914920616,11.404103956920435 4.7760701064579685,12.247715248915135 5.824709349643745,12.510176656645118 6.843199189239857,16.40710916027942 6.312724622378933,17.313254043895363 7.403486522709083,21.35959718229617 9.576700646653457,20.99140426615736 12.705063719737312,21.816527918671436 14.232190941933966,20.601532323558786 17.023858803349363,20.926655964446493 16.758853859774423,21.27091153542478 16.8893880748203,22.519986855586176 17.538037467095375,23.421903899177703 17.60764672044448,26.100221992817097 18.13118305295047,27.14341332118527 20.281227172023414,27.845867479502218 21.339728132773406,28.13481941821367 22.084692762602156,30.33706587999551 23.14306073671815,31.721426937344507 22.578668625978107,33.60050511681923 23.980627851267172,34.271676804247434 26.235487290300757,35.80774663763664 25.029670586838726,36.74968163746145 25.435374004597325,37.8015836374533 26.85256861790902,39.81014522065776 25.11806786062004,39.17891665077497 26.166918939333755,38.93793151902782 26.669969724656145,39.33777637915905 27.104389610600958,39.95792604849322 28.474790239720875,41.277707748202765 29.609357122661994,40.69850198113569 28.61092318392047,40.15993662629622 29.592681609653496,43.099231796166784 30.451189148782493,43.89423994739242 34.72666701932899,45.18673915415366 34.370698545515,45.84890824423053 33.84609509496513,46.07182189116178 33.78288238443588,45.66776277442876 35.8186415879669,45.14823919273282 34.401156895166494,45.616199722790526 36.130440468950084,47.10588431771261 35.84141786615285,49.80072865313393 36.92355454287793,51.20240223800068 35.96822132206141,50.45585965479887 35.41170179547352,51.74718541987573 34.35279396029649)

View File

@ -0,0 +1,2 @@
LINESTRING(1.9145887719423273 -8.911758100941418,1.985590594301069 -8.9911849956399,3.1559849028801183 -7.5506025470747815,3.4836266208533733 -6.5720557049784665,4.167618765677456 -5.529060559762609,5.193051826685755 -5.31195816235046,6.616657156257481 -2.414102032114985,6.96485486910747 -0.1784476968572486,7.856250484144893 0.6521738419873252,8.671308105066949 0.9378241932567412,8.542196956075914 1.9246440264253317,9.211636890775223 3.4778780084546383,8.479107839516608 6.546751154988448,8.828375666724188 6.790847737653216,8.606360819633595 9.304528546722839,11.405050796408974 11.024341291812766,13.557217711917673 12.358284526485003,12.627075746709458 12.234881387850947,11.428256299180376 11.115597241473978,12.288602484234545 12.47682056569042,12.451777288631916 12.30453490094954,12.854172456747131 14.277252743280803,13.298154172727871 13.001783370162016,12.419310244839117 11.738792783297134,14.567683974977745 11.969670516857034,15.573074640594278 11.439125391256262,16.974603464557696 13.057565122470795,18.78839471440719 16.05099399148112,22.424554923395252 15.644588814300048,23.131661197870464 19.149435790962425,23.079476042889844 18.78135234828112,24.562984087725372 19.37866073066471,22.104975761146537 21.057470568653486,25.65460022869865 23.934451375869614,23.952426368711844 26.431385959347942,23.723388146860533 26.0273350326587,25.342503499660904 27.27405979791461,25.30459400242636 28.759917082703996,25.360668015315856 28.453236645537242,26.767747335628524 29.891220097621403,29.605730083127753 32.02138336496878,29.383219304410485 34.995511276625955,29.322796836137407 37.93948461915676,31.111742535096795 38.05514539680048,29.15165939799821 38.38671316626802,30.36271488658267 41.55370948945938,31.007800930588463 43.10405073091346,31.653845734456844 42.60799301185085,33.70445678000675 43.00537866961486,36.615782716498856 44.19291052760875,35.95605084127132 44.12922022523878,37.08027133102593 43.632023225221474,34.912298551914624 43.27215098872872,37.02276484825042 46.67942984599948,36.952088032905905 47.17612254802147,36.481632589751946 47.818788800700354,36.737653271606526 48.866581214342695,39.14650191433347 48.2865185281983,39.660193414639714 49.11229625590246,40.04820251170985 46.367465358662585,40.97022969919812 47.5417501557382,39.15328720572451 49.37404195885611,39.65484072999086 51.059382798972656,42.18037284538068 51.63478460737583,41.380822801817516 52.5816549787608,40.87397833085806 53.909203285527866)

View File

@ -0,0 +1,2 @@
LINESTRING(0.01920316881197575 2.7173302153220606,-1.9725132885568686 4.396808298114495,0.460914306264967 6.257615627113183,1.5634378010765109 7.17184076954219,1.6719407452628006 7.757756191529365,1.374106897735216 7.8279174504669085,2.6371846628749935 9.406151171793926,2.286356264439272 9.586460939563569,2.266315678663256 11.94154467220665,4.297083565768492 13.499522893061481,5.403004061299473 12.41673755395625,6.99769192599981 13.97468200116899,8.39693956779986 13.534650906160646,9.282953169667099 14.936916598041263,8.601757660127623 13.926999021622544,10.216118425046922 14.707673997387298,11.127982086268055 13.914796316052543,12.198060878031887 13.84544965631178,12.08518364882348 13.970306281752682,10.69110722453816 15.7443825392419,14.218571649141198 16.21824116011263,13.910450659205376 16.09132104487624,14.843832293104862 17.658037833539108,15.651978834439761 18.743974188068353,17.458465397139094 20.05173025410321,18.32967373833948 21.216981030415702,21.512723603891217 20.668507181975436,23.271080874626477 20.413364284939544,22.931140889638638 23.05198354866531,23.8841863731413 25.758177872831766,25.52616153095304 25.728205567593463,26.127440580955554 26.916541783969922,25.871612264608103 29.289570428860422,28.725150986851165 29.407341099952802,30.63401087325989 29.680797126645004,31.839520101654667 28.309082297027082,33.17904947178293 29.414406737670987,34.32131549107053 27.876288314133912,33.82121242971697 30.346718168247357,33.713345254828795 27.614114036000554,33.35634761240047 26.42010068437059,34.825590210090375 27.228500369962312,35.626558548248106 27.07054007329538,34.58781059480957 28.56452714870953,35.00499568095852 26.89796567554231,34.36962604489664 25.779289403741746,36.20590346657988 26.468115971375887,38.33457483554684 27.73494964363518,38.9360173601088 28.337013109584447,40.6098887173223 26.551004488728342,43.60783520335697 29.27421273917809,45.699870120177245 30.867939269862664,47.12196827165821 29.488842968224454,46.26765944518667 30.68792864991955,47.45717400030481 32.86487461159349,50.02045392743377 32.54293385374996,49.64296325979909 32.47364757301509,48.67582514238965 35.23023815264972,48.35295375181058 35.90735738904394,49.544900929631346 34.583232826358184,48.962385727367426 32.2946342733971,49.08485154617404 33.89954770358362,49.84899241477491 35.15095500155454,50.146925910979846 33.99335372748221,52.22791137136446 35.26179088915292,51.74718541987573 34.35279396029649)

View File

@ -0,0 +1,2 @@
LINESTRING(6.112736426119762 2.5849084464443317,5.78204410839637 3.9004712926793164,5.538122816832845 5.875910605084722,6.168758338790276 5.161436055620873,5.589123844315058 7.19493929787285,6.4601123279936585 8.202038111274769,8.203692488468885 10.904811907056768,8.629716679512498 11.670637935109912,9.248067696875983 11.440472928535268,10.600492138567263 14.418992021483795,12.981972483512092 13.82783110123843,12.786264154798861 17.6249978956967,13.206395840110243 20.723683514294457,13.505488290336583 22.186832371862973,14.969997920702356 23.51058739741749,15.818562632292029 25.35326473733941,17.284751706103467 25.603887918729964,19.476481447308416 26.31701842178673,21.428940130044293 26.710648041683097,23.76210340334577 29.4077249902112,23.779168778334352 32.741464374069174,25.823296433867426 34.29771315954704,26.775851416629823 34.62300719079836,27.123190346650258 34.57087796584977,27.676870720012207 37.12456846016908,30.584247921741667 38.112927225895014,31.978412751255433 39.53695446540909,32.24904944893567 41.3373331515645,31.940928768406867 41.27854313017137,33.49502076646082 43.62873212729947,35.23037693858399 47.53312969647888,36.7349325194801 49.40354907917367,38.97199640396194 50.097194523333954,39.110375764912895 53.28769899449196,42.04804827482476 50.71531721898658,45.80280311298796 52.24022327616226,43.95508124329042 51.52992308065822,42.79939474878151 54.294648857519704,43.19896862698752 52.78505657177217,41.556412961183355 52.3260002842739,41.308898542577495 53.81710573183599,40.87397833085806 53.909203285527866)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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