diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h
new file mode 100644
index 00000000000..85c697f40a8
--- /dev/null
+++ b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h
@@ -0,0 +1,59 @@
+// Undocumented for now
+#ifndef DOXYGEN_RUNNING
+
+/*!
+\ingroup PkgAlphaWrap3Concepts
+\cgalConcept
+
+The concept `AlphaWrapOracle` defines the requirements for an Alpha Wrap Oracle, that is a class
+that answers a number of queries over the input of the algorithm.
+The oracle is the template parameter of the class `CGAL::Alpha_wraps_3_::Alpha_wrap_3`.
+
+\cgalHasModel `CGAL::Alpha_wraps_3_::Point_set_oracle`
+\cgalHasModel `CGAL::Alpha_wraps_3_::Segment_soup_oracle`
+\cgalHasModel `CGAL::Alpha_wraps_3_::Triangle_mesh_oracle`
+\cgalHasModel `CGAL::Alpha_wraps_3_::Triangle_soup_oracle`
+
+*/
+template
+class AlphaWrapOracle
+{
+public:
+ /// The geometric traits, must be a model of `AlphaWrapOracleTraits_3`
+ typedef unspecified_type Geom_traits;
+
+ /// Field type
+ typedef Geom_traits::FT FT;
+
+ /// Point type
+ typedef Geom_traits::Point_3 Point_3;
+
+ /// Sphere type
+ typedef Geom_traits::Ball_3 Ball_3;
+
+ /// Returns the geometric traits
+ Geom_traits geom_traits();
+
+ /// Returns an axis-aligned box enclosing the input data.
+ CGAL::Bbox_3 bbox();
+
+ /// Returns whether the ball `b` intersects the input data.
+ bool do_intersect(Ball_3 b);
+
+ /// Returns whether the tetrahedron `tet` intersects the input data.
+ template
+ bool do_intersect(Tetrahedron_with_outside_info tet);
+
+ /// Returns the intersection `o` of the segment `[p;q]` with the offset isolevel at distance `os`
+ /// from the input. In case of multiple intersections, the intersection closest to `p` is returned.
+ /// Returns `true` if there is an intersection, and `false` otherwise.
+ bool first_intersection(Point_3 p, Point_3 q, Point_3& o, double os);
+
+ /// Returns the point on the input data closest to `q`.
+ Point_3 closest_point(Point_3 q);
+
+ /// Returns the smallest squared distance between `q` and the input data.
+ FT squared_distance(Point_3 q);
+};
+
+#endif // DOXYGEN_RUNNING
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h
new file mode 100644
index 00000000000..b324e643363
--- /dev/null
+++ b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h
@@ -0,0 +1,188 @@
+// Undocumented for now
+#ifndef DOXYGEN_RUNNING
+
+/*!
+\ingroup PkgAlphaWrap3Concepts
+\cgalConcept
+
+@fixme Because of a few calls to PMP::, if you only look at the doc, it's all pointless because
+you require Kernel. Stitch_borders doesn't even have clear geometric traits requirements...
+
+The concept `AlphaWrapTraits_3` defines the requirements for the geometric traits class
+of an alpha wrap oracle.
+
+\cgalHasModel Any 3D %kernel is a model of this traits concept.
+*/
+
+class AlphaWrapTraits_3
+{
+public:
+ /// The field type
+ typedef unspecified_type FT;
+
+ /// The point type
+ typedef unspecified_type Point_3;
+
+ /// The vector type
+ typedef unspecified_type Vector_3;
+
+ /// The triangle type
+ typedef unspecified_type Triangle_3;
+
+ /// The tetrahedron type
+ typedef unspecified_type Tetrahedron_3;
+
+ /// The ball type
+ typedef unspecified_type Ball_3;
+
+ /*!
+ A predicate object that must provide the following function operator:
+
+ `CGAL::Comparison_result operator()(Point_3 p, Point_3 q, FT sqd)`,
+
+ which compares the squared distance between the two points `p` and `q` to the value `sqd`.
+ */
+ typedef unspecified_type Compare_squared_distance_3;
+
+ /*!
+ A construction object that must provide the following function operator:
+
+ `FT operator()(Vector_3 v)`,
+
+ which returns the squared length of the vector `v`.
+ */
+ typedef unspecified_type Compute_squared_length_3;
+
+ /*!
+ A construction object that must provide the following function operators:
+
+ `FT operator()(Point_3 p, Point_3 q, Point_3 r)`,
+
+ and
+
+ `FT operator()(Point_3 p, Point_3 q, Point_3 r, Point_3 s)`,
+
+ which returns the squared radius of the smallest sphere enclosing the points.
+ */
+ typedef unspecified_type Compute_squared_radius_3;
+
+ /*!
+ A predicate object that must provide the following function operator:
+
+ `bool operator()(Point_3 p, Point_3 q, Point_3 r)`,
+
+ which returns `true`, iff `p`, `q`, and `r` are collinear.
+ */
+ typedef unspecified_type Collinear_3;
+
+ /*!
+ A construction object that must provide the following function operator:
+
+ `Ball_3 operator()(Point_3 p, FT sqr)`,
+
+ which returns the ball centered at `p` with squared radius `sqr`.
+ */
+ typedef unspecified_type Construct_ball_3;
+
+ /*!
+ A construction object that must provide the following function operators:
+
+ `CGAL::Bbox_3 operator()(Triangle_3 tr)`,
+
+ and
+
+ `CGAL::Bbox_3 operator()(Tetrahedron_3 tet)`,
+
+ which returns the ball centered at `p` with squared radius `sqr`.
+ */
+ typedef unspecified_type Construct_bbox_3;
+
+ /*!
+ A construction object that must provide the following function operator:
+
+ `Vector_3 operator()(Vector_3 v, FT a)`,
+
+ which returns the vector `v` with length scaled by `a`.
+ */
+ typedef unspecified_type Construct_scaled_vector_3;
+
+ /*!
+ A construction object that must provide the following function operator:
+
+ `Point_3 operator()(Point_3 p, Vector_3 v)`,
+
+ which returns the point `p` translated by the vector `v`.
+ */
+ typedef unspecified_type Construct_translated_point_3;
+
+ /*!
+ A predicate object that must provide the following function operators:
+
+ `bool operator()(Tetrahedron_3 tet, Point_3 p)`,
+
+ and
+
+ `bool operator()(Sphere_3 s, Point_3 p)`,
+
+ which return `true` iff `p` is on the bounded side of the respective kernel objects.
+ */
+ typedef unspecified_type Has_on_bounded_side_3;
+
+ /*!
+ A predicate object that must provide the following function operator:
+
+ `bool operator()(Point_3 p, Point_3 q, Point_3 r, Point_3 s)`,
+
+ which returns `true` iff `s` is on the bounded side of the smallest sphere enclosing `p`, `q`, and `r`.
+ */
+ typedef unspecified_type Side_of_bounded_sphere_3;
+
+ // ===
+
+ /*!
+ returns the `Compare_squared_distance_3` predicate.
+ */
+ Compare_squared_distance_3 compare_squared_distance_3_object();
+
+ /*!
+ returns the `Compute_squared_length_3` predicate.
+ */
+ Compute_squared_length_3 compute_squared_length_3_object();
+
+ /*!
+ returns the `Compute_squared_radius_3` predicate.
+ */
+ Compute_squared_radius_3 compute_squared_radius_3_object();
+
+ /*!
+ returns the `Collinear_3` predicate.
+ */
+ Collinear_3 collinear_3_object();
+
+ /*!
+ returns the `Construct_ball_3` construction.
+ */
+ Construct_ball_3 construct_ball_3_object();
+
+ /*!
+ returns the `Construct_scaled_vector_3` construction.
+ */
+ Construct_scaled_vector_3 construct_scaled_vector_3_object();
+
+ /*!
+ returns the `Construct_translated_point_3` construction.
+ */
+ Construct_translated_point_3 construct_translated_point_3_object();
+
+ /*!
+ returns the `Has_on_bounded_side_3` predicate.
+ */
+ Has_on_bounded_side_3 has_on_bounded_side_3_object();
+
+ /*!
+ returns the `Side_of_bounded_sphere_3` predicate.
+ */
+ Side_of_bounded_sphere_3 side_of_bounded_sphere_3_object();
+};
+
+#endif // DOXYGEN_RUNNING
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/Doxyfile.in b/Alpha_wrap_3/doc/Alpha_wrap_3/Doxyfile.in
new file mode 100644
index 00000000000..aa96fdfd9ba
--- /dev/null
+++ b/Alpha_wrap_3/doc/Alpha_wrap_3/Doxyfile.in
@@ -0,0 +1,20 @@
+@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS}
+
+PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - 3D Alpha Wrapping"
+
+# custom options for this package
+EXTRACT_ALL = false
+HIDE_UNDOC_MEMBERS = true
+HIDE_UNDOC_CLASSES = true
+
+HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_bike_lod.jpg \
+ ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_triangle_soup.jpg \
+ ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_non_manifold_cases.jpg \
+ ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_pencil.png \
+ ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_steps.jpg \
+ ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_church_lod.jpg \
+ ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_sharp_feature.jpg \
+ ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_steiner.jpg \
+ ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_alpha_offset_bike.jpg \
+ ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_double_sided.jpg \
+ ${CGAL_PACKAGE_DOC_DIR}/fig/aw3_thingi10k_benchmark.jpg
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/PackageDescription.txt b/Alpha_wrap_3/doc/Alpha_wrap_3/PackageDescription.txt
new file mode 100644
index 00000000000..59ef5b0ad53
--- /dev/null
+++ b/Alpha_wrap_3/doc/Alpha_wrap_3/PackageDescription.txt
@@ -0,0 +1,38 @@
+/// \defgroup PkgAlphaWrap3Ref 3D Alpha Wrapping
+
+/// \defgroup PkgAlphaWrap3Concepts Concepts
+/// \ingroup PkgAlphaWrap3Ref
+
+/// \defgroup AW3_free_functions_grp Free Functions
+/// Functions to create a wrap from point clouds, triangle soups, and triangle meshes.
+/// \ingroup PkgAlphaWrap3Ref
+
+/*!
+\addtogroup PkgAlphaWrap3Ref
+\cgalPkgDescriptionBegin{3D Alpha Wrapping,PkgAlphaWrap3}
+\cgalPkgPicture{alpha_wrap_3.jpg}
+\cgalPkgSummaryBegin
+\cgalPkgAuthors{TBA}
+\cgalPkgDesc{This component takes a 3D triangle mesh, a triangle soup, or a point set as input, and generates
+ a valid triangulated surface mesh that strictly contains the input (watertight, intersection-free
+ and 2-manifold). The algorithm proceeds by shrink-wrapping
+ and refining a 3D Delaunay triangulation loosely bounding the input.
+ Two user-defined parameters, alpha and offset, offer control over the maximum size
+ of cavities where the shrink-wrapping process can enter, and the tightness
+ of the final surface mesh to the input, respectively. Once combined, these parameters
+ provide a means to trade fidelity to the input for complexity of the output.}
+\cgalPkgManuals{Chapter_3D_Alpha_wrapping,PkgAlphaWrap3Ref}
+\cgalPkgSummaryEnd
+\cgalPkgShortInfoBegin
+\cgalPkgSince{5.5}
+\cgalPkgDependsOn{\ref PkgTriangulation3 and \ref PkgPolygonMeshProcessing}
+\cgalPkgBib{cgal:TBA-aw3}
+\cgalPkgLicense{\ref licensesGPL "GPL"}
+\cgalPkgShortInfoEnd
+\cgalPkgDescriptionEnd
+
+\cgalClassifedRefPages
+
+\cgalCRPSection{Functions}
+- \link AW3_free_functions_grp `CGAL::alpha_wrap_3()` \endlink
+*/
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/alpha_wrap_3.txt b/Alpha_wrap_3/doc/Alpha_wrap_3/alpha_wrap_3.txt
new file mode 100644
index 00000000000..9b878ff0043
--- /dev/null
+++ b/Alpha_wrap_3/doc/Alpha_wrap_3/alpha_wrap_3.txt
@@ -0,0 +1,370 @@
+namespace CGAL {
+
+/*!
+
+\mainpage User Manual
+\anchor Chapter_3D_Alpha_wrapping
+\cgalAutoToc
+
+\authors TBA
+
+
+
+
+
+\section aw3_introduction Introduction
+
+Various tasks in geometric modeling and processing require 3D objects represented as valid surface meshes,
+where "valid" refers to meshes that are watertight, intersection-free, orientable, and 2-manifold.
+Such representations offer well-defined notions of interior/exterior and geodesic neighborhoods.
+
+3D data are usually acquired through measurements followed by reconstruction, designed by humans,
+or generated through imperfect automated processes.
+As a result, they can exhibit a wide variety of defects including gaps, missing data,
+self-intersections, degeneracies such as zero-volume structures, and non-manifold features.
+
+Given the large repertoire of possible defects, many methods and data structures have been proposed
+to repair specific defects, usually with the goal of guaranteeing specific properties in the repaired 3D model.
+Reliably repairing all types of defects is notoriously difficult and is often an ill-posed problem
+as many valid solutions exist for a given 3D model with defects.
+In addition, the input model can be overly complex with unnecessary geometric details,
+spurious topological structures, nonessential inner components, or excessively fine discretizations.
+For applications such as collision avoidance, path planning, or simulation,
+getting an approximation of the input can be more relevant than repairing it.
+Approximation herein refers to an approach capable of filtering out inner structures,
+fine details and cavities, as well as wrapping the input within a user-defined offset margin.
+
+Given an input 3D geometry, we address the problem of computing a conservative approximation,
+where conservative means that the output is guaranteed to strictly enclose the input.
+We seek unconditional robustness in the sense that the output mesh should be valid (oriented,
+2-manifold, and without self-intersections), even for raw input with many defects
+and degeneracies.
+The default input is a soup of 3D triangles, but the generic interface leaves the door open
+to other types of finite 3D primitives.
+
+\cgalFigureAnchor{1}
+
+
+
+\cgalFigureCaptionBegin{1}
+Shrink-wrapping output from a triangle soup, with many intersections and gaps.
+From left to right, input model, output wrap, and superposition.
+\cgalFigureCaptionEnd
+
+\cgalFigureAnchor{2}
+
+
+
+\cgalFigureCaptionBegin{2}
+Dealing with non-manifold features and degeneracies.
+From left to right, a non-manifold vertex, self-intersecting faces and two adjacent triangles
+representing a zero-volume structure.
+The algorithm handles these cases by wrapping an offset of the input.
+\cgalFigureCaptionEnd
+
+\section aw3_definition Approach
+
+Many approaches have been devised to enclose a 3D model within a volume, featuring different balances
+between the runtime and quality (i.e., tightness) of the approximation.
+Within the simplest cases, an axis-aligned or oriented bounding box clearly satisfies some desired properties;
+however, the approximation error is uncontrollable and often very large.
+Computing the convex hull of the input also matches some of the desired properties
+and improves the quality of the result, albeit at the price of increasing the runtime.
+However, the approximation remains crude, especially in the case of several components.
+
+The convex hull is, in fact, a special case of alpha shapes (\ref Chapter_3D_Alpha_Shapes).
+Mathematically, the alpha shape is a subcomplex of the Delaunay triangulation, with simplicies
+being part of the complex depending on the size of their minimal (empty) Delaunay ball.
+Intuitively, constructing 3D alpha shapes can be thought of as carving 3D space with an empty ball
+of user-defined radius alpha.
+Alpha shapes yield provable, good piecewise-linear approximations of a shape \cgalCite{bb-srmua-97t},
+but are defined on point sets, whereas we wish to deal with more general input data, such as triangle soups.
+Even after sampling the triangle soup, alpha shapes do not guarantee to be conservative for any alpha.
+Finally, inner structures are also carved within the volumes, instead of being filtered out.
+
+Inspired by alpha shapes, we replace the above notion of carving by shrink-wrapping:
+we iteratively construct a subcomplex of a 3D Delaunay triangulation by starting from
+a simple 3D Delaunay triangulation enclosing the input, and then iteratively removing eligible tetrahedra
+that lie on the boundary of the complex.
+In addition, the underlying triangulation---and thus the complex incidentally---is refined
+as shrinking proceeds.
+Thus, instead of carving from the convex hull of the input data as in alpha shapes, we construct
+an entirely new mesh through a Delaunay refinement-like algorithm. The refinement algorithm inserts Steiner points
+on the boundary of an offset volume, defined as a level set of the unsigned distance field to the input.
+
+This process both prevents the creation of inner structures within the output and avoids superfluous computations.
+In addition, detaching our mesh construction from the geometry and discretization of the input has several advantages:
+(1) the underlying data is not restricted to a specific format (triangle soups, polygon soups, point clouds, etc.)
+as all that is required is answering three basic geometric queries: (a) the distance between a point
+and the input, (b) the projection of a query point onto the input, (c) an intersection test
+between a tetrahedron and the input, and (2) The user has more freedom to trade tightness
+to the input for final mesh complexity, as constructing a conservative approximation on a large offset
+of the input requires fewer mesh elements.
+
+\subsection aw3_algorithm Algorithm
+
+Initialization. The algorithm is initialized by inserting the eight corner vertices
+of a loose bounding box into a 3D Delaunay triangulation.
+In the 3D Delaunay triangulation of \cgal, all triangle facets are adjacent to two tetrahedron cells.
+Each facet of the boundary of the Delaunay triangulation, which coincides with one facet
+of the convex hull of the triangulation vertices, is adjacent to a so-called infinite tetrahedron cell,
+an abstract cell connected to the so-called infinite vertex to ensure the aforementioned double-facet adjacency.
+Initially, all infinite cells are tagged as outside, and all finite tetrahedron cells are tagged as inside.
+
+Shrink-wrapping. The shrink-wrapping algorithm proceeds by traversing the cells
+of the Delaunay triangulation from outside to inside, flood-filling from one cell to its adjacent cell,
+and tagging the adjacent cell as outside whenever possible (the term possible is specified later).
+Flood filling is implemented via a priority queue of Delaunay triangle facets representing
+the traversal between the two adjacent cells of the facet, from outside to inside.
+These triangle facets are referred to as gates in the following.
+
+Given an outside cell and its adjacent inside cell, the common facet (i.e., a gate) is said
+to be alpha-traversable if its circumradius is larger than the user-defined parameter alpha,
+where circumradius refers to the radius of the relating triangle's Delaunay ball.
+Intuitively, cavities smaller than alpha are not accessible as their gates are not alpha-traversable.
+
+Initialized by the alpha-traversable gates on the convex hull, the priority queue contains only
+alpha-traversable gates and is sorted by decreasing order
+of the circumradius of the gate.
+Traversal can be seen as a continuous process that advances along dual Voronoi edges of the gates,
+with a pencil of empty balls circumscribing the gate.
+
+\cgalFigureAnchor{3}
+
+
+
+\cgalFigureCaptionBegin{3}
+(Left) Pencil of empty circles (blue) circumscribing a Delaunay edge (green) in a 2D Delaunay triangulation (black).
+From the top triangle circumcenter c1 to the bottom triangle circumcenter c2, the dual Voronoi edge denoted by e (doted red) is the trace of centers of the largest circles that are empty of Delaunay vertex.
+(Right) The graph corresponding to the left example. The x-axis corresponds to the position of empty circle centers located on the Voronoi edge e, from c1 to c2. The y-axis is the radius value of the corresponding empty circles. In this case, the minimum radius of this pencil of empty circle is located at the midpoint of the green Delaunay edge.
+In our algorithm, a gate (green Delaunay edge) is said to be not alpha-traversable when the minimum radius of the pencil of empty circle is smaller than alpha.
+\cgalFigureCaptionEnd
+
+When traversing from an outside cell \f$ c_o \f$ to an inside cell \f$ c_i \f$ through an alpha-traversable facet \f$ f \f$,
+two criteria are tested to prevent the wrapping process from colliding with the input:
+
+(1) We check for an intersection between the dual Voronoi edge of \f$ f \f$, i.e. the segment between
+the circumcenters of the two incident cells, and the offset surface, defined as the level set
+of unsigned isosurface to the input.
+If one or several intersections exists, the first intersection point, along the dual Voronoi edge
+oriented from outside to inside is inserted into the triangulation as a Steiner point.
+
+(2) If the dual Voronoi edge does not intersect the offset surface but the neighboring cell \f$ c_i \f$
+intersects the input, we compute the projection of the circumcenter of \f$ c_i \f$
+onto the offset surface, and insert it into the triangulation as a Steiner point (which destroys \f$ c_i \f$).
+
+After each of the above Steiner point insertions, all new incident cells are tagged as inside,
+and the newly alpha-traversable gates are pushed into the priority queue.
+
+If none of the above two criteria are met, the neighboring cell \f$ c_i \f$ is traversed and tagged as outside.
+Alpha-Traversable facets of \f$ c_i \f$ that are separating inside from outside cells are pushed as new gates into the priority queue.
+
+Once the queue empties---a process that is guaranteed as facets (and their circumradii) become smaller
+due to the insertion of new Steiner points---the construction phase terminates.
+The output triangle surface mesh is extracted from the Delaunay triangulation as the set of facets
+separating inside from outside cells.
+
+The figure below depicts the steps of the algorithm in 2D.
+
+\cgalFigureAnchor{4}
+
+
+
+\cgalFigureCaptionBegin{4}
+Steps of the shrink-wrapping algorithm in 2D.
+The algorithm is initialized by inserting the corners of the loose bounding box of the input (red)
+into a Delaunay triangulation, and all finite triangles are tagged inside (grey).
+The current gate (green edge) popped out from the queue is alpha-traversable. The triangle adjacent
+to the gate is tagged outside when it does not intersect the input, and new alpha-traversable gates
+are pushed to the queue. When the adjacent triangle intersects the input, a new Steiner point (large green disc)
+is computed and inserted into the triangulation, all neighboring triangles are tagged inside,
+new alpha-traversable gates are pushed to the queue, and traversal is resumed.
+Grey edges depict the Delaunay triangulation. Blue edges depict the Voronoi diagram.
+Pink circles depict the empty circle of radius alpha. The output edges (dark blue) separate inside from outside triangles.
+\cgalFigureCaptionEnd
+
+\subsection aw3_guarantees Guarantees
+
+The algorithm is proven to terminate and to produce a 2-manifold triangulated surface mesh
+that strictly encloses the input data.
+The key element to the proof is that we wrap from outside to inside and never allow a cell
+that intersects the input to be flagged inside.
+Furthermore, both criteria that lead to refinement of the triangulation insert Steiner points
+that are guaranteed to break the cells in need of refinement and reduce the neighbor facets circumradii.
+
+Because the main refinement criterion is the insertion of an intersection between a dual Voronoi edge
+and an offset of the input, or the projection of a Voronoi vertex onto the offset of the input,
+the algorithm has similarities to popular meshing algorithms based on Delaunay filtering
+and refinement (see \ref Chapter_3D_Mesh_Generation).
+
+\section aw3_interface Interface
+
+Our algorithm takes as input a set of triangles in 3D, provided either as a triangle soup or
+as a triangle surface mesh, and two user-defined scalar parameters: the alpha and the offset values.
+It proceeds by shrink-wrapping and refining a 3D Delaunay triangulation starting from a loose bounding box of the input.
+The parameter alpha refers to the size of cavities or holes that cannot be traversed during wrapping,
+and hence to the final level of detail, as alpha acts like a sizing field in a common Delaunay
+refinement algorithm (\ref Chapter_3D_Mesh_Generation).
+The parameter offset refers to the distance between the vertices of the refined triangulation
+and the input, so that a large offset translates into a loose enclosing of the input.
+This second parameter offers a means to control the trade-off between tightness and complexity.
+
+The main entry point of the component is a global function that generates the alpha wrap;
+this function takes as input a polygon soup or a polygon mesh: `CGAL::alpha_wrap_3()`.
+There is no prerequisite on the input connectivity so that it can take an arbitrary triangle soup,
+with islands, self-intersections, or overlaps, as well as combinatorial or geometrical degeneracies.
+
+The underlying traits class must be a model of the `AlphaWrapTraits_3` concept. It should use
+a floating point number type as inexactness is inherent to the algorithm since there is no closed
+form description of new vertices on the offset surface.
+
+The output is a triangle surface mesh whose type is chosen by the user, under the constraint
+that it must be a model of the `MutableFaceGraph` concept.
+
+\section aw3_parameters Choosing Parameters
+
+The two parameters of the algorithm impact both the level of detail and complexity of the output mesh.
+
+\subsection aw3_alpha Alpha
+
+The main parameter, alpha, controls whether a Delaunay facet is traversable during shrink-wrapping.
+Alpha's main purpose is to control the size
+of the empty balls used during wrapping, and thus to determine which features will appear in the output:
+indeed, a facet is alpha-traversable if its circumradius is larger than alpha; hence, the algorithm
+can only shrink-wrap through straits or holes with diameters larger than alpha.
+A second, less direct consequence is that as long as a facet has a circumradius larger than alpha,
+the incident inside cell will be visited and possibly refined.
+Therefore, when the algorithm terminates, all facets have a circumradius smaller than alpha.
+This parameter thus also behaves like a sizing criterion on the triangle facets of the output.
+
+\cgalFigureAnchor{5}
+
+
+
+\cgalFigureCaptionBegin{5}
+Impact of the alpha parameter on the output.
+(Left) The input triangle mesh, generated by surface reconstruction from a raw point cloud,
+has many non-manifold edges and vertices, superfluous geometric details and spurious topological structures.
+(Right) This component approximates the input conservatively and produces valid meshes with different
+complexity and fidelity to the input, depending on the alpha parameter.
+The smaller the alpha, the deeper the shrink-wrapping process will enter cavities.
+The alpha parameter is decreasing from left to right, to respectively 1/50, 1/100 and 1/300 of the longest diagonal of the input bounding box.
+A large alpha will produce an output less complex but less faithful to the input.
+\cgalFigureCaptionEnd
+
+\subsection aw3_offset Offset
+
+The second parameter, the offset distance, controls the distance from the input and thus the definition
+of the offset isosurface onto which the vertices of the output mesh are located.
+This parameter controls the tightness of the result, which has, in turn, a few consequences.
+Firstly, locating vertices away from the input enables the algorithm to generate
+a less complex mesh, especially in convex areas. A trivial example of this behavior would be a very dense mesh
+of a sphere, for which an as-tight-as-possible envelope would also be very dense.
+Secondly, the farther the isosurface is from the input, the more new points are inserted
+through the first criterion (i.e., through intersection with dual Voronoi edge, see Section \ref aw3_algorithm);
+thus, the quality of the output improves in terms of angles of the triangle elements.
+Finally, and depending on the value of the alpha parameter, a large offset can also offer defeaturing capabilities.
+However using a small offset parameter will tend to better preserve sharp features as projection
+Steiner points tend to project onto convex sharp features.
+
+\cgalFigureAnchor{6}
+
+
+
+\cgalFigureCaptionBegin{6}
+Impact of the offset parameter on the output.
+(Left) Input mesh generated by meshing a NURBS CAD model in parameter space.
+(Right) The smaller the offset, the closest sample points are to the input.
+The offset parameter is decreasing from left to right, to respectively 1/50, 1/200 and 1/1000 of the longest diagonal of the input bounding box.
+The alpha parameter is equal to 1/50 of the longest diagonal of the input bounding box for all level of details.
+A larger offset will produce an output less complex with better triangle quality.
+However the sharp features (red edges) are well preserved when the offset parameter is small.
+\cgalFigureCaptionEnd
+
+\cgalFigureAnchor{7}
+
+
+
+\cgalFigureCaptionBegin{7}
+Steiner points.
+The projection Steiner points (green) are computed by projecting the triangle circumcenter onto the offset.
+The intersection Steiner points (blue) are computed as the first intersection point between the Voronoi edge and the offset.
+(Left) When the offset parameter is small, the algorithm produces more projection Steiner points,
+which tends to improve the preservation of convex sharp features.
+(Right) When the offset parameter is large, the algorithm produces more intersection Steiner points,
+which tends to generate triangles with better quality in terms of angles, in 3D.
+\cgalFigureCaptionEnd
+
+By default, we recommend to set the offset parameter to a small fraction of alpha, so that alpha
+becomes the main parameter that controls the final level of detail.
+
+The image below illustrates the impact of both parameters.
+
+\cgalFigureAnchor{8}
+
+
+
+\cgalFigureCaptionBegin{8}
+Different alpha and offset values on the bike model (533,000 triangles).
+The x-axis represents the offset value equal to 1/5000, 1/2000, 1/500, 1/200, 1/50, 1/20 and 1/5 of the longest diagonal of the input bounding box, from left to right.
+The y-axis represents the alpha value equal to 1/300, 1/100, 1/50, 1/20 and 1/5 of the longest diagonal of the input bounding box, from bottom to top.
+The numbers below each level of detail represents their number of triangles.
+Depending on the alpha value, an offset too small or too large will produce output mesh with higher complexity.
+For each alpha, the models with lower complexity can be used as a scale-space representations for collision detection, from near to far distances.
+\cgalFigureCaptionEnd
+
+\subsection aw3_two_side A Note on "Two-Sided" Wraps
+
+The offset parameter is crucial to our approach because it guarantees that the output is a closed,
+2-manifold surface mesh.
+Indeed, and even when the input is a zero-volume structure such as a single 3D triangle,
+the output wrap is a thin volume enclosing the said triangle \cgalFigureRef{2}.
+
+Users should keep in mind that the wrapping algorithm has no means of determining whether it is acting on the inside or the outside
+of the unsigned distance field, and will thus produce two-sided wraps in the case of holes in the input
+and values of alpha smaller than the size of the holes.
+
+\cgalFigureAnchor{9}
+
+
+
+\cgalFigureCaptionBegin{9}
+Two-sided wrap.
+(Left) Wrapping a Bunny in 2D, with decreasing values for alpha.
+(Right) Wrapping a defect-laden Bunny in 3D. The rightmost column depicts a clipped visualization
+of the inside. When alpha is small enough with respect the diamater of the holes, the algorithm generates a two-sided wrap.
+\cgalFigureCaptionEnd
+
+\section aw3_performance Performance
+
+The charts below plots the computation times of the wrapping algorithm on the Thingi10k dataset, as well as the complexity of the output triangle mesh.
+
+\cgalFigureAnchor{10}
+
+
+
+\cgalFigureCaptionBegin{9}
+Execution times and output complexity for different values of alpha on the Thingi10k data set.
+Alpha increases from 1/20 to 1/200 of the length of bounding box diagonal.
+The x axis represents the complexity of the output wrap mesh in number of triangle facets.
+The y axis represents the total computation time, in seconds.
+The color and diameter of the dots represent the number of faces in the input triangle soup,
+ranging from 10 (green) to 3154000 (blue).
+\cgalFigureCaptionEnd
+
+\section aw3_examples Examples
+
+Here is an example with an input triangle mesh, with alpha set to 1/20 of the bounding box longest diagonal edge length,
+and offset set to 1/30 of alpha (i.e., 1/600 of the bounding box diagonal edge length).
+
+\cgalExample{Alpha_wrap_3/triangle_mesh_wrap.cpp}
+
+Here is an example with a point cloud.
+
+\cgalExample{Alpha_wrap_3/point_set_wrap.cpp}
+
+\section aw3_history Design and Implementation History
+
+*/
+
+}
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/dependencies b/Alpha_wrap_3/doc/Alpha_wrap_3/dependencies
new file mode 100644
index 00000000000..e7ced8f0b29
--- /dev/null
+++ b/Alpha_wrap_3/doc/Alpha_wrap_3/dependencies
@@ -0,0 +1,11 @@
+Manual
+Kernel_23
+STL_Extension
+Algebraic_foundations
+Circulator
+Stream_support
+AABB_tree
+Alpha_shapes_3
+BGL
+Mesh_3
+Triangulation_3
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/examples.txt b/Alpha_wrap_3/doc/Alpha_wrap_3/examples.txt
new file mode 100644
index 00000000000..a04beb83d96
--- /dev/null
+++ b/Alpha_wrap_3/doc/Alpha_wrap_3/examples.txt
@@ -0,0 +1,5 @@
+/*!
+\example Alpha_wrap_3/triangle_mesh_wrap.cpp
+\example Alpha_wrap_3/point_set_wrap.cpp
+\example Alpha_wrap_3/alpha_wrap_3_example.cpp
+*/
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/alpha_wrap_3.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/alpha_wrap_3.jpg
new file mode 100644
index 00000000000..52ce10634b1
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/alpha_wrap_3.jpg differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_alpha_offset_bike.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_alpha_offset_bike.jpg
new file mode 100644
index 00000000000..7bb4b920d3c
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_alpha_offset_bike.jpg differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_bike_lod.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_bike_lod.jpg
new file mode 100644
index 00000000000..3bc5d5ae9cc
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_bike_lod.jpg differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_church_lod.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_church_lod.jpg
new file mode 100644
index 00000000000..05d1b5b4218
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_church_lod.jpg differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_circles.ipe b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_circles.ipe
new file mode 100644
index 00000000000..fcd7ad631d4
--- /dev/null
+++ b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_circles.ipe
@@ -0,0 +1,1713 @@
+
+
+
+
+
+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
+
+
+
+
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+
+
+
+
+0.6 0 0 0.6 0 0 e
+0.4 0 0 0.4 0 0 e
+
+
+
+
+0.6 0 0 0.6 0 0 e
+
+
+
+
+
+0.5 0 0 0.5 0 0 e
+
+
+0.6 0 0 0.6 0 0 e
+0.4 0 0 0.4 0 0 e
+
+
+
+
+
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+-0.4 -0.4 m
+0.4 -0.4 l
+0.4 0.4 l
+-0.4 0.4 l
+h
+
+
+
+
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+
+
+
+
+
+-0.5 -0.5 m
+0.5 -0.5 l
+0.5 0.5 l
+-0.5 0.5 l
+h
+
+
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+-0.4 -0.4 m
+0.4 -0.4 l
+0.4 0.4 l
+-0.4 0.4 l
+h
+
+
+
+
+
+
+-0.43 -0.57 m
+0.57 0.43 l
+0.43 0.57 l
+-0.57 -0.43 l
+h
+
+
+-0.43 0.57 m
+0.57 -0.43 l
+0.43 -0.57 l
+-0.57 0.43 l
+h
+
+
+
+
+
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+
+
+
+
+-1 0.333 m
+0 0 l
+-1 -0.333 l
+
+
+
+
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+-1 0 m
+-2 0.333 l
+-2 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+-1 0 m
+-2 0.333 l
+-2 -0.333 l
+h
+
+
+
+
+0.5 0 m
+-0.5 0.333 l
+-0.5 -0.333 l
+h
+
+
+
+
+0.5 0 m
+-0.5 0.333 l
+-0.5 -0.333 l
+h
+
+
+
+
+0.5 0 m
+-0.5 0.333 l
+-0.3 0 l
+-0.5 -0.333 l
+h
+
+
+
+
+0.5 0 m
+-0.5 0.333 l
+-0.3 0 l
+-0.5 -0.333 l
+h
+
+
+
+
+1 0 m
+0 0.333 l
+0 -0.333 l
+h
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+
+
+
+
+1 0 m
+0 0.333 l
+0 -0.333 l
+h
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+64 0 0 64 320 256 e
+
+
+106.667 0 0 106.667 320 341.333 e
+
+
+121.143 0 0 121.143 320 153.143 e
+
+
+106.667 0 0 106.667 320 170.667 e
+
+
+92.8 0 0 92.8 320 188.8 e
+
+
+80 0 0 80 320 208 e
+
+
+69.3333 0 0 69.3333 320 229.333 e
+
+
+92.8 0 0 92.8 320 323.2 e
+
+
+80 0 0 80 320 304 e
+
+
+69.3333 0 0 69.3333 320 282.667 e
+
+
+320 192 m
+560 192 l
+560 192 l
+
+
+320 192 m
+320 448 l
+
+
+320 256 m
+416 144
+512 288 c
+
+
+
+
+320 153.143 m
+320 341.333 l
+
+
+320 153.143 m
+223.848 125.671 l
+
+
+320 153.143 m
+416.152 125.671 l
+
+
+320 341.333 m
+225.132 372.956 l
+
+
+320 341.333 m
+414.868 372.956 l
+
+
+320 32 m
+384 256 l
+
+
+320 32 m
+256 256 l
+
+
+384 256 m
+256 256 l
+
+
+384 256 m
+320 448 l
+
+
+256 256 m
+320 448 l
+
+Radius
+
+
+
+
+
+
+e
+e
+
+
+
+
+
+
+
+
+
+
+
+
+157.433 321.559 m
+25.8217 444.156 l
+
+
+157.433 321.559 m
+169.822 140.156 l
+
+
+157.433 321.559 m
+553.822 204.156 l
+
+
+157.433 321.559 m
+553.822 636.156 l
+
+
+157.433 321.559 m
+153.822 732.156 l
+
+
+25.8217 444.156 m
+169.822 140.156 l
+
+
+25.8217 444.156 m
+153.822 732.156 l
+
+
+169.822 140.156 m
+553.822 204.156 l
+
+
+553.822 204.156 m
+553.822 636.156 l
+
+
+553.822 636.156 m
+153.822 732.156 l
+
+
+153.822 732.156 m
+553.822 636.156 l
+157.433 321.559 l
+157.433 321.559 l
+h
+
+
+153.822 732.156 m
+157.433 321.559 l
+25.8217 444.156 l
+25.8217 444.156 l
+h
+
+
+141.206 620.482 m
+141.206 620.482 l
+h
+
+
+553.822 636.156 m
+553.822 204.156 l
+157.433 321.559 l
+h
+
+
+169.822 140.156 m
+553.822 204.156 l
+157.433 321.559 l
+h
+
+
+-64.4738 215.279 m
+-154.848 172.471 l
+
+
+-64.4738 215.279 m
+226.345 527.479 l
+
+
+-64.4738 215.279 m
+349.918 243.58 l
+
+
+226.345 527.479 m
+134.964 568.093 l
+
+
+226.345 527.479 m
+316.409 528.272 l
+
+
+316.409 528.272 m
+339.747 625.51 l
+
+
+316.409 528.272 m
+402.216 420.156 l
+
+
+402.216 420.156 m
+502.216 420.156 l
+
+
+402.216 420.156 m
+349.918 243.58 l
+
+
+349.918 243.58 m
+366.358 144.941 l
+
+
+
+
+342.749 257.603 m
+349.918 243.58 l
+
+
+
+
+
+
+
+
+
+
+
+
+
+157.433 321.559 m
+25.8217 444.156 l
+
+
+157.433 321.559 m
+169.822 140.156 l
+
+
+157.433 321.559 m
+153.822 732.156 l
+
+
+25.8217 444.156 m
+169.822 140.156 l
+
+
+25.8217 444.156 m
+153.822 732.156 l
+
+
+169.822 140.156 m
+553.822 204.156 l
+
+
+553.822 204.156 m
+553.822 636.156 l
+
+
+553.822 636.156 m
+153.822 732.156 l
+
+
+153.822 732.156 m
+157.433 321.559 l
+25.8217 444.156 l
+25.8217 444.156 l
+h
+
+
+141.206 620.482 m
+141.206 620.482 l
+h
+
+
+
+355.45 296.013 m
+166.206 769.735 l
+169.817 359.138 l
+h
+
+
+566.205 673.735 m
+355.45 296.013 l
+166.205 769.735 l
+h
+
+
+355.45 296.013 m
+566.206 241.735 l
+566.206 673.735 l
+h
+
+
+169.817 359.138 m
+355.45 296.013 l
+182.206 177.735 l
+h
+
+
+355.45 296.013 m
+169.817 359.138 l
+
+
+566.206 673.735 m
+355.45 296.013 l
+
+
+355.45 296.013 m
+166.206 769.735 l
+
+
+355.45 296.013 m
+566.205 241.735 l
+
+
+355.45 296.013 m
+182.206 177.735 l
+
+
+566.206 241.735 m
+182.205 177.735 l
+
+
+
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_double_sided.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_double_sided.jpg
new file mode 100644
index 00000000000..c95a8db4048
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_double_sided.jpg differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_non_manifold_cases.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_non_manifold_cases.jpg
new file mode 100644
index 00000000000..a3458eeae77
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_non_manifold_cases.jpg differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_pencil.ipe b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_pencil.ipe
new file mode 100644
index 00000000000..fcd7ad631d4
--- /dev/null
+++ b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_pencil.ipe
@@ -0,0 +1,1713 @@
+
+
+
+
+
+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
+
+
+
+
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+
+
+
+
+0.6 0 0 0.6 0 0 e
+0.4 0 0 0.4 0 0 e
+
+
+
+
+0.6 0 0 0.6 0 0 e
+
+
+
+
+
+0.5 0 0 0.5 0 0 e
+
+
+0.6 0 0 0.6 0 0 e
+0.4 0 0 0.4 0 0 e
+
+
+
+
+
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+-0.4 -0.4 m
+0.4 -0.4 l
+0.4 0.4 l
+-0.4 0.4 l
+h
+
+
+
+
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+
+
+
+
+
+-0.5 -0.5 m
+0.5 -0.5 l
+0.5 0.5 l
+-0.5 0.5 l
+h
+
+
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+-0.4 -0.4 m
+0.4 -0.4 l
+0.4 0.4 l
+-0.4 0.4 l
+h
+
+
+
+
+
+
+-0.43 -0.57 m
+0.57 0.43 l
+0.43 0.57 l
+-0.57 -0.43 l
+h
+
+
+-0.43 0.57 m
+0.57 -0.43 l
+0.43 -0.57 l
+-0.57 0.43 l
+h
+
+
+
+
+
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+
+
+
+
+-1 0.333 m
+0 0 l
+-1 -0.333 l
+
+
+
+
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+-1 0 m
+-2 0.333 l
+-2 -0.333 l
+h
+
+
+
+
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+-1 0 m
+-2 0.333 l
+-2 -0.333 l
+h
+
+
+
+
+0.5 0 m
+-0.5 0.333 l
+-0.5 -0.333 l
+h
+
+
+
+
+0.5 0 m
+-0.5 0.333 l
+-0.5 -0.333 l
+h
+
+
+
+
+0.5 0 m
+-0.5 0.333 l
+-0.3 0 l
+-0.5 -0.333 l
+h
+
+
+
+
+0.5 0 m
+-0.5 0.333 l
+-0.3 0 l
+-0.5 -0.333 l
+h
+
+
+
+
+1 0 m
+0 0.333 l
+0 -0.333 l
+h
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+
+
+
+
+1 0 m
+0 0.333 l
+0 -0.333 l
+h
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+64 0 0 64 320 256 e
+
+
+106.667 0 0 106.667 320 341.333 e
+
+
+121.143 0 0 121.143 320 153.143 e
+
+
+106.667 0 0 106.667 320 170.667 e
+
+
+92.8 0 0 92.8 320 188.8 e
+
+
+80 0 0 80 320 208 e
+
+
+69.3333 0 0 69.3333 320 229.333 e
+
+
+92.8 0 0 92.8 320 323.2 e
+
+
+80 0 0 80 320 304 e
+
+
+69.3333 0 0 69.3333 320 282.667 e
+
+
+320 192 m
+560 192 l
+560 192 l
+
+
+320 192 m
+320 448 l
+
+
+320 256 m
+416 144
+512 288 c
+
+
+
+
+320 153.143 m
+320 341.333 l
+
+
+320 153.143 m
+223.848 125.671 l
+
+
+320 153.143 m
+416.152 125.671 l
+
+
+320 341.333 m
+225.132 372.956 l
+
+
+320 341.333 m
+414.868 372.956 l
+
+
+320 32 m
+384 256 l
+
+
+320 32 m
+256 256 l
+
+
+384 256 m
+256 256 l
+
+
+384 256 m
+320 448 l
+
+
+256 256 m
+320 448 l
+
+Radius
+
+
+
+
+
+
+e
+e
+
+
+
+
+
+
+
+
+
+
+
+
+157.433 321.559 m
+25.8217 444.156 l
+
+
+157.433 321.559 m
+169.822 140.156 l
+
+
+157.433 321.559 m
+553.822 204.156 l
+
+
+157.433 321.559 m
+553.822 636.156 l
+
+
+157.433 321.559 m
+153.822 732.156 l
+
+
+25.8217 444.156 m
+169.822 140.156 l
+
+
+25.8217 444.156 m
+153.822 732.156 l
+
+
+169.822 140.156 m
+553.822 204.156 l
+
+
+553.822 204.156 m
+553.822 636.156 l
+
+
+553.822 636.156 m
+153.822 732.156 l
+
+
+153.822 732.156 m
+553.822 636.156 l
+157.433 321.559 l
+157.433 321.559 l
+h
+
+
+153.822 732.156 m
+157.433 321.559 l
+25.8217 444.156 l
+25.8217 444.156 l
+h
+
+
+141.206 620.482 m
+141.206 620.482 l
+h
+
+
+553.822 636.156 m
+553.822 204.156 l
+157.433 321.559 l
+h
+
+
+169.822 140.156 m
+553.822 204.156 l
+157.433 321.559 l
+h
+
+
+-64.4738 215.279 m
+-154.848 172.471 l
+
+
+-64.4738 215.279 m
+226.345 527.479 l
+
+
+-64.4738 215.279 m
+349.918 243.58 l
+
+
+226.345 527.479 m
+134.964 568.093 l
+
+
+226.345 527.479 m
+316.409 528.272 l
+
+
+316.409 528.272 m
+339.747 625.51 l
+
+
+316.409 528.272 m
+402.216 420.156 l
+
+
+402.216 420.156 m
+502.216 420.156 l
+
+
+402.216 420.156 m
+349.918 243.58 l
+
+
+349.918 243.58 m
+366.358 144.941 l
+
+
+
+
+342.749 257.603 m
+349.918 243.58 l
+
+
+
+
+
+
+
+
+
+
+
+
+
+157.433 321.559 m
+25.8217 444.156 l
+
+
+157.433 321.559 m
+169.822 140.156 l
+
+
+157.433 321.559 m
+153.822 732.156 l
+
+
+25.8217 444.156 m
+169.822 140.156 l
+
+
+25.8217 444.156 m
+153.822 732.156 l
+
+
+169.822 140.156 m
+553.822 204.156 l
+
+
+553.822 204.156 m
+553.822 636.156 l
+
+
+553.822 636.156 m
+153.822 732.156 l
+
+
+153.822 732.156 m
+157.433 321.559 l
+25.8217 444.156 l
+25.8217 444.156 l
+h
+
+
+141.206 620.482 m
+141.206 620.482 l
+h
+
+
+
+355.45 296.013 m
+166.206 769.735 l
+169.817 359.138 l
+h
+
+
+566.205 673.735 m
+355.45 296.013 l
+166.205 769.735 l
+h
+
+
+355.45 296.013 m
+566.206 241.735 l
+566.206 673.735 l
+h
+
+
+169.817 359.138 m
+355.45 296.013 l
+182.206 177.735 l
+h
+
+
+355.45 296.013 m
+169.817 359.138 l
+
+
+566.206 673.735 m
+355.45 296.013 l
+
+
+355.45 296.013 m
+166.206 769.735 l
+
+
+355.45 296.013 m
+566.205 241.735 l
+
+
+355.45 296.013 m
+182.206 177.735 l
+
+
+566.206 241.735 m
+182.205 177.735 l
+
+
+
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_pencil.png b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_pencil.png
new file mode 100644
index 00000000000..528596cd942
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_pencil.png differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_sharp_feature.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_sharp_feature.jpg
new file mode 100644
index 00000000000..7b28e361c00
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_sharp_feature.jpg differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_steiner.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_steiner.jpg
new file mode 100644
index 00000000000..66a6d060191
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_steiner.jpg differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_steps.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_steps.jpg
new file mode 100644
index 00000000000..c40857c6f57
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_steps.jpg differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_thingi10k_benchmark.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_thingi10k_benchmark.jpg
new file mode 100644
index 00000000000..cd226a09c19
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_thingi10k_benchmark.jpg differ
diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_triangle_soup.jpg b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_triangle_soup.jpg
new file mode 100644
index 00000000000..cacc2f7aa70
Binary files /dev/null and b/Alpha_wrap_3/doc/Alpha_wrap_3/fig/aw3_triangle_soup.jpg differ
diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt b/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt
new file mode 100644
index 00000000000..6de24ca7497
--- /dev/null
+++ b/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Created by the script cgal_create_cmake_script
+# This is the CMake script for compiling a CGAL application.
+
+cmake_minimum_required(VERSION 3.1...3.22)
+project(Alpha_wrap_3_Examples)
+
+find_package(CGAL REQUIRED)
+
+# create a target per cppfile
+create_single_source_cgal_program("triangle_mesh_wrap.cpp")
+create_single_source_cgal_program("point_set_wrap.cpp")
+create_single_source_cgal_program("wrap_from_cavity.cpp")
+create_single_source_cgal_program("mixed_inputs_wrap.cpp")
diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp
new file mode 100644
index 00000000000..1ff887f02e4
--- /dev/null
+++ b/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp
@@ -0,0 +1,130 @@
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+namespace AW3 = CGAL::Alpha_wraps_3;
+namespace PMP = CGAL::Polygon_mesh_processing;
+
+using K = CGAL::Exact_predicates_inexact_constructions_kernel;
+using Point_3 = K::Point_3;
+using Segment_3 = K::Segment_3;
+
+using Face = std::array;
+using Segments = std::vector;
+using Points = std::vector;
+using Faces = std::vector;
+
+using Mesh = CGAL::Surface_mesh;
+
+int main(int argc, char** argv)
+{
+ std::cout.precision(17);
+
+ // Read the inputs
+ const std::string ts_filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/armadillo.off"); // triangle soup
+ const std::string ss_filename = (argc > 2) ? argv[2] : CGAL::data_file_path("images/420.polylines.txt"); // segment soup
+ const std::string ps_filename = (argc > 3) ? argv[3] : CGAL::data_file_path("points_3/ball.ply"); // point set
+
+ std::cout << "Triangle soup input: " << ts_filename << std::endl;
+ std::cout << "Segment soup input: " << ss_filename << std::endl;
+ std::cout << "Point set input: " << ps_filename << std::endl;
+
+ // = read the soup
+ Points points;
+ Faces faces;
+ if(!CGAL::IO::read_polygon_soup(ts_filename, points, faces) || points.empty() || faces.empty())
+ {
+ std::cerr << "Invalid soup input: " << ts_filename << std::endl;
+ return EXIT_FAILURE;
+ }
+ std::cout << points.size() << " points (triangle soup)" << std::endl;
+
+ // = read the polylines
+ std::ifstream ifs(ss_filename);
+ Segments segments;
+ int len = 0;
+ while(ifs >> len)
+ {
+ std::vector polyline;
+ while(len--)
+ {
+ Point_3 point;
+ ifs >> point;
+ polyline.push_back(point);
+ }
+
+ if(polyline.size() >= 2)
+ {
+ for(std::size_t i=0; i 4) ? std::stod(argv[4]) : 15.;
+ const double relative_offset = (argc > 5) ? std::stod(argv[5]) : 450.;
+
+ CGAL::Bbox_3 bbox = bbox_3(std::cbegin(points), std::cend(points));
+ CGAL::Bbox_3 ps_bbox = bbox_3(std::cbegin(ps_points), std::cend(ps_points));
+ bbox += ps_bbox;
+
+ const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) +
+ CGAL::square(bbox.ymax() - bbox.ymin()) +
+ CGAL::square(bbox.zmax() - bbox.zmin()));
+ const double alpha = diag_length / relative_alpha;
+ const double offset = diag_length / relative_offset;
+
+ CGAL::Real_timer t;
+ t.start();
+
+ using TS_Oracle = CGAL::Alpha_wraps_3::internal::Triangle_soup_oracle;
+ using SS_Oracle = CGAL::Alpha_wraps_3::internal::Segment_soup_oracle;
+ using Oracle = CGAL::Alpha_wraps_3::internal::Point_set_oracle;
+
+ TS_Oracle ts_oracle(K{});
+ SS_Oracle ss_oracle(ts_oracle);
+ Oracle oracle(ss_oracle);
+
+ oracle.add_triangle_soup(points, faces, CGAL::parameters::default_values());
+ oracle.add_segment_soup(segments, CGAL::parameters::default_values());
+ oracle.add_point_set(ps_points, CGAL::parameters::default_values());
+
+ CGAL::Alpha_wraps_3::internal::Alpha_wrap_3 aw3(oracle);
+
+ Mesh output_mesh;
+ aw3(alpha, offset, output_mesh);
+
+ t.stop();
+ std::cout << "Took " << t.time() << std::endl;
+
+ std::string ts_name = std::string(ts_filename);
+ ts_name = ts_name.substr(ts_name.find_last_of("/") + 1, ts_name.length() - 1);
+ ts_name = ts_name.substr(0, ts_name.find_last_of("."));
+ std::string ss_name = std::string(ss_filename);
+ ss_name = ss_name.substr(ss_name.find_last_of("/") + 1, ss_name.length() - 1);
+ ss_name = ss_name.substr(0, ss_name.find_last_of("."));
+ std::string ps_name = std::string(ps_filename);
+ ps_name = ps_name.substr(ps_name.find_last_of("/") + 1, ps_name.length() - 1);
+ ps_name = ps_name.substr(0, ps_name.find_last_of("."));
+ std::string output_name = ts_name + "_" + ss_name + "_" + ps_name + "_" + std::to_string(static_cast(relative_alpha))
+ + "_" + std::to_string(static_cast(relative_offset)) + ".off";
+ CGAL::IO::write_polygon_mesh(output_name, output_mesh, CGAL::parameters::stream_precision(17));
+
+ return EXIT_SUCCESS;
+}
diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp
new file mode 100644
index 00000000000..8520713f0d2
--- /dev/null
+++ b/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp
@@ -0,0 +1,65 @@
+#include
+#include
+
+#include
+#include
+#include
+
+#include
+#include
+
+namespace AW3 = CGAL::Alpha_wraps_3;
+
+using K = CGAL::Exact_predicates_inexact_constructions_kernel;
+using Point_3 = K::Point_3;
+
+using Point_container = std::vector;
+using Mesh = CGAL::Surface_mesh;
+
+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("points_3/oni.pwn");
+ std::cout << "Reading " << filename << "..." << std::endl;
+
+ Point_container points;
+ if(!CGAL::IO::read_points(filename, std::back_inserter(points)) || points.empty())
+ {
+ std::cerr << "Invalid input." << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ // Compute the alpha and offset values
+ const double relative_alpha = (argc > 2) ? std::stod(argv[2]) : 10.;
+ const double relative_offset = (argc > 3) ? std::stod(argv[3]) : 300.;
+
+ CGAL::Bbox_3 bbox = CGAL::bbox_3(std::cbegin(points), std::cend(points));
+ const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) +
+ CGAL::square(bbox.ymax() - bbox.ymin()) +
+ CGAL::square(bbox.zmax() - bbox.zmin()));
+ const double alpha = diag_length / relative_alpha;
+ const double offset = diag_length / relative_offset;
+
+ // Construct the wrap
+ CGAL::Real_timer t;
+ t.start();
+
+ Mesh wrap;
+ CGAL::alpha_wrap_3(points, alpha, offset, wrap);
+
+ t.stop();
+ std::cout << "Result: " << num_vertices(wrap) << " vertices, " << num_faces(wrap) << " faces" << std::endl;
+ std::cout << "Took " << t.time() << " s." << std::endl;
+
+ // Save the result
+ std::string input_name = std::string(filename);
+ input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1);
+ input_name = input_name.substr(0, input_name.find_last_of("."));
+ std::string output_name = input_name + "_" + std::to_string(static_cast(relative_alpha))
+ + "_" + std::to_string(static_cast(relative_offset)) + ".off";
+ CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17));
+
+ return EXIT_SUCCESS;
+}
diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp
new file mode 100644
index 00000000000..2f3655eb660
--- /dev/null
+++ b/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp
@@ -0,0 +1,70 @@
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+namespace AW3 = CGAL::Alpha_wraps_3;
+namespace PMP = CGAL::Polygon_mesh_processing;
+
+using K = CGAL::Exact_predicates_inexact_constructions_kernel;
+using Point_3 = K::Point_3;
+
+using Mesh = CGAL::Surface_mesh;
+
+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/armadillo.off");
+ std::cout << "Reading " << filename << "..." << std::endl;
+
+ Mesh mesh;
+ if(!PMP::IO::read_polygon_mesh(filename, mesh) || is_empty(mesh) || !is_triangle_mesh(mesh))
+ {
+ std::cerr << "Invalid input." << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ std::cout << "Input: " << num_vertices(mesh) << " vertices, " << num_faces(mesh) << " faces" << std::endl;
+
+ // Compute the alpha and offset values
+ const double relative_alpha = (argc > 2) ? std::stod(argv[2]) : 20.;
+ const double relative_offset = (argc > 3) ? std::stod(argv[3]) : 600.;
+
+ CGAL::Bbox_3 bbox = CGAL::Polygon_mesh_processing::bbox(mesh);
+ const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) +
+ CGAL::square(bbox.ymax() - bbox.ymin()) +
+ CGAL::square(bbox.zmax() - bbox.zmin()));
+
+ const double alpha = diag_length / relative_alpha;
+ const double offset = diag_length / relative_offset;
+
+ // Construct the wrap
+ CGAL::Real_timer t;
+ t.start();
+
+ Mesh wrap;
+ CGAL::alpha_wrap_3(mesh, alpha, offset, wrap);
+
+ t.stop();
+ std::cout << "Result: " << num_vertices(wrap) << " vertices, " << num_faces(wrap) << " faces" << std::endl;
+ std::cout << "Took " << t.time() << " s." << std::endl;
+
+ // Save the result
+ std::string input_name = std::string(filename);
+ input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1);
+ input_name = input_name.substr(0, input_name.find_last_of("."));
+ std::string output_name = input_name
+ + "_" + std::to_string(static_cast(relative_alpha))
+ + "_" + std::to_string(static_cast(relative_offset)) + ".off";
+ CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17));
+
+ return EXIT_SUCCESS;
+}
diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp
new file mode 100644
index 00000000000..0cc59a21d81
--- /dev/null
+++ b/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp
@@ -0,0 +1,84 @@
+#include
+#include
+
+#include
+#include
+#include
+
+#include
+#include
+
+namespace AW3 = CGAL::Alpha_wraps_3;
+namespace PMP = CGAL::Polygon_mesh_processing;
+
+using K = CGAL::Exact_predicates_inexact_constructions_kernel;
+using Point_3 = K::Point_3;
+
+using Mesh = CGAL::Surface_mesh;
+
+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/armadillo.off");
+ std::cout << "Reading " << filename << "..." << std::endl;
+
+ Mesh input;
+ if(!PMP::IO::read_polygon_mesh(filename, input) ||
+ is_empty(input) || !is_triangle_mesh(input))
+ {
+ std::cerr << "Invalid input." << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ std::cout << "Input: " << num_vertices(input) << " vertices, " << num_faces(input) << " faces" << std::endl;
+
+ const double relative_alpha = (argc > 2) ? std::stod(argv[2]) : 30.;
+ const double relative_offset = (argc > 3) ? std::stod(argv[3]) : 600.;
+
+ // Compute the alpha and offset values
+ CGAL::Bbox_3 bbox = CGAL::Polygon_mesh_processing::bbox(input);
+ const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) +
+ CGAL::square(bbox.ymax() - bbox.ymin()) +
+ CGAL::square(bbox.zmax() - bbox.zmin()));
+
+ const double alpha = diag_length / relative_alpha;
+ const double offset = diag_length / relative_offset;
+
+ // Construct the wrap
+ using Oracle = CGAL::Alpha_wraps_3::internal::Triangle_mesh_oracle;
+ Oracle oracle;
+ oracle.add_triangle_mesh(input);
+
+ CGAL::Real_timer t;
+ t.start();
+
+ Mesh wrap;
+ CGAL::Alpha_wraps_3::internal::Alpha_wrap_3 aw3(oracle);
+
+ // There is no limit on how many seeds can be used.
+ // However, the algorithm automatically determines whether a seed can be used
+ // to initialize the refinement based on a few conditions (distance to the offset, value of alpha, etc.)
+ // See internal function Alpha_wrap_3::initialize_from_cavities() for more information
+ std::vector seeds =
+ {
+ Point_3(0, 50, 0) // a point within the armadillo surface
+ };
+
+ aw3(alpha, offset, wrap, CGAL::parameters::seed_points(std::ref(seeds)));
+
+ t.stop();
+ std::cout << "Result: " << num_vertices(wrap) << " vertices, " << num_faces(wrap) << " faces" << std::endl;
+ std::cout << "Took " << t.time() << " s." << std::endl;
+
+ // Save the result
+ std::string input_name = std::string(filename);
+ input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1);
+ input_name = input_name.substr(0, input_name.find_last_of("."));
+ std::string output_name = input_name + "_cavity_" + std::to_string(static_cast(relative_alpha))
+ + "_" + std::to_string(static_cast(relative_offset)) + ".off";
+ CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17));
+
+ return EXIT_SUCCESS;
+}
diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h
new file mode 100644
index 00000000000..b0d85385a9c
--- /dev/null
+++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h
@@ -0,0 +1,1521 @@
+// Copyright (c) 2019-2022 Copyright holders.
+// All rights reserved.
+//
+// This file is part of the 3D Alpha Wrapping package, which is being prepared for
+// submission to CGAL (www.cgal.org).
+//
+// $URL$
+// $Id$
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// Author(s) : TBA
+//
+#ifndef CGAL_ALPHA_WRAP_3_INTERNAL_ALPHA_WRAP_3_H
+#define CGAL_ALPHA_WRAP_3_INTERNAL_ALPHA_WRAP_3_H
+
+#ifdef CGAL_AW3_DEBUG_PP
+ #ifndef CGAL_AW3_DEBUG
+ #define CGAL_AW3_DEBUG
+ #endif
+#endif
+
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include // only if non-manifoldness is not treated
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace CGAL {
+namespace Alpha_wraps_3 {
+namespace internal {
+
+template
+class Cell_base_with_timestamp
+ : public Cb
+{
+ std::size_t time_stamp_;
+
+public:
+ template
+ Cell_base_with_timestamp(const Args&... args) : Cb(args...), time_stamp_(-1) { }
+
+ Cell_base_with_timestamp(const Cell_base_with_timestamp& other) : Cb(other), time_stamp_(other.time_stamp_) { }
+
+ typedef CGAL::Tag_true Has_timestamp;
+
+ std::size_t time_stamp() const { return time_stamp_; }
+ void set_time_stamp(const std::size_t& ts) { time_stamp_ = ts; }
+
+ template
+ struct Rebind_TDS
+ {
+ typedef typename Cb::template Rebind_TDS::Other Cb2;
+ typedef Cell_base_with_timestamp Other;
+ };
+};
+
+template // @todo better name
+class Alpha_wrap_3
+{
+ using Base_GT = typename Oracle::Geom_traits;
+ using Geom_traits = Robust_circumcenter_filtered_traits_3;
+
+ using FT = typename Geom_traits::FT;
+ using Point_3 = typename Geom_traits::Point_3;
+ using Vector_3 = typename Geom_traits::Vector_3;
+ using Ball_3 = typename Geom_traits::Ball_3;
+ using Iso_cuboid_3 = typename Geom_traits::Iso_cuboid_3;
+
+ using SC = Simple_cartesian;
+ using SC_Point_3 = SC::Point_3;
+ using SC_Vector_3 = SC::Vector_3;
+ using SC_Iso_cuboid_3 = SC::Iso_cuboid_3;
+ using SC2GT = Cartesian_converter;
+
+ struct Cell_info
+ {
+ bool is_outside = false;
+ };
+
+ enum Vertex_info
+ {
+ DEFAULT = 0,
+ BBOX_VERTEX,
+ SEED_VERTEX
+ };
+
+ using Vb = Triangulation_vertex_base_3;
+ using Vbi = Triangulation_vertex_base_with_info_3;
+ using Cbb = Delaunay_triangulation_cell_base_3;
+ using Cb = Delaunay_triangulation_cell_base_with_circumcenter_3;
+ using Cbi = Triangulation_cell_base_with_info_3;
+ using Cbt = Cell_base_with_timestamp;
+ using Tds = Triangulation_data_structure_3;
+ using Dt = Delaunay_triangulation_3;
+
+ using Cell_handle = typename Dt::Cell_handle;
+ using Facet = typename Dt::Facet;
+ using Vertex_handle = typename Dt::Vertex_handle;
+ using Locate_type = typename Dt::Locate_type;
+
+ using Gate = internal::Gate;
+ using Alpha_PQ = Modifiable_priority_queue, CGAL_BOOST_PAIRING_HEAP>;
+
+protected:
+ const Oracle& m_oracle;
+ SC_Iso_cuboid_3 m_bbox;
+
+ FT m_alpha, m_sq_alpha;
+ FT m_offset, m_sq_offset;
+
+ Dt m_dt;
+ Alpha_PQ m_queue;
+
+public:
+ // Main constructor
+ Alpha_wrap_3(const Oracle& oracle)
+ :
+ m_oracle(oracle),
+ m_dt(Geom_traits(oracle.geom_traits())),
+ // used to set up the initial MPQ, use some arbitrary not-too-small value
+ m_queue(4096)
+ {
+ // Due to the Steiner point computation being a dichotomy, the algorithm is inherently inexact
+ // and passing exact kernels is explicitely disabled to ensure no misunderstanding.
+ CGAL_static_assertion((std::is_floating_point::value));
+ }
+
+public:
+ const Geom_traits& geom_traits() const { return m_dt.geom_traits(); }
+
+ double default_alpha() const
+ {
+ const Bbox_3 bbox = m_oracle.bbox();
+ const double diag_length = std::sqrt(square(bbox.xmax() - bbox.xmin()) +
+ square(bbox.ymax() - bbox.ymin()) +
+ square(bbox.zmax() - bbox.zmin()));
+
+ return diag_length / 20.;
+ }
+
+private:
+ const Point_3& circumcenter(const Cell_handle c) const
+ {
+ // We only cross an infinite facet once, so this isn't going to be recomputed many times
+ if(m_dt.is_infinite(c))
+ {
+ const int inf_index = c->index(m_dt.infinite_vertex());
+ c->set_circumcenter(
+ geom_traits().construct_circumcenter_3_object()(m_dt.point(c, (inf_index+1)&3),
+ m_dt.point(c, (inf_index+2)&3),
+ m_dt.point(c, (inf_index+3)&3)));
+ }
+
+ return c->circumcenter(geom_traits());
+ }
+
+public:
+ template
+ void operator()(const double alpha, // = default_alpha()
+ const double offset, // = alpha / 30.
+ OutputMesh& output_mesh,
+ const NamedParameters& np)
+ {
+ namespace PMP = Polygon_mesh_processing;
+
+ using parameters::get_parameter;
+ using parameters::get_parameter_reference;
+ using parameters::choose_parameter;
+
+ using OVPM = typename CGAL::GetVertexPointMap::type;
+ OVPM ovpm = choose_parameter(get_parameter(np, internal_np::vertex_point),
+ get_property_map(vertex_point, output_mesh));
+
+ std::vector no_seeds;
+ using Seeds = typename internal_np::Lookup_named_param_def<
+ internal_np::seed_points_t, NamedParameters, std::vector >::reference;
+ Seeds seeds = choose_parameter(get_parameter_reference(np, internal_np::seed_points), no_seeds);
+
+ const bool do_enforce_manifoldness = choose_parameter(get_parameter(np, internal_np::do_enforce_manifoldness), true);
+
+#ifdef CGAL_AW3_TIMER
+ CGAL::Real_timer t;
+ t.start();
+#endif
+
+ initialize(alpha, offset, seeds);
+
+#ifdef CGAL_AW3_DEBUG_DUMP_EVERY_STEP
+ extract_surface(output_mesh, ovpm, true /*tolerate non manifoldness*/);
+ CGAL::IO::write_polygon_mesh("initial_cavities.off", output_mesh,
+ CGAL::parameters::vertex_point_map(ovpm).stream_precision(17));
+#endif
+
+ alpha_flood_fill();
+
+#ifdef CGAL_AW3_TIMER
+ t.stop();
+ std::cout << "Flood filling took: " << t.time() << " s." << std::endl;
+#endif
+
+ if(do_enforce_manifoldness)
+ {
+#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS
+ std::cout << "> Make manifold..." << std::endl;
+
+ extract_surface(output_mesh, ovpm, true /*tolerate non manifoldness*/);
+
+#ifdef CGAL_AW3_DEBUG_DUMP_EVERY_STEP
+ dump_triangulation_faces("intermediate_dt3.off", false /*only_boundary_faces*/);
+ IO::write_polygon_mesh("intermediate.off", output_mesh,
+ CGAL::parameters::vertex_point_map(ovpm).stream_precision(17));
+#endif
+
+ FT base_vol = 0;
+ if(is_closed(output_mesh)) // might not be due to manifoldness
+ base_vol = PMP::volume(output_mesh, CGAL::parameters::vertex_point_map(ovpm));
+ else
+ std::cerr << "Warning: couldn't compute volume before manifoldness fixes (mesh is not closed)" << std::endl;
+#endif
+
+#ifdef CGAL_AW3_TIMER
+ t.reset();
+ t.start();
+#endif
+
+ make_manifold();
+
+#ifdef CGAL_AW3_TIMER
+ t.stop();
+ std::cout << "\nManifoldness post-processing took: " << t.time() << " s." << std::endl;
+#endif
+
+#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS
+ if(!is_zero(base_vol))
+ {
+ extract_surface(output_mesh, ovpm, false /*do not tolerate non-manifoldness*/);
+
+ const FT manifold_vol = PMP::volume(output_mesh, CGAL::parameters::vertex_point_map(ovpm));
+ const FT ratio = manifold_vol / base_vol;
+
+ std::cout << "Volumes post-manifoldness fix:\n"
+ << "before: " << base_vol << "\n"
+ << "after: " << manifold_vol << "\n"
+ << "ratio: " << ratio << std::endl;
+ if(ratio > 1.1) // more than 10% extra volume
+ std::cerr << "Warning: large increase of volume after manifoldness resolution" << std::endl;
+ }
+#endif
+ } // do_enforce_manifoldness
+
+#ifdef CGAL_AW3_TIMER
+ t.reset();
+ t.start();
+#endif
+
+ extract_surface(output_mesh, ovpm, !do_enforce_manifoldness);
+
+#ifdef CGAL_AW3_TIMER
+ t.stop();
+ std::cout << "Surface extraction took: " << t.time() << " s." << std::endl;
+#endif
+
+#ifdef CGAL_AW3_DEBUG
+ std::cout << "Alpha wrap vertices: " << num_vertices(output_mesh) << std::endl;
+ std::cout << "Alpha wrap faces: " << num_faces(output_mesh) << std::endl;
+
+ #ifdef CGAL_AW3_DEBUG_DUMP_EVERY_STEP
+ IO::write_polygon_mesh("final.off", alpha_wrap, CGAL::parameters::stream_precision(17));
+ dump_triangulation_faces("final_dt3.off", false /*only_boundary_faces*/);
+ #endif
+#endif
+ }
+
+ // Convenience overloads
+ template
+ void operator()(const double alpha,
+ const double offset,
+ OutputMesh& output_mesh)
+ {
+ return operator()(alpha, offset, output_mesh, parameters::default_values());
+ }
+
+ template
+ void operator()(const double alpha,
+ OutputMesh& output_mesh)
+ {
+ return operator()(alpha, alpha / 30. /*offset*/, output_mesh);
+ }
+
+ template
+ void operator()(OutputMesh& output_mesh)
+ {
+ return operator()(default_alpha(), output_mesh);
+ }
+
+private:
+ // Adjust the bbox & insert its corners to construct the starting triangulation
+ void insert_bbox_corners()
+ {
+ m_bbox = m_oracle.bbox();
+
+ // compute input mesh bbox
+ const SC_Point_3 bbox_centroid = CGAL::midpoint(m_bbox.min(), m_bbox.max());
+ const double bbox_diag_length = std::sqrt(CGAL::squared_distance(m_bbox.min(), m_bbox.max()));
+
+ // use isotropic bbox
+ // @todo keep an aabb? Probaly as good as any other choice (useful for multiscale approach??)
+ const double xs = m_bbox.xmax() - m_bbox.xmin();
+ const double ys = m_bbox.ymax() - m_bbox.ymin();
+ const double zs = m_bbox.zmax() - m_bbox.zmin();
+ const double max_len = (std::max)((std::max)(xs, ys), zs);
+ m_bbox = SC_Iso_cuboid_3(m_bbox.min(), m_bbox.min() + max_len * SC_Vector_3(1, 1, 1));
+
+ // scale bbox proportional to offset value
+ // The "1.2" hard-coded value is because we take the offset into account.
+ // This ensures that Steiner vertices are also inside this box
+ double scaling = 1.2 + (8. * (CGAL::to_double(m_offset) / bbox_diag_length));
+ CGAL::Aff_transformation_3 scale(SCALING, scaling);
+ m_bbox = SC_Iso_cuboid_3(scale.transform(m_bbox.min()), scale.transform(m_bbox.max()));
+
+ // translate bbox back to initial centroid
+ const SC_Point_3 bbox_transformed_centroid = midpoint(m_bbox.min(), m_bbox.max());
+ const SC_Vector_3 diff_centroid = bbox_centroid - bbox_transformed_centroid;
+
+ CGAL::Aff_transformation_3 translate(TRANSLATION, diff_centroid);
+ m_bbox = SC_Iso_cuboid_3(translate.transform(m_bbox.min()), translate.transform(m_bbox.max()));
+
+#ifdef CGAL_AW3_DEBUG_INITIALIZATION
+ std::cout << "Insert Bbox vertices" << std::endl;
+#endif
+
+ // insert in dt the eight corner vertices of the input loose bounding box
+ for(int i=0; i<8; ++i)
+ {
+ const Point_3 bp = SC2GT()(m_bbox.vertex(i));
+ Vertex_handle bv = m_dt.insert(bp);
+#ifdef CGAL_AW3_DEBUG_INITIALIZATION
+ std::cout << "\t" << bp << std::endl;
+#endif
+ bv->info() = BBOX_VERTEX;
+ }
+ }
+
+ // Two criteria:
+ // - Cells that are intersecting the input are inside
+ // - Cells whose circumcenter is in the offset volume are inside: this is because
+ // we need to have outside cell circumcenters outside of the volume to ensure
+ // that the refinement point is separated from the existing point set.
+ bool cavity_cell_outside_tag(const Cell_handle ch)
+ {
+ CGAL_precondition(!m_dt.is_infinite(ch));
+
+ const Tetrahedron_with_outside_info tet(ch, geom_traits());
+ if(m_oracle.do_intersect(tet))
+ return false;
+
+ const Point_3& ch_cc = circumcenter(ch);
+ typename Geom_traits::Construct_ball_3 ball = geom_traits().construct_ball_3_object();
+ const Ball_3 ch_cc_offset_ball = ball(ch_cc, m_sq_offset);
+ const bool is_cc_in_offset = m_oracle.do_intersect(ch_cc_offset_ball);
+
+ return !is_cc_in_offset;
+ }
+
+ // Create a cavity using seeds rather than starting from the infinity.
+ //
+ // For each seed, insert the seeds and its neighboring vertices on a regular icosahedron.
+ // The idea behind an icosahedron rather than e.g. a simple tetrahedron is twofold:
+ // - Improve the odds of both starting the algorithm, but also of not immediately stopping,
+ // which could happen if a conflict zone included all the initial cavity when using a simple cavity.
+ // - Base the cavity diameter on alpha, and allow its cells to intersect the input. If a single
+ // tetrahedron is used, one is forced to make it small-enough such that it does not intersect
+ // the input, and then it could be forced to be smaller than 'alpha' and the algorithm cannot start,
+ // for example if the seed is close to the offset. If we have many tetrahedra, this is far less
+ // likely to happen.
+ //
+ // For an edge length a, the radius of an icosahedron is
+ // r = 0.5 * a * sqrt(phi * sqrt(5)), phi being the golden ratio
+ // which yields
+ // r = a * sin(2pi / 5) =~ 0.95105651629515353 * a
+ // Faces of an icosahedron are equilateral triangles with size a and circumradius a / sqrt(3)
+ // Since we want faces of the icosahedron to be traversable, we want a such that
+ // a / sqrt(3) > alpha
+ // Hence r such that
+ // r / (sqrt(3) * sin(2pi/5)) > alpha
+ // r > alpha * sqrt(3) * sin(2pi / 5) ~= 1.6472782070926637 * alpha
+ //
+ // Furthermore, the triangles between edges of the icosahedron and the center of the icosahedron
+ // are not equilateral triangles since a is slightly bigger than r. They are
+ // slightly flattened isocele triangles with base 'a' and the circumradius is smaller.
+ // The circumradius is
+ // r_iso = r² / (2 * h) = r² / (2 * sqrt(r² - (a / 2)²))
+ // Since r = a * sin(2pi / 5)
+ // r_iso = r² / (2 * sqrt(r² - (r / 2 * sin(2pi / 5))²))
+ // = r / (2 * sqrt(1 - 1 / (2 * sin(2pi / 5))²))
+ // So we want r_iso > alpha, i.e.
+ // r > (2 * sqrt(1 - 1 / (2 * sin(2pi / 5))²)) * alpha ~= 1.7013016167040798 * alpha
+ //
+ // Another way is to simply make faces incident to the seed always traversable, and then
+ // we only have to ensure faces opposite of the seed are traversable (i.e., radius ~= 1.65 * alpha)
+ template
+ void initialize_with_cavities(const SeedRange& seeds)
+ {
+#ifdef CGAL_AW3_DEBUG_INITIALIZATION
+ std::cout << "> Dig cavities" << std::endl;
+ std::cout << seeds.size() << " seed(s)" << std::endl;
+#endif
+
+ CGAL_precondition(!seeds.empty());
+
+ // Get a double value approximating the scaling factors
+// std::cout << sqrt(3) * sin(2pi / 5) << std::endl;
+// std::cout << (2. * std::sqrt(1. - 1. / square(2 * std::sin(2 * CGAL_PI / 5)))) << std::endl;
+
+ Iso_cuboid_3 bbox = SC2GT()(m_bbox);
+
+ std::vector seed_vs;
+ for(const Point_3& seed_p : seeds)
+ {
+#ifdef CGAL_AW3_DEBUG_INITIALIZATION
+ std::cout << "Initialize from seed " << seed_p << std::endl;
+#endif
+
+ if(bbox.has_on_unbounded_side(seed_p))
+ {
+#ifdef CGAL_AW3_DEBUG_INITIALIZATION
+ std::cerr << "Warning: seed " << seed_p << " is outside the bounding box" << std::endl;
+#endif
+ continue;
+ }
+
+ // get the closest point on the input
+ const Point_3 closest_pt = m_oracle.closest_point(seed_p);
+ const FT sq_d_to_closest = geom_traits().compute_squared_distance_3_object()(seed_p, closest_pt);
+
+ if(sq_d_to_closest < m_sq_offset)
+ {
+#ifdef CGAL_AW3_DEBUG_INITIALIZATION
+ std::cerr << "Warning: seed " << seed_p << " is in the offset" << std::endl;
+#endif
+ continue;
+ }
+
+ // Mark the seeds and icosahedron vertices as "artificial vertices" such that the facets
+ // incident to these vertices are always traversable regardless of their circumcenter.
+ // This is done because otherwise some cavities can appear on the mesh: non-traversable facets
+ // with two vertices on the offset, and the third being a deeper inside seed / ico_seed.
+ // Making them traversable will cause more refinement than "alpha", but they will eventually
+ // not appear anymore in the inside/outside boundary and the surface will look smoother.
+ //
+ // This problem only appears when the seed and icosahedron vertices are close to the offset surface,
+ // which usually happens for large alpha values.
+
+ Vertex_handle seed_v = m_dt.insert(seed_p);
+ seed_v->info() = SEED_VERTEX;
+ seed_vs.push_back(seed_v);
+
+ // Icosahedron vertices (see also BGL::make_icosahedron())
+ const Point_3 center = seed_p;
+ const FT radius = 1.65 * m_alpha;
+ const FT phi = (FT(1) + approximate_sqrt(FT(5))) / FT(2);
+ const FT t = radius / approximate_sqrt(1 + square(phi));
+ const FT t_phi = t * phi;
+
+ std::array ico_ps =
+ {
+ Point_3(center.x(), center.y() + t, center.z() + t_phi),
+ Point_3(center.x(), center.y() + t, center.z() - t_phi),
+ Point_3(center.x(), center.y() - t, center.z() + t_phi),
+ Point_3(center.x(), center.y() - t, center.z() - t_phi),
+
+ Point_3(center.x() + t, center.y() + t_phi, center.z()),
+ Point_3(center.x() + t, center.y() - t_phi, center.z()),
+ Point_3(center.x() - t, center.y() + t_phi, center.z()),
+ Point_3(center.x() - t, center.y() - t_phi, center.z()),
+
+ Point_3(center.x() + t_phi, center.y(), center.z() + t),
+ Point_3(center.x() + t_phi, center.y(), center.z() - t),
+ Point_3(center.x() - t_phi, center.y(), center.z() + t),
+ Point_3(center.x() - t_phi, center.y(), center.z() - t)
+ };
+
+ for(const Point_3& seed_neighbor_p : ico_ps)
+ {
+#ifdef CGAL_AW3_DEBUG_PP
+ std::cout << seed_neighbor_p << std::endl;
+#endif
+ if(bbox.has_on_unbounded_side(seed_neighbor_p))
+ continue;
+
+ Vertex_handle ico_v = m_dt.insert(seed_neighbor_p, seed_v /*hint*/);
+ ico_v->info() = SEED_VERTEX;
+ }
+ }
+
+ if(seed_vs.empty())
+ {
+#ifdef CGAL_AW3_DEBUG_INITIALIZATION
+ std::cerr << "Error: no acceptable seed was provided" << std::endl;
+#endif
+ return;
+ }
+
+#ifdef CGAL_AW3_DEBUG_INITIALIZATION
+ std::cout << m_dt.number_of_vertices() - 8 /*bbox*/ << " vertice(s) due to seeds" << std::endl;
+#endif
+
+ for(Vertex_handle seed_v : seed_vs)
+ {
+ std::vector inc_cells;
+ inc_cells.reserve(64);
+ m_dt.incident_cells(seed_v, std::back_inserter(inc_cells));
+ for(Cell_handle ch : inc_cells)
+ ch->info().is_outside = cavity_cell_outside_tag(ch);
+ }
+
+ // Might as well go through the full triangulation since only seeds should have been inserted
+ for(Cell_handle ch : m_dt.all_cell_handles())
+ {
+ if(!ch->info().is_outside)
+ continue;
+
+ // When the algorithm starts from a manually dug hole, infinite cells are tagged "inside"
+ CGAL_assertion(!m_dt.is_infinite(ch));
+
+ for(int i=0; i<4; ++i)
+ push_facet(std::make_pair(ch, i));
+ }
+
+ if(m_queue.empty())
+ {
+#ifdef CGAL_AW3_DEBUG_INITIALIZATION
+ std::cerr << "Error: Could not initialize the algorithm with these seeds, and alpha|offset values" << std::endl;
+#endif
+ return;
+ }
+ }
+
+ // tag all infinite cells OUTSIDE and all finite cells INSIDE
+ // init queue with all convex hull facets
+ void initialize_from_infinity()
+ {
+ for(Cell_handle ch : m_dt.all_cell_handles())
+ {
+ if(m_dt.is_infinite(ch))
+ {
+ ch->info().is_outside = true;
+ const int inf_index = ch->index(m_dt.infinite_vertex());
+ push_facet(std::make_pair(ch, inf_index));
+ }
+ else
+ {
+ ch->info().is_outside = false;
+ }
+ }
+ }
+
+ // Manifoldness is tolerated while debugging and extracting at intermediate states
+ // Not the preferred way because it uses 3*nv storage
+ template
+ void extract_possibly_non_manifoldness_surface(OutputMesh& output_mesh,
+ OVPM ovpm)
+ {
+ namespace PMP = Polygon_mesh_processing;
+
+#ifdef CGAL_AW3_DEBUG
+ std::cout << "> Extract possibly non-manifold wrap... ()" << std::endl;
+#endif
+
+ clear(output_mesh);
+
+ CGAL_assertion_code(for(auto cit=m_dt.finite_cells_begin(), cend=m_dt.finite_cells_end(); cit!=cend; ++cit))
+ CGAL_assertion(cit->tds_data().is_clear());
+
+ for(auto cit=m_dt.finite_cells_begin(), cend=m_dt.finite_cells_end(); cit!=cend; ++cit)
+ {
+ Cell_handle seed = cit;
+ if(seed->info().is_outside || seed->tds_data().processed())
+ continue;
+
+ std::queue to_visit;
+ to_visit.push(seed);
+
+ std::vector points;
+ std::vector > faces;
+ std::size_t idx = 0;
+
+ while(!to_visit.empty())
+ {
+ const Cell_handle cell = to_visit.front();
+ CGAL_assertion(!cell->info().is_outside && !m_dt.is_infinite(cell));
+
+ to_visit.pop();
+
+ if(cell->tds_data().processed())
+ continue;
+
+ cell->tds_data().mark_processed();
+
+ for(int fid=0; fid<4; ++fid)
+ {
+ const Cell_handle neighbor = cell->neighbor(fid);
+ if(neighbor->info().is_outside)
+ {
+ // There shouldn't be any artificial vertex on the inside/outside boundary
+ // (past initialization)
+// CGAL_assertion(cell->vertex((fid + 1)&3)->info() != BBOX_VERTEX);
+// CGAL_assertion(cell->vertex((fid + 2)&3)->info() != BBOX_VERTEX);
+// CGAL_assertion(cell->vertex((fid + 3)&3)->info() != BBOX_VERTEX);
+
+ points.push_back(m_dt.point(cell, Dt::vertex_triple_index(fid, 0)));
+ points.push_back(m_dt.point(cell, Dt::vertex_triple_index(fid, 1)));
+ points.push_back(m_dt.point(cell, Dt::vertex_triple_index(fid, 2)));
+ faces.push_back({idx, idx + 1, idx + 2});
+ idx += 3;
+ }
+ else
+ {
+ to_visit.push(neighbor);
+ }
+ }
+ }
+
+ PMP::duplicate_non_manifold_edges_in_polygon_soup(points, faces);
+
+ CGAL_assertion(PMP::is_polygon_soup_a_polygon_mesh(faces));
+ PMP::polygon_soup_to_polygon_mesh(points, faces, output_mesh,
+ CGAL::parameters::default_values(),
+ CGAL::parameters::vertex_point_map(ovpm));
+
+ PMP::stitch_borders(output_mesh, CGAL::parameters::vertex_point_map(ovpm));
+ CGAL_assertion(is_closed(output_mesh));
+ }
+
+ for(auto cit=m_dt.finite_cells_begin(), cend=m_dt.finite_cells_end(); cit!=cend; ++cit)
+ cit->tds_data().clear();
+
+ CGAL_postcondition(!is_empty(output_mesh));
+ CGAL_postcondition(is_valid_polygon_mesh(output_mesh));
+ CGAL_postcondition(is_closed(output_mesh));
+
+ PMP::orient_to_bound_a_volume(output_mesh, CGAL::parameters::vertex_point_map(ovpm));
+ }
+
+ template
+ void extract_manifoldness_surface(OutputMesh& output_mesh,
+ OVPM ovpm)
+ {
+ namespace PMP = Polygon_mesh_processing;
+
+#ifdef CGAL_AW3_DEBUG
+ std::cout << "> Extract wrap... ()" << std::endl;
+#endif
+
+ CGAL_assertion_code(for(Vertex_handle v : m_dt.finite_vertex_handles()))
+ CGAL_assertion(!is_non_manifold(v));
+
+ clear(output_mesh);
+
+ // boundary faces to polygon soup
+ std::vector points;
+ std::vector > faces;
+
+ std::unordered_map vertex_to_id;
+ std::size_t nv = 0;
+
+ for(auto fit=m_dt.finite_facets_begin(), fend=m_dt.finite_facets_end(); fit!=fend; ++fit)
+ {
+ Facet f = *fit;
+ if(!f.first->info().is_outside)
+ f = m_dt.mirror_facet(f);
+
+ const Cell_handle c = f.first;
+ const int s = f.second;
+ const Cell_handle nh = c->neighbor(s);
+ if(c->info().is_outside == nh->info().is_outside)
+ continue;
+
+ // There shouldn't be any artificial vertex on the inside/outside boundary
+ CGAL_assertion(f.first->vertex((f.second + 1)&3)->info() != BBOX_VERTEX);
+ CGAL_assertion(f.first->vertex((f.second + 2)&3)->info() != BBOX_VERTEX);
+ CGAL_assertion(f.first->vertex((f.second + 3)&3)->info() != BBOX_VERTEX);
+
+ std::array ids;
+ for(std::size_t pos=0; pos<3; ++pos)
+ {
+ Vertex_handle vh = c->vertex(Dt::vertex_triple_index(s, pos));
+ auto insertion_res = vertex_to_id.emplace(vh, nv);
+ if(insertion_res.second) // successful insertion, never-seen-before vertex
+ {
+ points.push_back(m_dt.point(vh));
+ ++nv;
+ }
+
+ ids[pos] = insertion_res.first->second;
+ }
+
+ faces.emplace_back(std::array{ids[0], ids[1], ids[2]});
+ }
+
+ if(faces.empty())
+ return;
+
+ CGAL_assertion(PMP::is_polygon_soup_a_polygon_mesh(faces));
+ PMP::polygon_soup_to_polygon_mesh(points, faces, output_mesh,
+ CGAL::parameters::default_values(),
+ CGAL::parameters::vertex_point_map(ovpm));
+
+ CGAL_postcondition(!is_empty(output_mesh));
+ CGAL_postcondition(is_valid_polygon_mesh(output_mesh));
+ CGAL_postcondition(is_closed(output_mesh));
+
+ PMP::orient_to_bound_a_volume(output_mesh, CGAL::parameters::vertex_point_map(ovpm));
+ }
+
+ template
+ void extract_surface(OutputMesh& output_mesh,
+ OVPM ovpm,
+ const bool tolerate_non_manifoldness = false)
+ {
+ if(tolerate_non_manifoldness)
+ extract_possibly_non_manifoldness_surface(output_mesh, ovpm);
+ else
+ extract_manifoldness_surface(output_mesh, ovpm);
+ }
+
+private:
+ bool is_traversable(const Facet& f) const
+ {
+ return less_squared_radius_of_min_empty_sphere(m_sq_alpha, f, m_dt);
+ }
+
+ bool compute_steiner_point(const Cell_handle ch,
+ const Cell_handle neighbor,
+ Point_3& steiner_point) const
+ {
+ CGAL_precondition(!m_dt.is_infinite(neighbor));
+
+ typename Geom_traits::Construct_ball_3 ball = geom_traits().construct_ball_3_object();
+ typename Geom_traits::Construct_vector_3 vector = geom_traits().construct_vector_3_object();
+ typename Geom_traits::Construct_translated_point_3 translate = geom_traits().construct_translated_point_3_object();
+ typename Geom_traits::Construct_scaled_vector_3 scale = geom_traits().construct_scaled_vector_3_object();
+
+ const Point_3& neighbor_cc = circumcenter(neighbor);
+ const Ball_3 neighbor_cc_offset_ball = ball(neighbor_cc, m_sq_offset);
+ const bool is_neighbor_cc_in_offset = m_oracle.do_intersect(neighbor_cc_offset_ball);
+
+#ifdef CGAL_AW3_DEBUG_STEINER_COMPUTATION
+ const Point_3& chc = circumcenter(ch);
+
+ std::cout << "Compute_steiner_point()" << std::endl;
+ std::cout << "CH" << std::endl;
+ std::cout << "\t" << ch->vertex(0)->point() << std::endl;
+ std::cout << "\t" << ch->vertex(1)->point() << std::endl;
+ std::cout << "\t" << ch->vertex(2)->point() << std::endl;
+ std::cout << "\t" << ch->vertex(3)->point() << std::endl;
+ std::cout << "cc: " << chc << std::endl;
+ std::cout << "CC Distance to input: " << CGAL::squared_distance(chc, m_oracle.closest_point(chc)) << std::endl;
+
+ std::cout << "NCH" << std::endl;
+ std::cout << "\t" << neighbor->vertex(0)->point() << std::endl;
+ std::cout << "\t" << neighbor->vertex(1)->point() << std::endl;
+ std::cout << "\t" << neighbor->vertex(2)->point() << std::endl;
+ std::cout << "\t" << neighbor->vertex(3)->point() << std::endl;
+ std::cout << "ncc: " << neighbor_cc << std::endl;
+ std::cout << "NC Distance to input: " << CGAL::squared_distance(neighbor_cc, m_oracle.closest_point(neighbor_cc)) << std::endl;
+ std::cout << "is_neighbor_cc_in_offset = " << is_neighbor_cc_in_offset << std::endl;
+
+ std::cout << "squared offset " << m_sq_offset << std::endl;
+#endif
+
+ // ch's circumcenter should not be within the offset volume
+ CGAL_assertion_code(const Point_3& ch_cc = circumcenter(ch);)
+ CGAL_assertion_code(const Ball_3 ch_cc_offset_ball = ball(ch_cc, m_sq_offset);)
+ CGAL_assertion(!m_oracle.do_intersect(ch_cc_offset_ball));
+
+ if(is_neighbor_cc_in_offset)
+ {
+ const Point_3& ch_cc = circumcenter(ch);
+
+ // If the voronoi edge intersects the offset, the steiner point is the first intersection
+ if(m_oracle.first_intersection(ch_cc, neighbor_cc, steiner_point, m_offset))
+ {
+#ifdef CGAL_AW3_DEBUG_STEINER_COMPUTATION
+ std::cout << "Steiner found through first_intersection(): " << steiner_point << std::endl;
+#endif
+ return true;
+ }
+ }
+
+ Tetrahedron_with_outside_info tet(neighbor, geom_traits());
+ if(m_oracle.do_intersect(tet))
+ {
+ // steiner point is the closest point on input from cell centroid with offset
+ const Point_3 closest_pt = m_oracle.closest_point(neighbor_cc);
+ CGAL_assertion(closest_pt != neighbor_cc);
+
+ Vector_3 unit = vector(closest_pt, neighbor_cc);
+
+ // PMP::internal::normalize() requires sqrt()
+ unit = scale(unit, m_offset / approximate_sqrt(geom_traits().compute_squared_length_3_object()(unit)));
+ steiner_point = translate(closest_pt, unit);
+
+#ifdef CGAL_AW3_DEBUG_STEINER_COMPUTATION
+ std::cout << "Steiner found through neighboring tet intersecting the input: " << steiner_point << std::endl;
+ std::cout << "Closest point: " << closest_pt << std::endl;
+ std::cout << "Direction: " << vector(closest_pt, neighbor_cc) << std::endl;
+#endif
+
+ return true;
+ }
+
+#ifdef CGAL_AW3_DEBUG_STEINER_COMPUTATION
+ std::cout << "No Steiner point" << std::endl;
+#endif
+
+ return false;
+ }
+
+private:
+ enum Facet_queue_status
+ {
+ IRRELEVANT = 0,
+ ARTIFICIAL_FACET,
+ TRAVERSABLE
+ };
+
+ // @speed some decent time may be spent constructing Facet (pairs) for no reason as it's always
+ // just to grab the .first and .second as soon as it's constructed, and not due to API requirements
+ // e.g. from DT3
+ Facet_queue_status facet_status(const Facet& f) const
+ {
+ CGAL_precondition(!m_dt.is_infinite(f));
+
+#ifdef CGAL_AW3_DEBUG_FACET_STATUS
+ std::cout << "facet status: "
+ << f.first->vertex((f.second + 1)&3)->point() << " "
+ << f.first->vertex((f.second + 2)&3)->point() << " "
+ << f.first->vertex((f.second + 3)&3)->point() << std::endl;
+#endif
+
+ // skip if neighbor is OUTSIDE or infinite
+ const Cell_handle ch = f.first;
+ const int id = f.second;
+ const Cell_handle nh = ch->neighbor(id);
+ if(m_dt.is_infinite(nh))
+ return TRAVERSABLE;
+
+ if(nh->info().is_outside)
+ {
+#ifdef CGAL_AW3_DEBUG_FACET_STATUS
+ std::cout << "Neighbor already outside" << std::endl;
+#endif
+ return IRRELEVANT;
+ }
+
+ // push if facet is connected to artifical vertices
+ for(int i=0; i<3; ++i)
+ {
+ const Vertex_handle vh = ch->vertex(Dt::vertex_triple_index(id, i));
+ if(vh->info() == BBOX_VERTEX || vh->info() == SEED_VERTEX)
+ {
+#ifdef CGAL_AW3_DEBUG_FACET_STATUS
+ std::cout << "artificial facet due to artificial vertex #" << i << std::endl;
+#endif
+ return ARTIFICIAL_FACET;
+ }
+ }
+
+ // skip if f min empty sphere radius is smaller than alpha
+ if(is_traversable(f))
+ {
+#ifdef CGAL_AW3_DEBUG_FACET_STATUS
+ std::cout << "traversable" << std::endl;
+#endif
+ return TRAVERSABLE;
+ }
+
+#ifdef CGAL_AW3_DEBUG_FACET_STATUS
+ std::cout << "not traversable" << std::endl;
+#endif
+ return IRRELEVANT;
+ }
+
+ bool push_facet(const Facet& f)
+ {
+ CGAL_precondition(f.first->info().is_outside);
+
+ // skip if f is already in queue
+ if(m_queue.contains_with_bounds_check(Gate(f)))
+ return false;
+
+ const Facet_queue_status s = facet_status(f);
+ if(s == IRRELEVANT)
+ return false;
+
+ const Cell_handle ch = f.first;
+ const int id = f.second;
+ const Point_3& p0 = m_dt.point(ch, (id+1)&3);
+ const Point_3& p1 = m_dt.point(ch, (id+2)&3);
+ const Point_3& p2 = m_dt.point(ch, (id+3)&3);
+
+ // @todo should prob be the real value we compare to alpha instead of squared_radius
+ const FT sqr = geom_traits().compute_squared_radius_3_object()(p0, p1, p2);
+ m_queue.resize_and_push(Gate(f, sqr, (s == ARTIFICIAL_FACET)));
+
+ return true;
+ }
+
+private:
+ template
+ void initialize(const double alpha,
+ const double offset,
+ const SeedRange& seeds)
+ {
+#ifdef CGAL_AW3_DEBUG
+ std::cout << "Alpha: " << alpha << std::endl;
+ std::cout << "Offset: " << offset << std::endl;
+#endif
+
+ if(!is_positive(alpha) || !is_positive(offset))
+ {
+#ifdef CGAL_AW3_DEBUG
+ std::cout << "Error: invalid input parameters" << std::endl;
+#endif
+ return;
+ }
+
+ m_offset = FT(offset);
+ m_sq_offset = square(m_offset);
+ m_alpha = FT(alpha);
+ m_sq_alpha = square(m_alpha);
+
+ m_dt.clear();
+ m_queue.clear();
+
+ insert_bbox_corners();
+
+ if(seeds.empty())
+ initialize_from_infinity();
+ else
+ initialize_with_cavities(seeds);
+ }
+
+ void alpha_flood_fill()
+ {
+#ifdef CGAL_AW3_DEBUG
+ std::cout << "> Flood fill..." << std::endl;
+#endif
+
+ // Explore all finite cells that are reachable from one of the infinite cells.
+ while(!m_queue.empty())
+ {
+#ifdef CGAL_AW3_DEBUG_QUEUE_PP
+ check_queue_sanity();
+#endif
+
+ // const& to something that will be poped, but safe as `ch` && `id` are extracted before the pop
+ const Gate& gate = m_queue.top();
+ const Facet& f = gate.facet();
+ CGAL_precondition(!m_dt.is_infinite(f));
+
+ const Cell_handle ch = f.first;
+ const int id = f.second;
+ const Cell_handle neighbor = ch->neighbor(id);
+
+#ifdef CGAL_AW3_DEBUG_QUEUE
+ static int fid = 0;
+ std::cout << m_dt.number_of_vertices() << " DT vertices" << std::endl;
+ std::cout << m_queue.size() << " facets in the queue" << std::endl;
+ std::cout << "Face " << fid++ << "\n"
+ << "c = " << &*ch << " (" << m_dt.is_infinite(ch) << "), n =" << &*neighbor << " (" << m_dt.is_infinite(neighbor) << ")" << "\n"
+ << m_dt.point(ch, (id+1)&3) << "\n" << m_dt.point(ch, (id+2)&3) << "\n" << m_dt.point(ch, (id+3)&3) << std::endl;
+ std::cout << "Priority: " << gate.priority() << std::endl;
+#endif
+
+ m_queue.pop();
+
+#ifdef CGAL_AW3_DEBUG_DUMP_EVERY_STEP
+ static int i = 0;
+ std::string step_name = "results/steps/step_" + std::to_string(static_cast(i)) + ".off";
+ dump_triangulation_faces(step_name, true /*only_boundary_faces*/);
+
+ std::string face_name = "results/steps/face_" + std::to_string(static_cast(i++)) + ".xyz";
+ std::ofstream face_out(face_name);
+ face_out.precision(17);
+ face_out << "3\n" << m_dt.point(ch, (id+1)&3) << "\n" << m_dt.point(ch, (id+2)&3) << "\n" << m_dt.point(ch, (id+3)&3) << std::endl;
+ face_out.close();
+#endif
+
+ if(m_dt.is_infinite(neighbor))
+ {
+ neighbor->info().is_outside = true;
+ continue;
+ }
+
+ Point_3 steiner_point;
+ if(compute_steiner_point(ch, neighbor, steiner_point))
+ {
+// std::cout << CGAL::abs(CGAL::approximate_sqrt(m_oracle.squared_distance(steiner_point)) - m_offset)
+// << " vs " << 1e-2 * m_offset << std::endl;
+ CGAL_assertion(CGAL::abs(CGAL::approximate_sqrt(m_oracle.squared_distance(steiner_point)) - m_offset) <= 1e-2 * m_offset);
+
+ // locate cells that are going to be destroyed and remove their facet from the queue
+ int li, lj = 0;
+ Locate_type lt;
+ const Cell_handle conflict_cell = m_dt.locate(steiner_point, lt, li, lj, neighbor);
+ CGAL_assertion(lt != Dt::VERTEX);
+
+ std::vector boundary_facets;
+ std::vector conflict_zone;
+ boundary_facets.reserve(32);
+ conflict_zone.reserve(32);
+ m_dt.find_conflicts(steiner_point, conflict_cell,
+ std::back_inserter(boundary_facets),
+ std::back_inserter(conflict_zone));
+
+ // Purge the queue of facets that will be modified with the Steiner point insertion,
+ // and which might have been gates
+ for(const Cell_handle& cch : conflict_zone)
+ {
+ for(int i=0; i<4; ++i)
+ {
+ const Facet cf = std::make_pair(cch, i);
+ if(m_queue.contains_with_bounds_check(Gate(cf)))
+ m_queue.erase(Gate(cf));
+ }
+ }
+
+ for(const Facet& f : boundary_facets)
+ {
+ const Facet mf = m_dt.mirror_facet(f); // boundary facets have incident cells in the CZ
+ if(m_queue.contains_with_bounds_check(Gate(mf)))
+ m_queue.erase(Gate(mf));
+ }
+
+ // Actual insertion of the Steiner point
+ Vertex_handle vh = m_dt.insert(steiner_point, lt, conflict_cell, li, lj);
+ vh->info() = DEFAULT;
+
+ std::vector new_cells;
+ new_cells.reserve(32);
+ m_dt.incident_cells(vh, std::back_inserter(new_cells));
+ for(const Cell_handle& ch : new_cells)
+ {
+ // std::cout << "new cell has time stamp " << ch->time_stamp() << std::endl;
+ ch->info().is_outside = m_dt.is_infinite(ch);
+ }
+
+ // Push all new boundary facets to the queue.
+ // It is not performed by looking at the facets on the boundary of the conflict zones
+ // because we need to handle internal facets, infinite facets, and also more subtle changes
+ // such as a new cell being marked inside which now creates a boundary
+ // with its incident "outside" flagged cell.
+ for(Cell_handle ch : new_cells)
+ {
+ for(int i=0; i<4; ++i)
+ {
+ if(m_dt.is_infinite(ch, i))
+ continue;
+
+ const Cell_handle nh = ch->neighbor(i);
+ if(nh->info().is_outside == ch->info().is_outside) // not on the boundary
+ continue;
+
+ const Facet boundary_f = std::make_pair(ch, i);
+ if(ch->info().is_outside)
+ push_facet(boundary_f);
+ else
+ push_facet(m_dt.mirror_facet(boundary_f));
+ }
+ }
+ }
+ else
+ {
+ // tag neighbor as OUTSIDE
+ neighbor->info().is_outside = true;
+
+ // for each finite facet of neighbor, push it to the queue
+ for(int i=0; i<4; ++i)
+ {
+ const Facet neighbor_f = std::make_pair(neighbor, i);
+ push_facet(neighbor_f);
+ }
+ }
+ } // while(!queue.empty())
+
+ // Check that no useful facet has been ignored
+ CGAL_postcondition_code(for(auto fit=m_dt.finite_facets_begin(), fend=m_dt.finite_facets_end(); fit!=fend; ++fit) {)
+ CGAL_postcondition_code( if(fit->first->info().is_outside == fit->first->neighbor(fit->second)->info().is_outside) continue;)
+ CGAL_postcondition_code( Facet f = *fit;)
+ CGAL_postcondition_code( if(!fit->first->info().is_outside) f = m_dt.mirror_facet(f);)
+ CGAL_postcondition( facet_status(f) == IRRELEVANT);
+ CGAL_postcondition_code(})
+ }
+
+private:
+ bool is_non_manifold(Vertex_handle v) const
+ {
+ CGAL_precondition(!m_dt.is_infinite(v));
+
+ bool is_non_manifold = false;
+
+ std::vector inc_cells;
+ inc_cells.reserve(64);
+ m_dt.incident_cells(v, std::back_inserter(inc_cells));
+
+ // Flood one inside and outside CC.
+ // Process both an inside and an outside CC to also detect edge pinching.
+ // If there are still unprocessed afterwards, there is a non-manifoldness issue.
+ //
+ // Squat the conflict cell data to mark visits
+ Cell_handle inside_start = Cell_handle();
+ Cell_handle outside_start = Cell_handle();
+
+ for(Cell_handle ic : inc_cells)
+ {
+ ic->tds_data().clear();
+ if(ic->info().is_outside)
+ outside_start = ic;
+ else if(inside_start == Cell_handle())
+ inside_start = ic;
+ }
+
+ // fully inside / outside
+ if(inside_start == Cell_handle() || outside_start == Cell_handle())
+ return false;
+
+ std::stack cells_to_visit;
+ cells_to_visit.push(inside_start);
+ cells_to_visit.push(outside_start);
+ while(!cells_to_visit.empty())
+ {
+ Cell_handle curr_c = cells_to_visit.top();
+ cells_to_visit.pop();
+
+ if(curr_c->tds_data().processed())
+ continue;
+ curr_c->tds_data().mark_processed();
+
+ int v_pos = -1;
+ CGAL_assertion_code(bool res = ) curr_c->has_vertex(v, v_pos);
+ CGAL_assertion(res);
+
+ for(int j=0; j<4; ++j)
+ {
+ if(j == v_pos)
+ continue;
+
+ Cell_handle neigh_c = curr_c->neighbor(j);
+ CGAL_assertion(neigh_c->has_vertex(v));
+
+ if(neigh_c->tds_data().processed() ||
+ neigh_c->info().is_outside != curr_c->info().is_outside) // do not cross the boundary
+ continue;
+
+ cells_to_visit.push(neigh_c);
+ }
+ }
+
+ for(Cell_handle ic : inc_cells)
+ {
+ if(ic->tds_data().is_clear()) // <=> unvisited cell
+ {
+ is_non_manifold = true;
+ break;
+ }
+ }
+
+ // reset the conflict flags
+ for(Cell_handle ic : inc_cells)
+ ic->tds_data().clear();
+
+ return is_non_manifold;
+ }
+
+ bool is_non_manifold(Cell_handle c) const
+ {
+ CGAL_precondition(!m_dt.is_infinite(c));
+
+ for(int i=0; i<4; ++i)
+ {
+ Vertex_handle v = c->vertex(i);
+ if(is_non_manifold(v))
+ return true;
+ }
+
+ return false;
+ }
+
+ bool is_manifold() const
+ {
+ // Not the best complexity, but it's not so important for now.
+ // Better complexity --> PMP::non_manifold_vertices + throw
+
+ for(const Vertex_handle v : m_dt.finite_vertex_handles())
+ if(is_non_manifold(v))
+ return true;
+
+ return false;
+ }
+
+ // Remove bbox vertices, if they are not necessary (i.e., no "inside" incident cell)
+ // This is to try and avoid having long tets with bbox vertices being tagged "inside" as part
+ // of the manifold re-tagging
+ bool remove_bbox_vertices()
+ {
+ bool do_remove = true;
+ auto vit = m_dt.finite_vertices_begin();
+ for(std::size_t i=0; i<8; ++i)
+ {
+ Vertex_handle v = vit++;
+
+ std::vector inc_cells;
+ inc_cells.reserve(64);
+ m_dt.finite_incident_cells(v, std::back_inserter(inc_cells));
+
+ for(Cell_handle c : inc_cells)
+ {
+ if(!c->info().is_outside)
+ {
+ do_remove = false;
+ break;
+ }
+ }
+
+ if(!do_remove)
+ break;
+ }
+
+ std::cout << "Removing bbox vertices? " << do_remove << std::endl;
+ if(!do_remove)
+ return false;
+
+ vit = m_dt.finite_vertices_begin();
+ for(std::size_t i=0; i<8; ++i)
+ {
+ Vertex_handle v = vit++;
+ m_dt.remove(v);
+ }
+
+ return true;
+ }
+
+ // Not the best complexity, but it's very cheap compared to the rest of the algorithm.
+ void make_manifold()
+ {
+ namespace PMP = Polygon_mesh_processing;
+
+ // This seems more harmful than useful after the priority queue has been introduced since
+ // it adds a lot of flat cells into the triangulation, which then get added to the mesh
+ // during manifoldness fixing.
+// remove_bbox_vertices();
+
+ std::stack non_manifold_vertices; // @todo sort somehow?
+ for(Vertex_handle v : m_dt.finite_vertex_handles())
+ {
+ if(is_non_manifold(v))
+ non_manifold_vertices.push(v);
+ }
+
+ // Some lambdas for the comparer
+ auto has_artificial_vertex = [](Cell_handle c) -> bool
+ {
+ for(int i=0; i<4; ++i)
+ if(c->vertex(i)->info() == BBOX_VERTEX || c->vertex(i)->info() == SEED_VERTEX)
+ return true;
+
+ return false;
+ };
+
+ auto is_on_boundary = [](Cell_handle c, int i) -> bool
+ {
+ return (c->info().is_outside != c->neighbor(i)->info().is_outside);
+ };
+
+ auto count_boundary_facets = [&](Cell_handle c, Vertex_handle v) -> int
+ {
+ const int v_index_in_c = c->index(v);
+ int boundary_facets = 0;
+ for(int i=0; i<3; ++i) // also take into account the opposite facet?
+ {
+ if(i == v_index_in_c)
+ continue;
+
+ boundary_facets += is_on_boundary(c, i);
+ }
+
+ return boundary_facets;
+ };
+
+ // longest edge works better
+// auto sq_circumradius = [&](Cell_handle c) -> FT
+// {
+// const Point_3& cc = circumcenter(c);
+// return geom_traits().compute_squared_distance_3_object()(m_dt.point(c, 0), cc);
+// };
+
+ auto sq_longest_edge = [&](Cell_handle c) -> FT
+ {
+ return (std::max)({ squared_distance(m_dt.point(c, 0), m_dt.point(c, 1)),
+ squared_distance(m_dt.point(c, 0), m_dt.point(c, 2)),
+ squared_distance(m_dt.point(c, 0), m_dt.point(c, 3)),
+ squared_distance(m_dt.point(c, 1), m_dt.point(c, 2)),
+ squared_distance(m_dt.point(c, 3), m_dt.point(c, 3)),
+ squared_distance(m_dt.point(c, 2), m_dt.point(c, 3)) });
+ };
+
+#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS
+ std::cout << non_manifold_vertices.size() << " initial NMV" << std::endl;
+#endif
+
+ while(!non_manifold_vertices.empty())
+ {
+#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS
+ std::cout << non_manifold_vertices.size() << " NMV in queue" << std::endl;
+#endif
+
+ Vertex_handle v = non_manifold_vertices.top();
+ non_manifold_vertices.pop();
+
+#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS
+ std::cout << "·";
+#endif
+
+ if(!is_non_manifold(v))
+ continue;
+
+ // Prioritize:
+ // - cells without bbox vertices
+ // - cells that already have a large number of boundary facets
+ // - small cells when equal number of boundary facets
+ // @todo give topmost priority to cells with > 1 non-manifold vertex?
+ auto comparer = [&](Cell_handle l, Cell_handle r) -> bool
+ {
+ if(has_artificial_vertex(l))
+ return false;
+ if(has_artificial_vertex(r))
+ return true;
+
+ const int l_bf_count = count_boundary_facets(l, v);
+ const int r_bf_count = count_boundary_facets(r, v);
+ if(l_bf_count != r_bf_count)
+ return l_bf_count > r_bf_count;
+
+ return sq_longest_edge(l) < sq_longest_edge(r);
+ };
+
+ std::vector inc_cells;
+ inc_cells.reserve(64);
+ m_dt.finite_incident_cells(v, std::back_inserter(inc_cells));
+
+#define CGAL_AW3_USE_BRUTE_FORCE_MUTABLE_PRIORITY_QUEUE
+#ifndef CGAL_AW3_USE_BRUTE_FORCE_MUTABLE_PRIORITY_QUEUE
+ std::sort(inc_cells.begin(), inc_cells.end(), comparer); // sort once
+#endif
+
+ for(auto cit=inc_cells.begin(), cend=inc_cells.end(); cit!=cend; ++cit)
+ {
+#ifdef CGAL_AW3_USE_BRUTE_FORCE_MUTABLE_PRIORITY_QUEUE
+ // sort at every iteration since the number of boundary facets evolves
+ std::sort(cit, cend, comparer);
+#endif
+ Cell_handle ic = *cit;
+ CGAL_assertion(!m_dt.is_infinite(ic));
+
+ // This is where new material is added
+ ic->info().is_outside = false;
+
+#ifdef CGAL_AW3_DEBUG_DUMP_EVERY_STEP
+ static int i = 0;
+ std::string step_name = "results/steps_manifold/step" + std::to_string(static_cast(i++)) + ".off";
+ dump_triangulation_faces(step_name, true /*only_boundary_faces*/);
+#endif
+
+ // @speed could update the manifold status while tagging
+ if(!is_non_manifold(v))
+ break;
+ }
+
+ CGAL_assertion(!is_non_manifold(v));
+
+ std::vector adj_vertices;
+ adj_vertices.reserve(64);
+ m_dt.finite_adjacent_vertices(v, std::back_inserter(adj_vertices));
+
+ for(Vertex_handle nv : adj_vertices)
+ if(is_non_manifold(nv))
+ non_manifold_vertices.push(nv);
+ }
+
+ CGAL_assertion_code(for(Vertex_handle v : m_dt.finite_vertex_handles()))
+ CGAL_assertion(!is_non_manifold(v));
+ }
+
+private:
+ void check_queue_sanity()
+ {
+ std::cout << "Check queue sanity..." << std::endl;
+ std::vector queue_gates;
+ Gate previous_top_gate = m_queue.top();
+ while(!m_queue.empty())
+ {
+ const Gate& current_gate = m_queue.top();
+ queue_gates.push_back(current_gate);
+ const Facet& current_f = current_gate.facet();
+ const Cell_handle ch = current_f.first;
+ const int id = current_f.second;
+ const Point_3& p0 = m_dt.point(ch, (id+1)&3);
+ const Point_3& p1 = m_dt.point(ch, (id+2)&3);
+ const Point_3& p2 = m_dt.point(ch, (id+3)&3);
+ const FT sqr = geom_traits().compute_squared_radius_3_object()(p0, p1, p2);
+
+ std::cout << "At Facet with VID " << get(Gate_ID_PM(), current_gate) << std::endl;
+
+ if(current_gate.priority() != sqr)
+ std::cerr << "Error: facet in queue has wrong priority" << std::endl;
+
+ if(Less_gate()(current_gate, previous_top_gate))
+ std::cerr << "Error: current gate has higher priority than the previous top" << std::endl;
+
+ previous_top_gate = current_gate;
+
+ m_queue.pop();
+ }
+ std::cout << "End sanity check" << std::endl;
+
+ // Rebuild
+ CGAL_assertion(m_queue.empty());
+ for(const auto& g : queue_gates)
+ m_queue.push(g); // no need for a resize here since the vector capacity is unchanged
+ }
+
+ void dump_triangulation_faces(const std::string filename,
+ bool only_boundary_faces = false)
+ {
+ std::stringstream vertices_ss;
+ vertices_ss.precision(17);
+
+ std::stringstream facets_ss;
+ facets_ss.precision(17);
+
+ std::unordered_map vertex_to_id;
+ std::size_t nv = 0;
+ std::size_t nf = 0;
+
+ for(auto fit=m_dt.finite_facets_begin(), fend=m_dt.finite_facets_end(); fit!=fend; ++fit)
+ {
+ Cell_handle c = fit->first;
+ int s = fit->second;
+
+ Cell_handle nc = c->neighbor(s);
+ if(only_boundary_faces && (c->info().is_outside == nc->info().is_outside))
+ continue;
+
+ std::array ids;
+ for(std::size_t pos=0; pos<3; ++pos)
+ {
+ Vertex_handle v = c->vertex((s+pos+1)&3);
+ auto insertion_res = vertex_to_id.emplace(v, nv);
+ if(insertion_res.second)
+ {
+ vertices_ss << m_dt.point(v) << "\n";
+ ++nv;
+ }
+
+ ids[pos] = insertion_res.first->second;
+ }
+
+ facets_ss << "3 " << ids[0] << " " << ids[1] << " " << ids[2] << "\n";
+ ++nf;
+ }
+
+ std::ofstream out(filename.c_str());
+ out << "OFF\n" << nv << " " << nf << " 0\n";
+ out << vertices_ss.str() << "\n" << facets_ss.str() << std::endl;
+ }
+};
+
+} // namespace internal
+} // namespace Alpha_wraps_3
+} // namespace CGAL
+
+#endif // CGAL_ALPHA_WRAP_3_INTERNAL_ALPHA_WRAP_3_H
diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_AABB_traits.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_AABB_traits.h
new file mode 100644
index 00000000000..41f76056d4d
--- /dev/null
+++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_AABB_traits.h
@@ -0,0 +1,288 @@
+// Copyright (c) 2019-2022 Copyright holders.
+// All rights reserved.
+//
+// This file is part of the 3D Alpha Wrapping package, which is being prepared for
+// submission to CGAL (www.cgal.org).
+//
+// $URL$
+// $Id$
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// Author(s) : TBA
+//
+#ifndef CGAL_ALPHA_WRAP_3_INTERNAL_ALPHA_WRAP_AABB_TRAITS_H
+#define CGAL_ALPHA_WRAP_3_INTERNAL_ALPHA_WRAP_AABB_TRAITS_H
+
+#include
+
+#include
+
+#include
+#include
+#include
+
+namespace CGAL {
+namespace Alpha_wraps_3 {
+namespace internal {
+
+template
+struct Tetrahedron_with_outside_info
+{
+ using Kernel = K;
+ using Tetrahedron_3 = typename Kernel::Tetrahedron_3;
+ using Triangle_3 = typename Kernel::Triangle_3;
+
+ template
+ Tetrahedron_with_outside_info(const CellHandle ch, const K& k)
+ {
+ typename K::Construct_bbox_3 bbox = k.construct_bbox_3_object();
+ typename K::Construct_tetrahedron_3 tetrahedron = k.construct_tetrahedron_3_object();
+ typename K::Construct_triangle_3 triangle = k.construct_triangle_3_object();
+
+ m_tet = tetrahedron(ch->vertex(0)->point(), ch->vertex(1)->point(),
+ ch->vertex(2)->point(), ch->vertex(3)->point());
+ m_bbox = bbox(m_tet);
+
+ for(int i=0; i<4; ++i)
+ {
+ if(ch->neighbor(i)->info().is_outside)
+ m_b.set(i, true);
+
+ m_triangles[i] = triangle(ch->vertex((i+1)& 3)->point(),
+ ch->vertex((i+2)& 3)->point(),
+ ch->vertex((i+3)& 3)->point());
+ m_tbox[i] = bbox(m_triangles[i]);
+ }
+ }
+
+ Tetrahedron_with_outside_info& operator=(const Tetrahedron_with_outside_info& rhs) = default;
+
+ friend std::ostream& operator<<(std::ostream& os, const Tetrahedron_with_outside_info& t)
+ {
+ os << t.m_tet;
+ return os;
+ }
+
+ Tetrahedron_3 m_tet;
+ Bbox_3 m_bbox;
+ std::array m_tbox;
+ std::array m_triangles;
+ std::bitset<4> m_b;
+};
+
+template
+class Ball_3
+ : private K::Sphere_3
+{
+ using FT = typename K::FT;
+ using Point_3 = typename K::Point_3;
+ using Sphere_3 = typename K::Sphere_3;
+
+public:
+ explicit Ball_3(const Sphere_3& s) : Sphere_3(s) { }
+
+public:
+ const Sphere_3& boundary() const { return static_cast(*this); }
+};
+
+template
+class Alpha_wrap_AABB_traits
+ : public GT
+{
+ using Self = Alpha_wrap_AABB_traits;
+
+public:
+ using FT = typename GT::FT;
+ using Point_3 = typename GT::Point_3;
+ using Segment_3 = typename GT::Segment_3;
+ using Triangle_3 = typename GT::Triangle_3;
+ using Ball_3 = internal::Ball_3;
+
+public:
+ Alpha_wrap_AABB_traits(const GT& gt = GT()) : GT(gt) { }
+
+public:
+ class Construct_ball_3
+ {
+ const GT& m_base_traits;
+
+public:
+ Construct_ball_3(const GT& base_traits) : m_base_traits(base_traits) { }
+
+ Ball_3 operator()(const Point_3& p, const FT sqr)
+ {
+ return Ball_3(m_base_traits.construct_sphere_3_object()(p, sqr));
+ }
+ };
+
+ // Enrich the base's Do_intersect_3 with Tetrahedron_with_outside_info and Ball_3 overloads
+ class Do_intersect_3
+ : public GT::Do_intersect_3
+ {
+ using Base = typename GT::Do_intersect_3;
+
+ const GT& m_base_traits;
+
+public:
+ Do_intersect_3(const GT& base_traits)
+ : Base(base_traits.do_intersect_3_object()),
+ m_base_traits(base_traits)
+ { }
+
+ using Base::operator();
+
+ // ======
+ // Ball_3
+
+ bool operator()(const Ball_3& ball,
+ const Point_3& p) const
+ {
+ return !m_base_traits.has_on_unbounded_side_3_object()(ball.boundary(), p);
+ }
+
+ bool operator()(const Ball_3& ball,
+ const Segment_3& s) const
+ {
+ typename GT::Construct_bbox_3 bbox = m_base_traits.construct_bbox_3_object();
+ typename GT::Construct_vertex_3 vertex = m_base_traits.construct_vertex_3_object();
+ typename GT::Has_on_bounded_side_3 has_on_bounded_side = m_base_traits.has_on_bounded_side_3_object();
+
+ if(!do_overlap(bbox(ball.boundary()), bbox(s)))
+ return false;
+
+ if(Base::operator()(ball.boundary(), s))
+ return true;
+
+ return has_on_bounded_side(ball.boundary(), vertex(s, 0));
+ }
+
+ bool operator()(const Ball_3& ball,
+ const Triangle_3& tr) const
+ {
+ typename GT::Construct_bbox_3 bbox = m_base_traits.construct_bbox_3_object();
+ typename GT::Construct_vertex_3 vertex = m_base_traits.construct_vertex_3_object();
+ typename GT::Has_on_bounded_side_3 has_on_bounded_side = m_base_traits.has_on_bounded_side_3_object();
+
+ if(!do_overlap(bbox(ball.boundary()), bbox(tr)))
+ return false;
+
+ if(Base::operator()(ball.boundary(), tr))
+ return true;
+
+ return has_on_bounded_side(ball.boundary(), vertex(tr, 0));
+ }
+
+ bool operator()(const Ball_3& ball,
+ const CGAL::Bbox_3& bb) const
+ {
+ typename GT::Construct_bbox_3 bbox = m_base_traits.construct_bbox_3_object();
+ typename GT::Construct_point_3 point = m_base_traits.construct_point_3_object();
+ typename GT::Has_on_bounded_side_3 has_on_bounded_side = m_base_traits.has_on_bounded_side_3_object();
+
+ if(!do_overlap(bbox(ball.boundary()), bb))
+ return false;
+
+ if(Base::operator()(ball.boundary(), bb))
+ return true;
+
+ const Point_3 bbp = point(bb.xmin(), bb.ymin(), bb.zmin());
+
+ return has_on_bounded_side(ball.boundary(), bbp);
+ }
+
+ // ======
+ // Tetrahedron_with_outside_info
+
+ template
+ bool operator()(const Tetrahedron_with_outside_info& q,
+ const Point_3& p) const
+ {
+ typename GT::Construct_bbox_3 bbox = m_base_traits.construct_bbox_3_object();
+
+ const CGAL::Bbox_3 pbox = bbox(p);
+ if(!do_overlap(q.m_bbox, pbox))
+ return false;
+
+ for(int i=0; i<4; ++i)
+ {
+ if(!q.m_b.test(i) && do_overlap(q.m_tbox[i], pbox) && Base::operator()(q.m_triangles[i], p))
+ return true;
+ }
+
+ return m_base_traits.has_on_bounded_side_3_object()(q.m_tet, p);
+ }
+
+ template
+ bool operator()(const Tetrahedron_with_outside_info& q,
+ const Segment_3& s) const
+ {
+ typename GT::Construct_bbox_3 bbox = m_base_traits.construct_bbox_3_object();
+ typename GT::Construct_vertex_3 vertex = m_base_traits.construct_vertex_3_object();
+
+ const CGAL::Bbox_3 sbox = bbox(s);
+ if(!do_overlap(q.m_bbox, sbox))
+ return false;
+
+ for(int i=0; i<4; ++i)
+ {
+ if(!q.m_b.test(i) && do_overlap(q.m_tbox[i], sbox) && Base::operator()(q.m_triangles[i], s))
+ return true;
+ }
+
+ return m_base_traits.has_on_bounded_side_3_object()(q.m_tet, vertex(s, 0));
+ }
+
+ template
+ bool operator()(const Tetrahedron_with_outside_info& q,
+ const Triangle_3& tr) const
+ {
+ typename GT::Construct_bbox_3 bbox = m_base_traits.construct_bbox_3_object();
+ typename GT::Construct_vertex_3 vertex = m_base_traits.construct_vertex_3_object();
+
+ const CGAL::Bbox_3 tbox = bbox(tr);
+ if(!do_overlap(q.m_bbox, tbox))
+ return false;
+
+ for(int i=0; i<4; ++i)
+ {
+ if(!q.m_b.test(i) && do_overlap(q.m_tbox[i], tbox) && Base::operator()(q.m_triangles[i], tr))
+ return true;
+ }
+
+ return m_base_traits.has_on_bounded_side_3_object()(q.m_tet, vertex(tr, 0));
+ }
+
+ template
+ bool operator()(const Tetrahedron_with_outside_info& q,
+ const CGAL::Bbox_3& bb) const
+ {
+ if(!do_overlap(q.m_bbox, bb))
+ return false;
+
+ for(int i=0; i<4; ++i)
+ {
+ if(!q.m_b.test(i) && do_overlap(q.m_tbox[i], bb) && Base::operator()(q.m_triangles[i], bb))
+ return true;
+ }
+
+ const Point_3 bbp = m_base_traits.construct_point_3_object()(bb.xmin(), bb.ymin(), bb.zmin());
+ return m_base_traits.has_on_bounded_side_3_object()(q.m_tet, bbp);
+ }
+ };
+
+ Construct_ball_3 construct_ball_3_object() const
+ {
+ return Construct_ball_3(static_cast(*this));
+ }
+
+ Do_intersect_3 do_intersect_3_object() const
+ {
+ return Do_intersect_3(static_cast(*this));
+ }
+};
+
+} // namespace internal
+} // namespace Alpha_wraps_3
+} // namespace CGAL
+
+#endif // CGAL_ALPHA_WRAP_3_INTERNAL_ALPHA_WRAP_AABB_TRAITS_H
diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Oracle_base.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Oracle_base.h
new file mode 100644
index 00000000000..6c30360627f
--- /dev/null
+++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Oracle_base.h
@@ -0,0 +1,298 @@
+// Copyright (c) 2019-2022 Copyright holders.
+// All rights reserved.
+//
+// This file is part of the 3D Alpha Wrapping package, which is being prepared for
+// submission to CGAL (www.cgal.org).
+//
+// $URL$
+// $Id$
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// Author(s) : TBA
+//
+#ifndef CGAL_ALPHA_WRAP_3_INTERNAL_ORACLE_BASE_H
+#define CGAL_ALPHA_WRAP_3_INTERNAL_ORACLE_BASE_H
+
+#include
+
+#include
+
+#include
+#include
+
+#include
+#include
+
+namespace CGAL {
+namespace Alpha_wraps_3 {
+namespace internal {
+
+template
+struct Default_traversal_traits
+{
+ using Projection_traits = CGAL::internal::AABB_tree::Projection_traits;
+
+ template
+ using Do_intersect_traits = CGAL::internal::AABB_tree::Do_intersect_traits;
+
+ template
+ using First_intersection_traits = CGAL::internal::AABB_tree::First_intersection_traits;
+};
+
+// Factorize the implementation of the functions calling the AABB tree
+template
+struct AABB_tree_oracle_helper
+{
+ using Self = AABB_tree_oracle_helper;
+
+ using AABB_traits = typename AABBTree::AABB_traits;
+ using GT = typename AABB_traits::Geom_traits;
+
+ using FT = typename AABB_traits::FT;
+ using Point_3 = typename AABB_traits::Point_3;
+
+ template
+ static bool do_intersect(const Query& query,
+ const AABBTree& tree)
+ {
+ CGAL_precondition(!tree.empty());
+
+ using Do_intersect_traits = typename AABBTraversalTraits::template Do_intersect_traits;
+
+ Do_intersect_traits traversal_traits(tree.traits());
+ tree.traversal(query, traversal_traits);
+ return traversal_traits.is_intersection_found();
+ }
+
+ static Point_3 closest_point(const Point_3& p,
+ const AABBTree& tree)
+ {
+ CGAL_precondition(!tree.empty());
+
+ using Projection_traits = typename AABBTraversalTraits::Projection_traits;
+
+ const auto& hint = tree.best_hint(p);
+
+ Projection_traits projection_traits(hint.first, hint.second, tree.traits());
+ tree.traversal(p, projection_traits);
+ return projection_traits.closest_point();
+ }
+
+ static FT squared_distance(const Point_3& p,
+ const AABBTree& tree)
+ {
+ CGAL_precondition(!tree.empty());
+
+ const Point_3 closest = Self::closest_point(p, tree);
+ return tree.traits().squared_distance_object()(p, closest);
+ }
+
+ static bool first_intersection(const Point_3& p, const Point_3& q, Point_3& o,
+ const FT offset_size,
+ const FT intersection_precision,
+ const AABBTree& tree)
+ {
+ CGAL_precondition(!tree.empty());
+
+ using AABB_distance_oracle = internal::AABB_distance_oracle;
+ using Offset_intersection = internal::Offset_intersection;
+
+ AABB_distance_oracle dist_oracle(tree);
+ Offset_intersection offset_intersection(dist_oracle, offset_size, intersection_precision, 1 /*lip*/);
+ return offset_intersection.first_intersection(p, q, o);
+ }
+};
+
+template // base oracle
+class AABB_tree_oracle
+ : public BaseOracle
+{
+protected:
+ using Geom_traits = GT;
+ using FT = typename GT::FT;
+ using Point_3 = typename GT::Point_3;
+
+ // When building oracle stacks, there are copies of (empty) trees, which isn't possible, thus pointer
+ using AABB_tree = AABBTree;
+ using AABB_tree_ptr = std::shared_ptr;
+ using AABB_traits = typename AABB_tree::AABB_traits;
+ using AABB_traversal_traits = typename Default::Get >::type;
+
+ using AABB_helper = AABB_tree_oracle_helper;
+
+public:
+ AABB_tree_oracle(const BaseOracle& base,
+ const GT& gt)
+ : BaseOracle(base),
+ m_gt(gt),
+ m_tree_ptr(std::make_shared())
+ { }
+
+ AABB_tree_oracle(const AABB_tree_oracle&) = default;
+
+public:
+ const Geom_traits& geom_traits() const { return m_gt; }
+
+ AABB_tree& tree() { return *m_tree_ptr; }
+ const AABB_tree& tree() const { return *m_tree_ptr; }
+ BaseOracle& base() { return static_cast(*this); }
+ const BaseOracle& base() const { return static_cast(*this); }
+
+public:
+ typename AABB_tree::Bounding_box bbox() const
+ {
+ CGAL_precondition(!tree().empty());
+
+ return base().bbox() + tree().bbox();
+ }
+
+ template
+ bool do_intersect(const T& t) const
+ {
+ if(base().do_intersect(t))
+ return true;
+
+ return AABB_helper::do_intersect(t, tree());
+ }
+
+ FT squared_distance(const Point_3& p) const
+ {
+ const FT base_sqd = base().squared_distance(p);
+
+ // @speed could do a smarter traversal, no need to search deeper than the current best
+ const FT this_sqd = AABB_helper::squared_distance(p, tree());
+
+ return (std::min)(base_sqd, this_sqd);
+ }
+
+ Point_3 closest_point(const Point_3& p) const
+ {
+ const Point_3 base_c = base().closest_point(p);
+
+ // @speed could do a smarter traversal, no need to search deeper than the current best
+ const Point_3 this_c = AABB_helper::closest_point(p, tree());
+
+ return (compare_distance_to_point(p, base_c, this_c) == CGAL::SMALLER) ? base_c : this_c;
+ }
+
+ bool first_intersection(const Point_3& p, const Point_3& q,
+ Point_3& o,
+ const FT offset_size,
+ const FT intersection_precision) const
+ {
+ Point_3 base_o;
+ bool base_b = base().first_intersection(p, q, base_o, offset_size, intersection_precision);
+
+ if(base_b)
+ {
+ // @speed could do a smarter traversal, no need to search deeper than the current best
+ Point_3 this_o;
+ bool this_b = AABB_helper::first_intersection(p, q, this_o, offset_size, intersection_precision, tree());
+ if(this_b)
+ o = (compare_distance_to_point(p, base_o, this_o) == SMALLER) ? base_o : this_o;
+ else
+ o = base_o;
+
+ return true;
+ }
+ else
+ {
+ return AABB_helper::first_intersection(p, q, o, offset_size, intersection_precision, tree());
+ }
+ }
+
+ bool first_intersection(const Point_3& p, const Point_3& q,
+ Point_3& o,
+ const FT offset_size) const
+ {
+ return first_intersection(p, q, o, offset_size, 1e-2 * offset_size);
+ }
+
+protected:
+ Geom_traits m_gt;
+ AABB_tree_ptr m_tree_ptr;
+};
+
+// partial specialization, when there is no further oracle beneath in the stack.
+//
+// `int` is used to denote the absence of base rather than `void`,
+// as to use the same constructor for both versions (thus requires a default construction)
+template
+class AABB_tree_oracle
+{
+protected:
+ using Geom_traits = GT;
+ using FT = typename GT::FT;
+ using Point_3 = typename GT::Point_3;
+
+ using AABB_tree = AABBTree;
+ using AABB_tree_ptr = std::shared_ptr;
+ using AABB_traits = typename AABB_tree::AABB_traits;
+ using AABB_traversal_traits = typename Default::Get >::type;
+
+ using AABB_helper = AABB_tree_oracle_helper;
+
+public:
+ AABB_tree_oracle(const int, // to have a common constructor API between both versions
+ const GT& gt)
+ : m_gt(gt), m_tree_ptr(std::make_shared())
+ { }
+
+public:
+ const Geom_traits& geom_traits() const { return m_gt; }
+ AABB_tree& tree() { return *m_tree_ptr; }
+ const AABB_tree& tree() const { return *m_tree_ptr; }
+
+public:
+ typename AABB_tree::Bounding_box bbox() const
+ {
+ CGAL_precondition(!tree().empty());
+
+ return tree().bbox();
+ }
+
+ template
+ bool do_intersect(const T& t) const
+ {
+ return AABB_helper::do_intersect(t, tree());
+ }
+
+ FT squared_distance(const Point_3& p) const
+ {
+ return AABB_helper::squared_distance(p, tree());
+ }
+
+ Point_3 closest_point(const Point_3& p) const
+ {
+ return AABB_helper::closest_point(p, tree());
+ }
+
+ bool first_intersection(const Point_3& p, const Point_3& q, Point_3& o,
+ const FT offset_size, const FT intersection_precision) const
+ {
+ return AABB_helper::first_intersection(p, q, o, offset_size, intersection_precision, tree());
+ }
+
+ bool first_intersection(const Point_3& p, const Point_3& q, Point_3& o, const FT offset_size) const
+ {
+ return AABB_helper::first_intersection(p, q, o, offset_size, 1e-2 * offset_size, tree());
+ }
+
+private:
+ Geom_traits m_gt;
+ AABB_tree_ptr m_tree_ptr;
+};
+
+} // namespace internal
+} // namespace Alpha_wraps_3
+} // namespace CGAL
+
+#endif // CGAL_ALPHA_WRAP_3_INTERNAL_ORACLE_BASE_H
diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Point_set_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Point_set_oracle.h
new file mode 100644
index 00000000000..9471e91d5df
--- /dev/null
+++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Point_set_oracle.h
@@ -0,0 +1,138 @@
+// Copyright (c) 2019-2022 Copyright holders.
+// All rights reserved.
+//
+// This file is part of the 3D Alpha Wrapping package, which is being prepared for
+// submission to CGAL (www.cgal.org).
+//
+// $URL$
+// $Id$
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// Author(s) : TBA
+//
+#ifndef CGAL_ALPHA_WRAP_3_INTERNAL_POINT_SET_ORACLE_H
+#define CGAL_ALPHA_WRAP_3_INTERNAL_POINT_SET_ORACLE_H
+
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+#include
+
+namespace CGAL {
+namespace Alpha_wraps_3 {
+namespace internal {
+
+// No longer used, but might find some purpose again in the future
+template
+struct Point_from_iterator_map
+{
+ using key_type = InputIterator;
+ using value_type = typename boost::property_traits::value_type;
+ using reference = typename boost::property_traits::reference;
+ using category = boost::readable_property_map_tag;
+
+ Point_from_iterator_map(const PM& pm = PM()) : pm(pm) { }
+
+ inline friend reference get(const Point_from_iterator_map& map, const key_type it)
+ {
+ return get(map.pm, *it);
+ }
+
+ PM pm;
+};
+
+// Just some typedefs for readability
+template
+struct PS_oracle_traits
+{
+ using Point = typename boost::range_value::type;
+ using Default_GT = typename Kernel_traits::Kernel;
+ using Base_GT = typename Default::Get::type; // = Kernel, usually
+ using Geom_traits = Alpha_wrap_AABB_traits; // Wrap the kernel to add Ball_3 + custom Do_intersect_3
+
+ using PR_iterator = typename PointRange::const_iterator;
+ using Primitive = AABB_primitive /*DPM*/,
+ Input_iterator_property_map /*RPM*/,
+ CGAL::Tag_false, // not external
+ CGAL::Tag_false>; // no caching
+
+ using AABB_traits = CGAL::AABB_traits;
+ using AABB_tree = CGAL::AABB_tree;
+};
+
+template
+class Point_set_oracle
+ : public AABB_tree_oracle::Geom_traits,
+ typename PS_oracle_traits::AABB_tree,
+ CGAL::Default, // Default_traversal_traits
+ BaseOracle>
+{
+ using PSOT = PS_oracle_traits;
+ using Base_GT = typename PSOT::Base_GT;
+
+public:
+ using Geom_traits = typename PSOT::Geom_traits;
+
+private:
+ using AABB_tree = typename PSOT::AABB_tree;
+ using Oracle_base = AABB_tree_oracle;
+
+public:
+ // Constructors
+ Point_set_oracle()
+ : Oracle_base(BaseOracle(), Base_GT())
+ { }
+
+ Point_set_oracle(const BaseOracle& base_oracle,
+ const Base_GT& gt = Base_GT())
+ : Oracle_base(base_oracle, gt)
+ { }
+
+ Point_set_oracle(const Base_GT& gt,
+ const BaseOracle& base_oracle = BaseOracle())
+ : Oracle_base(base_oracle, gt)
+ { }
+
+public:
+ // adds a range of points to the oracle
+ template
+ void add_point_set(const PointRange& points,
+ const NamedParameters& /*np*/ = CGAL::parameters::default_values())
+ {
+ if(points.empty())
+ {
+#ifdef CGAL_AW3_DEBUG
+ std::cout << "Warning: Input is empty " << std::endl;
+#endif
+ return;
+ }
+
+#ifdef CGAL_AW3_DEBUG
+ std::cout << "Insert into AABB tree (points)..." << std::endl;
+#endif
+
+ this->tree().insert(points.begin(), points.end());
+ }
+};
+
+} // namespace internal
+} // namespace Alpha_wraps_3
+} // namespace CGAL
+
+#endif // CGAL_ALPHA_WRAP_3_INTERNAL_POINT_SET_ORACLE_H
diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h
new file mode 100644
index 00000000000..8f60513ebc2
--- /dev/null
+++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h
@@ -0,0 +1,119 @@
+// Copyright (c) 2019-2022 Copyright holders.
+// All rights reserved.
+//
+// This file is part of the 3D Alpha Wrapping package, which is being prepared for
+// submission to CGAL (www.cgal.org).
+//
+// $URL$
+// $Id$
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// Author(s) : TBA
+//
+#ifndef CGAL_ALPHA_WRAP_3_INTERNAL_SEGMENT_SOUP_ORACLE_H
+#define CGAL_ALPHA_WRAP_3_INTERNAL_SEGMENT_SOUP_ORACLE_H
+
+#include
+
+#include
+#include
+
+#include