mirror of https://github.com/CGAL/cgal
Merge remote-tracking branch 'cgal/master' into Triangulation_3-CDT_3-lrineau
# Conflicts: # Installation/CHANGES.md
This commit is contained in:
commit
0ab9d3eebf
|
|
@ -29,6 +29,7 @@ permissions:
|
|||
|
||||
jobs:
|
||||
pre_build_checks:
|
||||
if: ${{ inputs.pr_number || startsWith(github.event.comment.body, '/build:') || startsWith(github.event.comment.body, '/force-build:') }}
|
||||
runs-on: ubuntu-latest
|
||||
name: Trigger the build?
|
||||
outputs:
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgAABBTreeRef AABB Tree Reference
|
||||
/// \defgroup PkgAABBTreeRef Reference Manual
|
||||
|
||||
/// \defgroup PkgAABBTreeConcepts Concepts
|
||||
/// \ingroup PkgAABBTreeRef
|
||||
|
|
|
|||
|
|
@ -395,15 +395,15 @@ public:
|
|||
public:
|
||||
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()
|
||||
(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::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()
|
||||
(p, GeomTraits().compute_squared_distance_2_object()(p, bound)), bb)?
|
||||
CGAL::SMALLER : CGAL::LARGER;
|
||||
|
|
@ -433,6 +433,45 @@ public:
|
|||
CGAL::SMALLER :
|
||||
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);}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -49,7 +49,7 @@ We describe next the algorithm and provide examples.
|
|||
|
||||
\note A \ref tuto_reconstruction "detailed tutorial on surface reconstruction"
|
||||
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
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgAdvancingFrontSurfaceReconstructionRef Advancing Front Surface Reconstruction Reference
|
||||
/// \defgroup PkgAdvancingFrontSurfaceReconstructionRef Reference Manual
|
||||
|
||||
/// \defgroup PkgAdvancingFrontSurfaceReconstructionRefConcepts Concepts
|
||||
/// \ingroup PkgAdvancingFrontSurfaceReconstructionRef
|
||||
|
|
|
|||
|
|
@ -382,7 +382,7 @@ namespace CGAL {
|
|||
int _facet_number;
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// For post-processing
|
||||
// For postprocessing
|
||||
mutable int _postprocessing_counter;
|
||||
int _size_before_postprocessing;
|
||||
|
||||
|
|
@ -2432,7 +2432,7 @@ namespace CGAL {
|
|||
|
||||
std::size_t itmp, L_v_size_mem;
|
||||
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))
|
||||
{
|
||||
{
|
||||
|
|
|
|||
|
|
@ -80,12 +80,12 @@ using overloaded functions. However, for ease of use and backward
|
|||
compatibility all functionality is also
|
||||
accessible through global functions defined within namespace `CGAL`,
|
||||
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
|
||||
Section \ref PkgAlgebraicFoundationsRef in the reference manual.
|
||||
the according functor of the traits class. For an overview see the section "Global Functions" in the
|
||||
\ref PkgAlgebraicFoundationsRef.
|
||||
|
||||
\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>`
|
||||
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.,
|
||||
`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`
|
||||
and `Is_numerical_sensitive`, which are both `Boolean_tag`s.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgAlgebraicFoundationsRef Algebraic Foundations Reference
|
||||
/// \defgroup PkgAlgebraicFoundationsRef Reference Manual
|
||||
|
||||
/// \defgroup PkgAlgebraicFoundationsAlgebraicStructuresConcepts Concepts
|
||||
/// \ingroup PkgAlgebraicFoundationsRef
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgAlgebraicKernelDRef Algebraic Kernel Reference
|
||||
/// \defgroup PkgAlgebraicKernelDRef Reference Manual
|
||||
|
||||
/// \defgroup PkgAlgebraicKernelDConcepts Concepts
|
||||
/// \ingroup PkgAlgebraicKernelDRef
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgAlphaShapes2Ref 2D Alpha Shapes Reference
|
||||
/// \defgroup PkgAlphaShapes2Ref Reference Manual
|
||||
/// \defgroup PkgAlphaShapes2Concepts Concepts
|
||||
/// \ingroup PkgAlphaShapes2Ref
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgAlphaShapes3Ref 3D Alpha Shapes Reference
|
||||
/// \defgroup PkgAlphaShapes3Ref Reference Manual
|
||||
/// \defgroup PkgAlphaShapes3Concepts Concepts
|
||||
/// \ingroup PkgAlphaShapes3Ref
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgAlphaWrap3Ref 3D Alpha Wrapping
|
||||
/// \defgroup PkgAlphaWrap3Ref Reference Manual
|
||||
|
||||
/// \defgroup AW3_free_functions_grp Free Functions
|
||||
/// Functions to create a wrap from point clouds, triangle soups, and triangle meshes.
|
||||
|
|
|
|||
|
|
@ -348,7 +348,7 @@ public:
|
|||
|
||||
#ifdef CGAL_AW3_TIMER
|
||||
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.start();
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgApolloniusGraph2Ref 2D Apollonius Graphs (Delaunay Graphs of Disks) Reference
|
||||
/// \defgroup PkgApolloniusGraph2Ref Reference Manual
|
||||
/// \defgroup PkgApolloniusGraph2Concepts Concepts
|
||||
/// \ingroup PkgApolloniusGraph2Ref
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -4196,7 +4196,7 @@ are both parameterized by a geometric kernel and model the concepts
|
|||
`AosTraits_2` and `AosLandmarkTraits_2`.
|
||||
\cgalFootnote{They also model the refined concept
|
||||
\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
|
||||
instance `Arr_non_caching_segment_basic_traits_2<Kernel>`, which
|
||||
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
|
||||
`AosLandmarkTraits_2` concept. It also models the refined
|
||||
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,
|
||||
so it is impossible to use the landmark point-location strategy with
|
||||
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
|
||||
`AosLandmarkTraits_2` concept). It also models the refined
|
||||
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}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgArrangementOnSurface2Ref 2D Arrangement Reference
|
||||
/// \defgroup PkgArrangementOnSurface2Ref Reference Manual
|
||||
|
||||
/// \defgroup PkgArrangementOnSurface2Concepts Concepts
|
||||
/// \ingroup PkgArrangementOnSurface2Ref
|
||||
|
|
|
|||
|
|
@ -698,7 +698,7 @@ using one of the following tags:
|
|||
- `CGAL::Alpha_expansion_boost_adjacency_list_tag` (default)
|
||||
- `CGAL::Alpha_expansion_boost_compressed_sparse_raw_tag`
|
||||
- `CGAL::Alpha_expansion_MaxFlow_tag`, released under GPL
|
||||
license and provided by the \ref PkgSurfaceMeshSegmentationRef
|
||||
license and provided by the \ref PkgSurfaceMeshSegmentation
|
||||
package
|
||||
|
||||
All these implementations produce the exact same result but behave
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgBGLRef CGAL and the Boost Graph Library Reference
|
||||
/// \defgroup PkgBGLRef Reference Manual
|
||||
|
||||
/*! \defgroup PkgBGLConcepts Concepts
|
||||
\ingroup PkgBGLRef
|
||||
|
|
|
|||
|
|
@ -509,7 +509,8 @@ class Alpha_expansion_MaxFlow_impl;
|
|||
\cgalParamNEnd
|
||||
\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>`
|
||||
must be included if users want to use this implementation.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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
|
||||
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.
|
||||
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
|
||||
Wachspress and discrete harmonic coordinates with query points outside the closure
|
||||
|
|
|
|||
|
|
@ -1,8 +1,5 @@
|
|||
namespace CGAL {
|
||||
namespace Barycentric_coordinates {
|
||||
|
||||
/*!
|
||||
\defgroup PkgBarycentricCoordinates2Ref 2D Generalized Barycentric Coordinates Reference
|
||||
\defgroup PkgBarycentricCoordinates2Ref Reference Manual
|
||||
|
||||
\defgroup PkgBarycentricCoordinates2RefConcepts Concepts
|
||||
\ingroup PkgBarycentricCoordinates2Ref
|
||||
|
|
@ -77,6 +74,3 @@ coordinates from the Package \ref PkgInterpolation2.}
|
|||
- `discrete_harmonic_coordinates_2()`
|
||||
- `boundary_coordinates_2()`
|
||||
*/
|
||||
|
||||
} /* namespace Barycentric_coordinates */
|
||||
} /* namespace CGAL */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgBasicViewerRef Basic Viewer Reference
|
||||
/// \defgroup PkgBasicViewerRef Reference Manual
|
||||
|
||||
/// \defgroup PkgBasicViewerConcepts Concepts
|
||||
/// \ingroup PkgBasicViewerRef
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ In our context, a polygon must uphold the following conditions:
|
|||
<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>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>
|
||||
|
||||
\subsection bso_ssecpolygon_with_holes_validation Conditions for Valid Polygons with Holes
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgBooleanSetOperations2Ref 2D Regularized Boolean Set-Operations Reference
|
||||
/// \defgroup PkgBooleanSetOperations2Ref Reference Manual
|
||||
/// \defgroup PkgBooleanSetOperations2Concepts Concepts
|
||||
/// \ingroup PkgBooleanSetOperations2Ref
|
||||
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ public:
|
|||
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
|
||||
half-edges.
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@ optimization algorithms using the two-dimensional \cgal kernel.
|
|||
\sa `CGAL::Min_annulus_d<Traits>`
|
||||
\sa `CGAL::Min_sphere_annulus_d_traits_3<K,ET,NT>`
|
||||
\sa `CGAL::Min_sphere_annulus_d_traits_d<K,ET,NT>`
|
||||
\sa `MinSphereAnnulusDTraits`
|
||||
|
||||
*/
|
||||
template< typename K, typename ET, typename NT >
|
||||
|
|
|
|||
|
|
@ -16,8 +16,6 @@ optimization algorithms using the three-dimensional \cgal kernel.
|
|||
\sa `CGAL::Min_annulus_d<Traits>`
|
||||
\sa `CGAL::Min_sphere_annulus_d_traits_2<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 >
|
||||
class Min_sphere_annulus_d_traits_3 {
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@ optimization algorithms using the \f$ d\f$-dimensional \cgal kernel.
|
|||
\sa `CGAL::Polytope_distance_d<Traits>`
|
||||
\sa `CGAL::Min_sphere_annulus_d_traits_2<K,ET,NT>`
|
||||
\sa `CGAL::Min_sphere_annulus_d_traits_3<K,ET,NT>`
|
||||
\sa `MinSphereAnnulusDTraits`
|
||||
|
||||
*/
|
||||
template< typename K, typename ET, typename NT >
|
||||
|
|
|
|||
|
|
@ -74,25 +74,25 @@ typedef unspecified_type Equal_2;
|
|||
|
||||
/*!
|
||||
a model for
|
||||
`Kernel::Less_xy_2`.
|
||||
`Kernel::LessXY_2`.
|
||||
*/
|
||||
typedef unspecified_type Less_xy_2;
|
||||
|
||||
/*!
|
||||
a model for
|
||||
`Kernel::Less_yx_2`.
|
||||
`Kernel::LessYX_2`.
|
||||
*/
|
||||
typedef unspecified_type Less_yx_2;
|
||||
|
||||
/*!
|
||||
a model for
|
||||
`Kernel::Has_on_negative_side_2`.
|
||||
`Kernel::HasOnNegativeSide_2`.
|
||||
*/
|
||||
typedef unspecified_type Has_on_negative_side_2;
|
||||
|
||||
/*!
|
||||
a model for
|
||||
`Kernel::Compare_angle_with_x_axis_2`.
|
||||
`Kernel::CompareAngleWithXAxis_2`.
|
||||
*/
|
||||
typedef unspecified_type Compare_angle_with_x_axis_2;
|
||||
|
||||
|
|
@ -101,7 +101,7 @@ AdaptableFunctor
|
|||
`op`:
|
||||
`Rectangle_2` \f$ \times\f$ `Rectangle_2` \f$ \rightarrow\f$
|
||||
`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$.
|
||||
*/
|
||||
typedef unspecified_type Area_less_rectangle_2;
|
||||
|
|
@ -112,7 +112,7 @@ AdaptableFunctor
|
|||
`Parallelogram_2` \f$ \times\f$
|
||||
`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$.
|
||||
*/
|
||||
typedef unspecified_type Area_less_parallelogram_2;
|
||||
|
|
@ -122,7 +122,7 @@ AdaptableFunctor
|
|||
`op`:
|
||||
`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$.
|
||||
*/
|
||||
typedef unspecified_type Width_less_strip_2;
|
||||
|
|
@ -143,7 +143,7 @@ typedef unspecified_type Orientation_2;
|
|||
|
||||
/*!
|
||||
a model for
|
||||
`Kernel::Construct_vector_2`.
|
||||
`Kernel::ConstructVector_2`.
|
||||
*/
|
||||
typedef unspecified_type Construct_vector_2;
|
||||
|
||||
|
|
@ -158,25 +158,25 @@ typedef unspecified_type Construct_vector_from_direction_2;
|
|||
|
||||
/*!
|
||||
a model for
|
||||
`Kernel::Construct_perpendicular_vector_2`.
|
||||
`Kernel::ConstructPerpendicularVector_2`.
|
||||
*/
|
||||
typedef unspecified_type Construct_perpendicular_vector_2;
|
||||
|
||||
/*!
|
||||
a model for
|
||||
`Kernel::Construct_direction_2`.
|
||||
`Kernel::ConstructDirection_2`.
|
||||
*/
|
||||
typedef unspecified_type Construct_direction_2;
|
||||
|
||||
/*!
|
||||
a model for
|
||||
`Kernel::Construct_opposite_direction_2`.
|
||||
`Kernel::ConstructOppositeDirection_2`.
|
||||
*/
|
||||
typedef unspecified_type Construct_opposite_direction_2;
|
||||
|
||||
/*!
|
||||
a model for
|
||||
`Kernel::Construct_line_2`.
|
||||
`Kernel::ConstructLine_2`.
|
||||
*/
|
||||
typedef unspecified_type Construct_line_2;
|
||||
|
||||
|
|
|
|||
|
|
@ -34,31 +34,31 @@ typedef unspecified_type Point_2;
|
|||
|
||||
/*!
|
||||
model for
|
||||
`Kernel::Iso_rectangle_2`.
|
||||
`Kernel::IsoRectangle_2`.
|
||||
*/
|
||||
typedef unspecified_type Iso_rectangle_2;
|
||||
|
||||
/*!
|
||||
model for
|
||||
`Kernel::Less_x_2`.
|
||||
`Kernel::LessX_2`.
|
||||
*/
|
||||
typedef unspecified_type Less_x_2;
|
||||
|
||||
/*!
|
||||
model for
|
||||
`Kernel::Less_y_2`.
|
||||
`Kernel::LessY_2`.
|
||||
*/
|
||||
typedef unspecified_type Less_y_2;
|
||||
|
||||
/*!
|
||||
model for
|
||||
`Kernel::Construct_vertex_2`.
|
||||
`Kernel::ConstructVertex_2`.
|
||||
*/
|
||||
typedef unspecified_type Construct_vertex_2;
|
||||
|
||||
/*!
|
||||
model for
|
||||
`Kernel::Construct_iso_rectangle_2`.
|
||||
`Kernel::ConstructIsoRectangle_2`.
|
||||
*/
|
||||
typedef unspecified_type Construct_iso_rectangle_2;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgBoundingVolumesRef Bounding Volumes Reference
|
||||
/// \defgroup PkgBoundingVolumesRef Reference Manual
|
||||
/// \defgroup PkgBoundingVolumesConcepts Concepts
|
||||
/// \ingroup PkgBoundingVolumesRef
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -6,3 +6,4 @@ Circulator
|
|||
Stream_support
|
||||
Matrix_search
|
||||
Polytope_distance_d
|
||||
Number_types
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgBoxIntersectionDRef Intersecting Sequences of dD Iso-oriented Boxes Reference
|
||||
/// \defgroup PkgBoxIntersectionDRef Reference Manual
|
||||
/// \defgroup PkgBoxIntersectionDConcepts Concepts
|
||||
/// \ingroup PkgBoxIntersectionDRef
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgCGALIpeletsRef CGAL Ipelets Reference
|
||||
/// \defgroup PkgCGALIpeletsRef Reference Manual
|
||||
/*!
|
||||
\addtogroup PkgCGALIpeletsRef
|
||||
\cgalPkgDescriptionBegin{CGAL Ipelets,PkgCGALIpelets}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgCircularKernel2Ref 2D Circular Geometry Kernel Reference
|
||||
/// \defgroup PkgCircularKernel2Ref Reference Manual
|
||||
|
||||
/// \defgroup PkgCircularKernel2GeometricConcepts Geometric Concepts
|
||||
/// \ingroup PkgCircularKernel2Ref
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgCircularKernel3Ref 3D Spherical Geometry Kernel Reference
|
||||
/// \defgroup PkgCircularKernel3Ref Reference Manual
|
||||
|
||||
/// \defgroup PkgCircularKernel3GeometricConcepts Geometric Concepts
|
||||
/// \ingroup PkgCircularKernel3Ref
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgHandlesAndCirculatorsRef Handles and Circulators Reference
|
||||
/// \defgroup PkgHandlesAndCirculatorsRef Reference Manual
|
||||
/// \defgroup PkgHandlesAndCirculatorsConcepts Concepts
|
||||
/// \ingroup PkgHandlesAndCirculatorsRef
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgClassificationRef Classification Reference
|
||||
/// \defgroup PkgClassificationRef Reference Manual
|
||||
|
||||
/*!
|
||||
\defgroup PkgClassificationConcepts Concepts
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgCombinatorialMapsRef Combinatorial Maps Reference
|
||||
/// \defgroup PkgCombinatorialMapsRef Reference Manual
|
||||
|
||||
/// \defgroup PkgCombinatorialMapsConcepts Concepts
|
||||
/// \ingroup PkgCombinatorialMapsRef
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgConeSpanners2Ref Cone-Based Spanners Reference
|
||||
/// \defgroup PkgConeSpanners2Ref Reference Manual
|
||||
|
||||
/*!
|
||||
\addtogroup PkgConeSpanners2Ref
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ public:
|
|||
|
||||
The direction of the first ray can be specified by the parameter
|
||||
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 initial_direction The direction of the first ray
|
||||
|
|
|
|||
|
|
@ -169,7 +169,7 @@ protected:
|
|||
/* Construct edges in one cone bounded by two directions.
|
||||
|
||||
\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.
|
||||
*/
|
||||
void add_edges_in_cone(const Direction_2& cwBound, const Direction_2& ccwBound, Graph_& g) {
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ protected:
|
|||
/* Construct edges in one cone bounded by two directions.
|
||||
|
||||
\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.
|
||||
*/
|
||||
void add_edges_in_cone(const Direction_2& cwBound, const Direction_2& ccwBound, Graph_& g) {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgConvexDecomposition3Ref Convex Decomposition of Polyhedra Reference
|
||||
/// \defgroup PkgConvexDecomposition3Ref Reference Manual
|
||||
|
||||
/*!
|
||||
\addtogroup PkgConvexDecomposition3Ref
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgConvexHull2Ref 2D Convex Hulls and Extreme Points Reference
|
||||
/// \defgroup PkgConvexHull2Ref Reference Manual
|
||||
|
||||
/// \defgroup PkgConvexHull2Concepts Concepts
|
||||
/// \ingroup PkgConvexHull2Ref
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgConvexHull3Ref 3D Convex Hulls Reference
|
||||
/// \defgroup PkgConvexHull3Ref Reference Manual
|
||||
|
||||
/// \defgroup PkgConvexHull3Concepts Concepts
|
||||
/// \ingroup PkgConvexHull3Ref
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgConvexHullDRef dD Convex Hulls and Delaunay Triangulations Reference
|
||||
/// \defgroup PkgConvexHullDRef Reference Manual
|
||||
/// \defgroup PkgConvexHullDConcepts Concepts
|
||||
/// \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
|
|
@ -30,7 +30,7 @@ there are <I>convincing</I> reasons.
|
|||
<LI>Words in the names of concepts (<I>e.g.</I>, template parameters)
|
||||
should be separated using capital letters. The only use of underscores
|
||||
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
|
||||
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
|
||||
|
|
@ -49,10 +49,10 @@ there are <I>convincing</I> reasons.
|
|||
<LI>The first word of a class or enumeration name should be capitalized
|
||||
(<I>e.g.</I>, `Quotient`, `Orientation`).
|
||||
<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
|
||||
`is_empty` instead of simply `empty` and
|
||||
`has_on_bounded_side` instead of `on_bounded_side`.
|
||||
`is_empty()` instead of simply `empty()` and
|
||||
`has_on_bounded_side()` instead of `on_bounded_side()`.
|
||||
<LI>Names of macros should begin with the prefix `CGAL_`.
|
||||
|
||||
</UL>
|
||||
|
|
@ -72,23 +72,23 @@ there are <I>convincing</I> reasons.
|
|||
|
||||
<UL>
|
||||
<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
|
||||
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
|
||||
`has_`, <I>e.g.</I> the data structure `Min_ellipse_2` has member
|
||||
functions `is_empty` and `has_on_bounded_side`.
|
||||
`has_`, <I>e.g.</I>, the data structure `Min_ellipse_2` has member
|
||||
functions `is_empty()` and `has_on_bounded_side()`.
|
||||
<LI>Access to data structures is given via iterators and
|
||||
circulators (Chapter \ref devman_iterators_and_circulators ).
|
||||
For iterators and functions
|
||||
returning them we extend
|
||||
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
|
||||
in singular for the iterator type name and in plural for the functions
|
||||
returning the iterator.) Names related to circulators are handled
|
||||
similarly, using the suffix `_circulator`. For example, the
|
||||
function `edges_circulator` returns an `Edge_circulator`.
|
||||
function `edges_circulator()` returns an `Edge_circulator`.
|
||||
</UL>
|
||||
|
||||
\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 should be the (uncapitalized) name 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@
|
|||
\section Developer_manualReferencecounting Reference counting
|
||||
|
||||
As of release 2.1, a reference counting scheme is used for
|
||||
the kernel objects in the kernels `Cartesian` and
|
||||
`Homogeneous`.
|
||||
the kernel objects in the kernels `CGAL::Cartesian` and
|
||||
`CGAL::Homogeneous`.
|
||||
All copies of an object share a common representation object storing
|
||||
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
|
||||
bad in terms of cache efficiency.
|
||||
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}
|
||||
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:
|
||||
|
||||
<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>
|
||||
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
|
||||
|
||||
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
|
||||
allocator.
|
||||
Any concrete argument must be a model for the `Allocator` concept
|
||||
|
|
|
|||
|
|
@ -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`
|
||||
and `ostream_iterator`. The class `CGAL::Ostream_iterator<T,Stream>`
|
||||
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
|
||||
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
|
||||
iterator adaptor for the stream class `Stream` and value type `T`.
|
||||
|
|
|
|||
|
|
@ -7,56 +7,55 @@
|
|||
Names, in particular (member) function names and class names should
|
||||
be descriptive and easily remembered. So it is not surprising that
|
||||
different libraries or packages choose the same name for corresponding
|
||||
or similar classes and functions. A common approach to solving the
|
||||
naming problem is to add a prefix, for example,
|
||||
OpenGL adds `gl`
|
||||
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`.
|
||||
or similar classes and functions. A common approach to avoid ambiguities
|
||||
is to add a prefix, for example, OpenGL adds `gl` and FLTK adds `fl`,
|
||||
but the better alternative is the usage of `namespace`.
|
||||
|
||||
\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}
|
||||
#include <something>
|
||||
|
||||
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
|
||||
\endcode
|
||||
Make sure not to have include statements nested between
|
||||
<TT> namespace CGAL { </TT> and <TT> } // namespace CGAL</TT>.
|
||||
Otherwise all names defined in the file included will be
|
||||
added to namespace `CGAL`.
|
||||
|
||||
Make sure not to have include statements inside the
|
||||
`namespace CGAL`. Otherwise, all names defined in the file included will be
|
||||
added to the namespace.
|
||||
|
||||
\section Developer_manualNamespaceinternal Namespace internal
|
||||
|
||||
All names introduced by \cgal which are not documented to the user
|
||||
should be under an `internal` subnamespace of `CGAL`, <I>e.g.</I>:
|
||||
\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 CGAL::internal
|
||||
|
||||
namespace CGAL { namespace internal { namespace Package { namespace tags {
|
||||
|
||||
class Some_further_class_local_to_Package;
|
||||
|
||||
}}}} // namespace CGAL::internal::Package::tags
|
||||
} // namespace internal
|
||||
} // namespace Polygon_mesh_processing
|
||||
} // namespace CGAL
|
||||
\endcode
|
||||
|
||||
\section Developer_manualNoteonglobaltemplatefunctions Note on global template functions
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ appropriate base class interface functions (besides `draw()`).
|
|||
|
||||
\cgal has chosen a different approach, since \cgal wants to avoid large
|
||||
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}.
|
||||
|
||||
\cgalFigureBegin{FigObject,Object.png }
|
||||
|
|
@ -24,7 +24,7 @@ UML class diagram for faked object hierarchies (since 2.2-I-4).
|
|||
\cgalFigureEnd
|
||||
|
||||
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.
|
||||
|
||||
An alternative is to use a class handling several output iterators at the same time such as the classes `CGAL::Dispatch_output_iterator`.
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ probably must be deprecated and phased out), trying not to break backward
|
|||
compatibility too much.
|
||||
|
||||
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),
|
||||
Variant.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
integers or rationals. The efficiency relies on the use of speedy
|
||||
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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
could be impacted.
|
||||
|
||||
All examples and tests in CGAL are now compatible with `ctest`. So to test all examples or all tests
|
||||
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.
|
||||
For details see <a href="https://github.com/CGAL/cgal/wiki/Testing">Testing</a> on the CGAL wiki on github.
|
||||
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ sections.
|
|||
|
||||
\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
|
||||
the word `Traits`. This template parameter
|
||||
represents a concept and so has a corresponding set of requirements that
|
||||
|
|
|
|||
|
|
@ -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
|
||||
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
|
||||
|
||||
It is specified in each file of the \cgal library which license applies to it.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
\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`.
|
||||
|
||||
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.
|
||||
|
||||
\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
|
||||
executables should be linked with the CMake imported target
|
||||
`CGAL::pointmatcher_support` provided in
|
||||
|
|
@ -160,11 +160,12 @@ executables should be linked with the CMake imported target
|
|||
|
||||
The \libpointmatcher web site is <A
|
||||
HREF="https://github.com/ethz-asl/libpointmatcher">`https://github.com/ethz-asl/libpointmatcher`</A>.
|
||||
\attention On Windows, we only support version 1.3.1 of PointMatcher with version 3.3.7 of Eigen, with some changes to the recipe at
|
||||
\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`
|
||||
and `NABO_LIBRARY` becomes `libnabo_LIBRARIES` in the "Build libpointmatcher" section.
|
||||
|
||||
|
||||
\subsection thirdpartyLeda LEDA
|
||||
<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.
|
||||
|
||||
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.
|
||||
|
||||
Visit the official website of the library at <A HREF="http://ceres-solver.org/index.html">`ceres-solver.org`</A>
|
||||
|
|
|
|||
|
|
@ -303,14 +303,14 @@ described in this tutorial.
|
|||
|
||||
This tutorial is based on the following \cgal packages:
|
||||
|
||||
- \ref PkgTriangulation2Ref
|
||||
- \ref PkgPointSet3Ref
|
||||
- \ref PkgPointSetProcessing3Ref
|
||||
- \ref PkgTriangulation2
|
||||
- \ref PkgPointSet3
|
||||
- \ref PkgPointSetProcessing3
|
||||
- \ref PkgSurface_mesh
|
||||
- \ref PkgBGLRef
|
||||
- \ref PkgPolygonMeshProcessingRef
|
||||
- \ref PkgPolylineSimplification2Ref
|
||||
- \ref PkgClassificationRef
|
||||
- \ref PkgBGL
|
||||
- \ref PkgPolygonMeshProcessing
|
||||
- \ref PkgPolylineSimplification2
|
||||
- \ref PkgClassification
|
||||
|
||||
The data set used throughout this tutorial comes from the
|
||||
https://www.usgs.gov/ database, licensed under the _US Government
|
||||
|
|
|
|||
|
|
@ -255,7 +255,7 @@ through the points.
|
|||
|
||||
Each of these methods produce a triangle mesh stored in different
|
||||
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".
|
||||
|
||||
We do not discuss these functions here as there are many
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
\cgal provides a large number of data structures and algorithms dedicated to
|
||||
various applications. Most of these data structures and algorithms can be
|
||||
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.
|
||||
|
||||
\section tuto_list List of Available Tutorials
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
\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.
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
\package_listing{Straight_skeleton_2}
|
||||
\package_listing{Minkowski_sum_2}
|
||||
\package_listing{Polyline_simplification_2}
|
||||
\package_listing{Frechet_distance}
|
||||
\package_listing{Visibility_2}
|
||||
\package_listing{Set_movable_separability_2}
|
||||
|
||||
|
|
|
|||
|
|
@ -116,6 +116,46 @@
|
|||
,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
|
||||
,author = "Herv{\'e} Br{\"o}nnimann"
|
||||
,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
|
||||
,author = {Mehlhorn, K. and N\"aher, S. and Seel, M. and Uhrig, C.}
|
||||
,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}
|
||||
,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"
|
||||
|
|
|
|||
|
|
@ -73,9 +73,7 @@ The \cgal Project.
|
|||
|
||||
|
||||
"""
|
||||
RESULT_TXT_FOOTER = r"""</td>
|
||||
</tr>
|
||||
</table><hr>
|
||||
RESULT_TXT_FOOTER = r"""</table><hr>
|
||||
*/
|
||||
"""
|
||||
|
||||
|
|
@ -222,6 +220,7 @@ def protect_accentuated_letters(authors):
|
|||
.replace("É", r"{\'E}")
|
||||
.replace("ä", r"{\"a}")
|
||||
.replace("ö", r"{\"o}")
|
||||
.replace("ü", r"{\"u}")
|
||||
.replace("ñ", r"{\~n}")
|
||||
.replace("ã", r"{\~a}")
|
||||
.replace("ë", r"{\"e}")
|
||||
|
|
@ -321,7 +320,7 @@ def main():
|
|||
)
|
||||
assert not foundDouble, (
|
||||
"""Multiple use of citation name '{}' package '{}'
|
||||
first occurence package '{}'
|
||||
first occurrence package '{}'
|
||||
""".format(bib,pkg,citeDic[bib])
|
||||
)
|
||||
result_txt += gen_txt_entry(title, authors, bib, anchor, k)
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ else
|
|||
bash -$- ./compare_testsuites.sh $PWD/build_doc/doc_output $PWD/doc_ref 1> /dev/null
|
||||
fi
|
||||
echo "done."
|
||||
#add post-processing
|
||||
#add postprocessing
|
||||
cd ./build_doc
|
||||
echo "Adding postprocessing..."
|
||||
make -j$NB_CORES doc_with_postprocessing &>> ./build_logs
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgEnvelope2Ref 2D Envelopes Reference
|
||||
/// \defgroup PkgEnvelope2Ref Reference Manual
|
||||
/// \defgroup PkgEnvelope2Concepts Concepts
|
||||
/// \ingroup PkgEnvelope2Ref
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// \defgroup PkgEnvelope3Ref 3D Envelopes Reference
|
||||
/// \defgroup PkgEnvelope3Ref Reference Manual
|
||||
/// \defgroup PkgEnvelope3Concepts Concepts
|
||||
/// \ingroup PkgEnvelope3Ref
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -51,6 +51,9 @@
|
|||
|
||||
namespace CGAL {
|
||||
|
||||
template <typename D>
|
||||
class Bbox_d;
|
||||
|
||||
template <class E,
|
||||
class A,
|
||||
class E2A,
|
||||
|
|
@ -97,6 +100,10 @@ CGAL_LAZY_FORWARD(Bbox_2)
|
|||
CGAL_LAZY_FORWARD(Bbox_3)
|
||||
#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> 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;}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
/// @}
|
||||
};
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS}
|
||||
|
||||
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - dD Frechet Distance"
|
||||
|
|
@ -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 */
|
||||
|
|
@ -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()`
|
||||
*/
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
Manual
|
||||
Number_types
|
||||
Kernel_23
|
||||
Kernel_d
|
||||
STL_Extension
|
||||
Algebraic_foundations
|
||||
Circulator
|
||||
Stream_support
|
||||
BGL
|
||||
|
|
@ -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 |
|
|
@ -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()
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
@ -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
Loading…
Reference in New Issue