mirror of https://github.com/CGAL/cgal
misc fixes
This commit is contained in:
parent
525338eec2
commit
97097f1f04
|
|
@ -41,7 +41,7 @@ and `is_facet_visited(1)` in parallel must be safe)
|
||||||
Moreover, the parallel algorithms require an erase counter in
|
Moreover, the parallel algorithms require an erase counter in
|
||||||
each cell (see below).
|
each cell (see below).
|
||||||
|
|
||||||
\cgalRefines{SimplicialMeshCellBase_3,RegularTriangulationCellBaseWithWeightedCircumcenter_3,CopyConstructible}
|
\cgalRefines{SimplicialMeshCellBase_3,RegularTriangulationCellBaseWithWeightedCircumcenter_3}
|
||||||
|
|
||||||
\cgalHasModel `CGAL::Compact_mesh_cell_base_3<GT,MD,Tds>`
|
\cgalHasModel `CGAL::Compact_mesh_cell_base_3<GT,MD,Tds>`
|
||||||
\cgalHasModel `CGAL::Mesh_cell_base_3<GT,MD,Cb>`
|
\cgalHasModel `CGAL::Mesh_cell_base_3<GT,MD,Cb>`
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,6 @@ with a model of the concept `BisectionGeometricTraits_3`.
|
||||||
\tparam Image_word_type is the data type encoded in the `Image`
|
\tparam Image_word_type is the data type encoded in the `Image`
|
||||||
input file
|
input file
|
||||||
|
|
||||||
|
|
||||||
\cgalModels `MeshDomain_3`
|
\cgalModels `MeshDomain_3`
|
||||||
|
|
||||||
\sa `BisectionGeometricTraits_3`
|
\sa `BisectionGeometricTraits_3`
|
||||||
|
|
@ -149,13 +148,12 @@ public:
|
||||||
CGAL_assertion(transform(value_outside) == 0);
|
CGAL_assertion(transform(value_outside) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Destructor
|
// Destructor
|
||||||
virtual ~Gray_image_mesh_domain_3() {}
|
virtual ~Gray_image_mesh_domain_3() {}
|
||||||
}; // end class Gray_image_mesh_domain_3
|
};
|
||||||
|
|
||||||
} // end namespace CGAL
|
} // namespace CGAL
|
||||||
|
|
||||||
#include <CGAL/enable_warnings.h>
|
#include <CGAL/enable_warnings.h>
|
||||||
|
|
||||||
|
|
||||||
#endif // CGAL_GRAY_IMAGE_MESH_DOMAIN_3_H
|
#endif // CGAL_GRAY_IMAGE_MESH_DOMAIN_3_H
|
||||||
|
|
|
||||||
|
|
@ -157,15 +157,17 @@ For example, the multidomain described by the three functions [f1,f2,f3] and the
|
||||||
The first one matches the locus of points satisfying f1(p)<0 and f2(p)<0 and f3(p)>0.<br />
|
The first one matches the locus of points satisfying f1(p)<0 and f2(p)<0 and f3(p)>0.<br />
|
||||||
The second one matches the locus of points satisfying f1(p)>0 and f2(p)<0 and f3(p)>0.<br />
|
The second one matches the locus of points satisfying f1(p)>0 and f2(p)<0 and f3(p)>0.<br />
|
||||||
|
|
||||||
\tparam ImplicitFunction provides the definition of the function.
|
\tparam Function provides the definition of the function.
|
||||||
This parameter stands for a model of the concept `ImplicitFunction` described in the surface mesh generation package.
|
This parameter stands for a model of the concept `ImplicitFunction` described in the surface mesh generation package.
|
||||||
The number types `ImplicitFunction::FT` and `BGT::FT` are required to match.
|
The number types `Function::FT` and `BGT::FT` are required to match.
|
||||||
|
|
||||||
\sa `CGAL::Labeled_mesh_domain_3`.
|
\sa `CGAL::Labeled_mesh_domain_3`.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
#ifdef DOXYGEN_RUNNING
|
||||||
|
template <class Function>
|
||||||
|
#else
|
||||||
template <class ImplicitFunction>
|
template <class ImplicitFunction>
|
||||||
|
#endif
|
||||||
class Implicit_multi_domain_to_labeling_function_wrapper
|
class Implicit_multi_domain_to_labeling_function_wrapper
|
||||||
{
|
{
|
||||||
template <class T_>
|
template <class T_>
|
||||||
|
|
@ -184,20 +186,20 @@ class Implicit_multi_domain_to_labeling_function_wrapper
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef int return_type;
|
|
||||||
typedef ImplicitFunction Function;
|
|
||||||
typedef typename Implicit_function_traits<ImplicitFunction>::Point Point_3;
|
|
||||||
|
|
||||||
/// \name Types
|
/// \name Types
|
||||||
/// @{
|
/// @{
|
||||||
//!
|
|
||||||
typedef std::vector<Function> Function_vector;
|
|
||||||
#ifdef DOXYGEN_RUNNING
|
|
||||||
//!
|
|
||||||
typedef typename Function::Point Point_3;
|
|
||||||
#endif
|
|
||||||
/// @}
|
|
||||||
|
|
||||||
|
#ifdef DOXYGEN_RUNNING
|
||||||
|
typedef typename Function::Point Point_3;
|
||||||
|
#else
|
||||||
|
typedef ImplicitFunction Function;
|
||||||
|
typedef typename Implicit_function_traits<Function>::Point Point_3;
|
||||||
|
typedef int return_type;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef std::vector<Function> Function_vector;
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<Function> funcs;
|
std::vector<Function> funcs;
|
||||||
|
|
@ -205,15 +207,15 @@ private:
|
||||||
std::vector<Bmask> bmasks;
|
std::vector<Bmask> bmasks;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
/// \name Creation
|
/// \name Creation
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Construction from a vector of implicit functions and a vector of vector of signs.
|
* \brief Construction from a vector of implicit functions and a vector of vector of signs.
|
||||||
|
*
|
||||||
* \param implicit_functions the vector of implicit functions.
|
* \param implicit_functions the vector of implicit functions.
|
||||||
* \param position_vectors the vector of vector of signs. Each vector of positions describes a component.
|
* \param position_vectors the vector of vector of signs. Each vector of positions describes a component.
|
||||||
|
*
|
||||||
* \sa `Sign`
|
* \sa `Sign`
|
||||||
*/
|
*/
|
||||||
Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& implicit_functions, const std::vector<std::vector<Sign> >& position_vectors)
|
Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& implicit_functions, const std::vector<std::vector<Sign> >& position_vectors)
|
||||||
|
|
@ -246,6 +248,7 @@ public:
|
||||||
}
|
}
|
||||||
/*!
|
/*!
|
||||||
* \brief Construction from a vector of implicit functions.
|
* \brief Construction from a vector of implicit functions.
|
||||||
|
|
||||||
* \param implicit_functions the vector of implicit functions.
|
* \param implicit_functions the vector of implicit functions.
|
||||||
*
|
*
|
||||||
* Position vectors are built automatically so that the union of components equals the union of the functions.
|
* Position vectors are built automatically so that the union of components equals the union of the functions.
|
||||||
|
|
@ -278,6 +281,7 @@ public:
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Construction from a vector of implicit functions and a vector of strings.
|
* \brief Construction from a vector of implicit functions and a vector of strings.
|
||||||
|
*
|
||||||
* \param implicit_functions the vector of implicit functions.
|
* \param implicit_functions the vector of implicit functions.
|
||||||
* \param position_strings the vector of strings. The strings contained in this vector must contain '+' or '-' only. Each string (vector of positions) describes a component.
|
* \param position_strings the vector of strings. The strings contained in this vector must contain '+' or '-' only. Each string (vector of positions) describes a component.
|
||||||
*/
|
*/
|
||||||
|
|
@ -339,8 +343,6 @@ public:
|
||||||
|
|
||||||
} // end namespace CGAL
|
} // end namespace CGAL
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(BOOST_MSVC)
|
#if defined(BOOST_MSVC)
|
||||||
# pragma warning(pop)
|
# pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -336,7 +336,9 @@ Let `p` be a Point.
|
||||||
`CGAL::Implicit_multi_domain_to_labeling_function_wrapper` is a good candidate for this template parameter
|
`CGAL::Implicit_multi_domain_to_labeling_function_wrapper` is a good candidate for this template parameter
|
||||||
if there are several components to mesh.
|
if there are several components to mesh.
|
||||||
|
|
||||||
The function type can be any model of the concept `Callable` compatible with the signature `Subdomain_index(const Point_3&)`: it can be a function, a function object, a lambda expression... that takes a `%Point_3` as argument, and returns a type convertible to `Subdomain_index`.
|
The function type can be any model of the concept `Callable` compatible with the signature
|
||||||
|
`Subdomain_index(const %Point_3&)`: it can be a function, a function object, a lambda expression...
|
||||||
|
that takes a `%Point_3` as argument, and returns a type convertible to `Subdomain_index`.
|
||||||
|
|
||||||
\cgalModels `MeshDomain_3`
|
\cgalModels `MeshDomain_3`
|
||||||
|
|
||||||
|
|
@ -350,7 +352,7 @@ template<class BGT,
|
||||||
Subdomain_index_> >
|
Subdomain_index_> >
|
||||||
class Labeled_mesh_domain_3
|
class Labeled_mesh_domain_3
|
||||||
#ifndef DOXYGEN_RUNNING
|
#ifndef DOXYGEN_RUNNING
|
||||||
: protected details::Labeled_mesh_domain_3_impl<BGT,
|
: protected details::Labeled_mesh_domain_3_impl<BGT,
|
||||||
Subdomain_index_,
|
Subdomain_index_,
|
||||||
Surface_patch_index_>
|
Surface_patch_index_>
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -381,7 +383,7 @@ public:
|
||||||
/// The number type (a field type) of the geometric traits class
|
/// The number type (a field type) of the geometric traits class
|
||||||
typedef typename Geom_traits::FT FT;
|
typedef typename Geom_traits::FT FT;
|
||||||
///@}
|
///@}
|
||||||
#else
|
#else // DOXYGEN_RUNNING
|
||||||
typedef boost::optional<Subdomain_index> Subdomain;
|
typedef boost::optional<Subdomain_index> Subdomain;
|
||||||
|
|
||||||
// Type of indexes for cells of the input complex
|
// Type of indexes for cells of the input complex
|
||||||
|
|
@ -428,7 +430,7 @@ public:
|
||||||
typedef typename BGT::FT FT;
|
typedef typename BGT::FT FT;
|
||||||
typedef BGT Geom_traits;
|
typedef BGT Geom_traits;
|
||||||
using Impl_details::construct_pair_functor;
|
using Impl_details::construct_pair_functor;
|
||||||
#endif
|
#endif // DOXYGEN_RUNNING
|
||||||
|
|
||||||
/// \name Creation
|
/// \name Creation
|
||||||
/// @{
|
/// @{
|
||||||
|
|
@ -451,16 +453,19 @@ public:
|
||||||
* \cgalParamDefault{FT(1e-3)}
|
* \cgalParamDefault{FT(1e-3)}
|
||||||
* \cgalParamNEnd
|
* \cgalParamNEnd
|
||||||
* \cgalNamedParamsEnd
|
* \cgalNamedParamsEnd
|
||||||
|
*
|
||||||
* \cgalHeading{Example}
|
* \cgalHeading{Example}
|
||||||
* From the example (\ref Mesh_3/mesh_implicit_domains_2.cpp):
|
* From the example (\ref Mesh_3/mesh_implicit_domains_2.cpp):
|
||||||
* \snippet Mesh_3/mesh_implicit_domains_2.cpp Domain creation
|
* \snippet Mesh_3/mesh_implicit_domains_2.cpp Domain creation
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
template<typename Function, typename Bounding_object, typename CGAL_NP_TEMPLATE_PARAMETERS>
|
template<typename Function, typename Bounding_object, typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||||
Labeled_mesh_domain_3(const Function& function,
|
Labeled_mesh_domain_3(const Function& function,
|
||||||
const Bounding_object& bounding_object,
|
const Bounding_object& bounding_object,
|
||||||
const CGAL_NP_CLASS& np = parameters::default_values(),
|
const CGAL_NP_CLASS& np = parameters::default_values()
|
||||||
typename std::enable_if<!is_named_function_parameter<Function>>::type* = nullptr)
|
#ifndef DOXYGEN_RUNNING
|
||||||
|
, typename std::enable_if<!is_named_function_parameter<Function>>::type* = nullptr
|
||||||
|
#endif // DOXYGEN_RUNNING
|
||||||
|
)
|
||||||
:Impl_details(function,
|
:Impl_details(function,
|
||||||
bounding_object,
|
bounding_object,
|
||||||
parameters::choose_parameter(parameters::get_parameter(np, internal_np::error_bound), FT(1e-3)),
|
parameters::choose_parameter(parameters::get_parameter(np, internal_np::error_bound), FT(1e-3)),
|
||||||
|
|
@ -496,7 +501,7 @@ public:
|
||||||
template<typename Function, typename Bounding_object>
|
template<typename Function, typename Bounding_object>
|
||||||
#if !defined(BOOST_MSVC)
|
#if !defined(BOOST_MSVC)
|
||||||
CGAL_DEPRECATED
|
CGAL_DEPRECATED
|
||||||
#endif
|
#endif // BOOST_MSVC
|
||||||
Labeled_mesh_domain_3(const Function& function,
|
Labeled_mesh_domain_3(const Function& function,
|
||||||
const Bounding_object& bounding_object,
|
const Bounding_object& bounding_object,
|
||||||
double error_bound,
|
double error_bound,
|
||||||
|
|
@ -505,8 +510,8 @@ public:
|
||||||
bounding_object,
|
bounding_object,
|
||||||
parameters::relative_error_bound(error_bound))
|
parameters::relative_error_bound(error_bound))
|
||||||
{}
|
{}
|
||||||
#endif
|
#endif // CGAL_NO_DEPRECATED_CODE
|
||||||
#endif
|
#endif // DOXYGEN_RUNNING
|
||||||
|
|
||||||
/// \name Creation of domains from 3D images
|
/// \name Creation of domains from 3D images
|
||||||
/// @{
|
/// @{
|
||||||
|
|
|
||||||
|
|
@ -125,15 +125,14 @@ of the concept `RegularTriangulationCellBaseWithWeightedCircumcenter_3` and defa
|
||||||
\sa `CGAL::Compact_mesh_cell_base_3<GT, MD, Tds>`
|
\sa `CGAL::Compact_mesh_cell_base_3<GT, MD, Tds>`
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template< class GT,
|
template<class GT,
|
||||||
class MD,
|
class MD,
|
||||||
class Cb= CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3<
|
class Cb = CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3<
|
||||||
GT, CGAL::Regular_triangulation_cell_base_3<GT> > >
|
GT, CGAL::Regular_triangulation_cell_base_3<GT> > >
|
||||||
class Mesh_cell_base_3
|
class Mesh_cell_base_3
|
||||||
: public Mesh_3::Mesh_surface_cell_base_3<GT, MD, Cb>
|
|
||||||
#ifndef DOXYGEN_RUNNING
|
#ifndef DOXYGEN_RUNNING
|
||||||
, public Mesh_cell_base_3_base<
|
: public Mesh_3::Mesh_surface_cell_base_3<GT, MD, Cb>,
|
||||||
typename Mesh_3::Mesh_surface_cell_base_3<GT, MD, Cb>::Tds::Concurrency_tag>
|
public Mesh_cell_base_3_base<typename Mesh_3::Mesh_surface_cell_base_3<GT, MD, Cb>::Tds::Concurrency_tag>
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
typedef typename GT::FT FT;
|
typedef typename GT::FT FT;
|
||||||
|
|
@ -163,7 +162,6 @@ public:
|
||||||
typedef Mesh_cell_base_3 <GT, MD, Cb3> Other;
|
typedef Mesh_cell_base_3 <GT, MD, Cb3> Other;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Constructors
|
|
||||||
Mesh_cell_base_3()
|
Mesh_cell_base_3()
|
||||||
: Base()
|
: Base()
|
||||||
, subdomain_index_()
|
, subdomain_index_()
|
||||||
|
|
@ -225,6 +223,9 @@ public:
|
||||||
bool is_cache_valid() const { return sliver_cache_validity_; }
|
bool is_cache_valid() const { return sliver_cache_validity_; }
|
||||||
void reset_cache_validity() const { sliver_cache_validity_ = false; }
|
void reset_cache_validity() const { sliver_cache_validity_ = false; }
|
||||||
|
|
||||||
|
/// \name I/O
|
||||||
|
///@{
|
||||||
|
|
||||||
static
|
static
|
||||||
std::string io_signature()
|
std::string io_signature()
|
||||||
{
|
{
|
||||||
|
|
@ -233,6 +234,8 @@ public:
|
||||||
+ Get_io_signature<Base>()();
|
+ Get_io_signature<Base>()();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
|
||||||
#ifdef CGAL_INTRUSIVE_LIST
|
#ifdef CGAL_INTRUSIVE_LIST
|
||||||
public:
|
public:
|
||||||
Cell_handle next_intrusive() const { return next_intrusive_; }
|
Cell_handle next_intrusive() const { return next_intrusive_; }
|
||||||
|
|
@ -248,8 +251,9 @@ public:
|
||||||
}
|
}
|
||||||
#endif // CGAL_INTRUSIVE_LIST
|
#endif // CGAL_INTRUSIVE_LIST
|
||||||
|
|
||||||
/// For the determinism of Compact_container iterators
|
/// \name Determinism
|
||||||
///@{
|
///@{
|
||||||
|
|
||||||
typedef Tag_true Has_timestamp;
|
typedef Tag_true Has_timestamp;
|
||||||
|
|
||||||
std::size_t time_stamp() const {
|
std::size_t time_stamp() const {
|
||||||
|
|
@ -258,6 +262,7 @@ public:
|
||||||
void set_time_stamp(const std::size_t& ts) {
|
void set_time_stamp(const std::size_t& ts) {
|
||||||
time_stamp_ = ts;
|
time_stamp_ = ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
///@}
|
///@}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -44,9 +44,7 @@ and a sizing field which may be a uniform or variable field.
|
||||||
\sa `MeshCriteria_3`
|
\sa `MeshCriteria_3`
|
||||||
\sa `CGAL::Mesh_criteria_3<Tr>`
|
\sa `CGAL::Mesh_criteria_3<Tr>`
|
||||||
\sa `CGAL::make_mesh_3()`
|
\sa `CGAL::make_mesh_3()`
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template <typename Tr
|
template <typename Tr
|
||||||
#ifndef DOXYGEN_RUNNING
|
#ifndef DOXYGEN_RUNNING
|
||||||
,typename Visitor_ = Mesh_3::Cell_criterion_visitor_with_radius_lower_bound<Tr>
|
,typename Visitor_ = Mesh_3::Cell_criterion_visitor_with_radius_lower_bound<Tr>
|
||||||
|
|
@ -63,6 +61,8 @@ public:
|
||||||
*/
|
*/
|
||||||
typedef typename Tr::Geom_traits::FT FT;
|
typedef typename Tr::Geom_traits::FT FT;
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
|
||||||
typedef Visitor_ Visitor;
|
typedef Visitor_ Visitor;
|
||||||
typedef typename Visitor::Cell_quality Cell_quality;
|
typedef typename Visitor::Cell_quality Cell_quality;
|
||||||
typedef typename Visitor::Is_cell_bad Is_cell_bad;
|
typedef typename Visitor::Is_cell_bad Is_cell_bad;
|
||||||
|
|
@ -75,8 +75,6 @@ private:
|
||||||
|
|
||||||
typedef Mesh_cell_criteria_3<Tr> Self;
|
typedef Mesh_cell_criteria_3<Tr> Self;
|
||||||
|
|
||||||
/// @}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// \name Creation
|
/// \name Creation
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ public:
|
||||||
Polyline() {}
|
Polyline() {}
|
||||||
~Polyline() {}
|
~Polyline() {}
|
||||||
|
|
||||||
/// Add a point at the end of the polyline
|
/// adds a point at the end of the polyline
|
||||||
void add_point(const Point_3& p)
|
void add_point(const Point_3& p)
|
||||||
{
|
{
|
||||||
if( points_.empty() || p != end_point() ) {
|
if( points_.empty() || p != end_point() ) {
|
||||||
|
|
@ -70,27 +70,27 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the starting point of the polyline
|
/// returns the starting point of the polyline
|
||||||
const Point_3& start_point() const
|
const Point_3& start_point() const
|
||||||
{
|
{
|
||||||
CGAL_assertion( ! points_.empty() );
|
CGAL_assertion( ! points_.empty() );
|
||||||
return points_.front();
|
return points_.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the ending point of the polyline
|
/// returns the ending point of the polyline
|
||||||
const Point_3& end_point() const
|
const Point_3& end_point() const
|
||||||
{
|
{
|
||||||
CGAL_assertion( ! points_.empty() );
|
CGAL_assertion( ! points_.empty() );
|
||||||
return points_.back();
|
return points_.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if the polyline is not degenerated
|
/// returns `true` if the polyline is not degenerated
|
||||||
bool is_valid() const
|
bool is_valid() const
|
||||||
{
|
{
|
||||||
return points_.size() > 1;
|
return points_.size() > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if polyline is a loop
|
/// returns `true` if polyline is a loop
|
||||||
bool is_loop() const
|
bool is_loop() const
|
||||||
{
|
{
|
||||||
return start_point() == end_point();
|
return start_point() == end_point();
|
||||||
|
|
@ -201,7 +201,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Returns the angle at the first point.
|
/// returns the angle at the first point.
|
||||||
/// \pre The polyline must be a loop.
|
/// \pre The polyline must be a loop.
|
||||||
Angle angle_at_first_point() const {
|
Angle angle_at_first_point() const {
|
||||||
CGAL_precondition(is_loop());
|
CGAL_precondition(is_loop());
|
||||||
|
|
@ -211,7 +211,7 @@ public:
|
||||||
return angle(prev, first, next_p);
|
return angle(prev, first, next_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the length of the polyline
|
/// returns the length of the polyline
|
||||||
FT length() const
|
FT length() const
|
||||||
{
|
{
|
||||||
//TODO: cache result
|
//TODO: cache result
|
||||||
|
|
@ -227,7 +227,7 @@ public:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns signed geodesic distance between `p` and `q`.
|
/// returns signed geodesic distance between `p` and `q`.
|
||||||
FT signed_geodesic_distance(const Point_3& p, const Point_3& q) const
|
FT signed_geodesic_distance(const Point_3& p, const Point_3& q) const
|
||||||
{
|
{
|
||||||
// Locate p & q on polyline
|
// Locate p & q on polyline
|
||||||
|
|
@ -259,7 +259,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Returns a point at geodesic distance `distance` from p along the
|
/// returns a point at geodesic distance `distance` from p along the
|
||||||
/// polyline. The polyline is oriented from starting point to end point.
|
/// polyline. The polyline is oriented from starting point to end point.
|
||||||
/// The distance could be negative.
|
/// The distance could be negative.
|
||||||
Point_3 point_at(const Point_3& p, FT distance) const
|
Point_3 point_at(const Point_3& p, FT distance) const
|
||||||
|
|
@ -332,7 +332,7 @@ private:
|
||||||
return (points_.end() - 2);
|
return (points_.end() - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns an iterator on the starting point of the segment of the
|
/// returns an iterator on the starting point of the segment of the
|
||||||
/// polyline which contains p
|
/// polyline which contains p
|
||||||
/// if end_point_first is true, then --end is returned instead of begin
|
/// if end_point_first is true, then --end is returned instead of begin
|
||||||
/// if p is the starting point of a loop.
|
/// if p is the starting point of a loop.
|
||||||
|
|
@ -523,18 +523,14 @@ features into any model of the `MeshDomain_3` concept.
|
||||||
The 1-dimensional features are described as polylines
|
The 1-dimensional features are described as polylines
|
||||||
whose endpoints are the added corners.
|
whose endpoints are the added corners.
|
||||||
|
|
||||||
\tparam MD is the type
|
\tparam MD is the type of the domain which is extended. It has to be a model of the `MeshDomain_3` concept.
|
||||||
of the domain which should be extended.
|
|
||||||
It has to be a model of the `MeshDomain_3` concept.
|
|
||||||
|
|
||||||
\cgalModels `MeshDomainWithFeatures_3`
|
\cgalModels `MeshDomainWithFeatures_3`
|
||||||
|
|
||||||
\sa `MeshDomain_3`
|
|
||||||
\sa `MeshPolyline_3`
|
\sa `MeshPolyline_3`
|
||||||
\sa `CGAL::Implicit_mesh_domain_3<Function,BGT>`
|
\sa `CGAL::Implicit_mesh_domain_3<Function,BGT>`
|
||||||
\sa `CGAL::Polyhedral_mesh_domain_3<Polyhedron,IGT>`
|
\sa `CGAL::Polyhedral_mesh_domain_3<Polyhedron,IGT>`
|
||||||
\sa `CGAL::Labeled_image_mesh_domain_3<Image,BGT>`
|
\sa `CGAL::Labeled_image_mesh_domain_3<Image,BGT>`
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template < typename MD >
|
template < typename MD >
|
||||||
class Mesh_domain_with_polyline_features_3
|
class Mesh_domain_with_polyline_features_3
|
||||||
|
|
@ -543,8 +539,9 @@ class Mesh_domain_with_polyline_features_3
|
||||||
typedef Mesh_domain_with_polyline_features_3<MD> Self;
|
typedef Mesh_domain_with_polyline_features_3<MD> Self;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// \name Types
|
/// \name Types
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
typedef typename MD::Surface_patch_index Surface_patch_index;
|
typedef typename MD::Surface_patch_index Surface_patch_index;
|
||||||
typedef typename MD::Subdomain_index Subdomain_index;
|
typedef typename MD::Subdomain_index Subdomain_index;
|
||||||
typedef int Curve_index;
|
typedef int Curve_index;
|
||||||
|
|
@ -562,24 +559,21 @@ public:
|
||||||
|
|
||||||
typedef CGAL::Tag_true Has_features;
|
typedef CGAL::Tag_true Has_features;
|
||||||
typedef typename MD::R::FT FT;
|
typedef typename MD::R::FT FT;
|
||||||
/// @}
|
|
||||||
|
|
||||||
#ifndef DOXYGEN_RUNNING
|
/// @}
|
||||||
|
|
||||||
#ifndef CGAL_NO_DEPRECATED_CODE
|
#ifndef CGAL_NO_DEPRECATED_CODE
|
||||||
typedef Curve_index Curve_segment_index;
|
typedef Curve_index Curve_segment_index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef typename MD::R Gt;
|
typedef typename MD::R GT;
|
||||||
typedef Gt R;
|
typedef GT R;
|
||||||
typedef typename MD::Point_3 Point_3;
|
typedef typename MD::Point_3 Point_3;
|
||||||
#endif // DOXYGEN_RUNNING
|
|
||||||
|
|
||||||
/// \name Creation
|
/// \name Creation
|
||||||
/// Constructors. Forwards the arguments to the constructor
|
/// @{
|
||||||
/// of the base class.
|
|
||||||
/// @{
|
|
||||||
|
|
||||||
|
// forwards the arguments to the constructor of the base class.
|
||||||
template <typename ... T>
|
template <typename ... T>
|
||||||
Mesh_domain_with_polyline_features_3(const T& ...o)
|
Mesh_domain_with_polyline_features_3(const T& ...o)
|
||||||
: MD(o...)
|
: MD(o...)
|
||||||
|
|
@ -589,15 +583,14 @@ public:
|
||||||
|
|
||||||
Mesh_domain_with_polyline_features_3(const Mesh_domain_with_polyline_features_3&) = default;
|
Mesh_domain_with_polyline_features_3(const Mesh_domain_with_polyline_features_3&) = default;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
/// \name Operations
|
/// \name Operations
|
||||||
/// @{
|
|
||||||
|
|
||||||
/// @cond DEVELOPERS
|
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/// Add a 0-dimensional feature in the domain.
|
/// @cond DEVELOPERS
|
||||||
|
|
||||||
|
/// adds a 0-dimensional feature in the domain.
|
||||||
Corner_index add_corner(const Point_3& p);
|
Corner_index add_corner(const Point_3& p);
|
||||||
|
|
||||||
/// Overload where the last parameter `out` is not `CGAL::Emptyset_iterator()`.
|
/// Overload where the last parameter `out` is not `CGAL::Emptyset_iterator()`.
|
||||||
|
|
@ -607,8 +600,9 @@ public:
|
||||||
IndicesOutputIterator out /*= CGAL::Emptyset_iterator()*/);
|
IndicesOutputIterator out /*= CGAL::Emptyset_iterator()*/);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Add 0-dimensional features in the domain. The value type of `InputIterator` must
|
adds 0-dimensional features in the domain.
|
||||||
be `Point_3`.
|
|
||||||
|
The value type of `InputIterator` must be `Point_3`.
|
||||||
*/
|
*/
|
||||||
template <typename InputIterator>
|
template <typename InputIterator>
|
||||||
void
|
void
|
||||||
|
|
@ -641,11 +635,13 @@ public:
|
||||||
add_features_with_context(InputIterator first, InputIterator end,
|
add_features_with_context(InputIterator first, InputIterator end,
|
||||||
IndicesOutputIterator out /*=
|
IndicesOutputIterator out /*=
|
||||||
CGAL::Emptyset_iterator()*/);
|
CGAL::Emptyset_iterator()*/);
|
||||||
/// @}
|
|
||||||
/// \endcond
|
/// @endcond
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Add 1-dimensional features in the domain. `InputIterator` value type must
|
adds 1-dimensional features in the domain.
|
||||||
be a model of the concept `MeshPolyline_3`.
|
|
||||||
|
The value type of `InputIterator` must be a model of the concept `MeshPolyline_3`.
|
||||||
*/
|
*/
|
||||||
template <typename InputIterator>
|
template <typename InputIterator>
|
||||||
void
|
void
|
||||||
|
|
@ -653,16 +649,17 @@ public:
|
||||||
{ add_features(first, end, CGAL::Emptyset_iterator()); }
|
{ add_features(first, end, CGAL::Emptyset_iterator()); }
|
||||||
|
|
||||||
/// @cond DEVELOPERS
|
/// @cond DEVELOPERS
|
||||||
/// Undocumented function, kept for backward-compatibility with existing
|
|
||||||
/// code
|
/// Undocumented function, kept for backward-compatibility with existing code
|
||||||
template <typename InputIterator>
|
template <typename InputIterator>
|
||||||
void
|
void
|
||||||
add_features_with_context(InputIterator first, InputIterator end)
|
add_features_with_context(InputIterator first, InputIterator end)
|
||||||
{ add_features_with_context(first, end, CGAL::Emptyset_iterator()); }
|
{ add_features_with_context(first, end, CGAL::Emptyset_iterator()); }
|
||||||
|
|
||||||
/// @endcond
|
/// @endcond
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Add 1-dimensional features (curves) from the range `[first, end)` in the domain with their incidences
|
adds 1-dimensional features (curves) from the range `[first, end)` in the domain with their incidences
|
||||||
with 2-dimensional features (patches) of the domain.
|
with 2-dimensional features (patches) of the domain.
|
||||||
|
|
||||||
\tparam InputIterator input iterator over curves
|
\tparam InputIterator input iterator over curves
|
||||||
|
|
@ -695,57 +692,57 @@ public:
|
||||||
incident_patches_indices_pmap,
|
incident_patches_indices_pmap,
|
||||||
CGAL::Emptyset_iterator());
|
CGAL::Emptyset_iterator());
|
||||||
}
|
}
|
||||||
/// @}
|
|
||||||
|
|
||||||
/// \name Implementation of the concept MeshDomainWithFeatures_3
|
/// @}
|
||||||
/// The following methods implement the requirement of the concept
|
|
||||||
/// `MeshDomainWithFeatures_3`.
|
|
||||||
/// @{
|
|
||||||
|
|
||||||
/// Implements `MeshDomainWithFeatures_3::get_corners()`.
|
/// \name Implementation of the concept MeshDomainWithFeatures_3
|
||||||
/// OutputIterator value type is std::pair<Corner_index, Point_3>
|
/// The following methods implement the requirement of the concept
|
||||||
|
/// `MeshDomainWithFeatures_3`.
|
||||||
|
/// @{
|
||||||
|
|
||||||
|
/// implements `MeshDomainWithFeatures_3::get_corners()`.
|
||||||
|
/// OutputIterator is std::pair<Corner_index, Point_3>
|
||||||
template <typename OutputIterator>
|
template <typename OutputIterator>
|
||||||
OutputIterator get_corners(OutputIterator out) const;
|
OutputIterator get_corners(OutputIterator out) const;
|
||||||
|
|
||||||
/// Implements `MeshDomainWithFeatures_3::get_curves()`.
|
/// implements `MeshDomainWithFeatures_3::get_curves()`.
|
||||||
/// OutputIterator value type is std::tuple<Curve_index,
|
/// OutputIterator value type is std::tuple<Curve_index,
|
||||||
/// std::pair<Point_3,Index>, std::pair<Point_3,Index> >
|
/// std::pair<Point_3,Index>, std::pair<Point_3,Index> >
|
||||||
template <typename OutputIterator>
|
template <typename OutputIterator>
|
||||||
OutputIterator get_curves(OutputIterator out) const;
|
OutputIterator get_curves(OutputIterator out) const;
|
||||||
|
|
||||||
/// Implements `MeshDomainWithFeatures_3::curve_segment_length()`.
|
/// implements `MeshDomainWithFeatures_3::curve_segment_length()`.
|
||||||
FT curve_segment_length(const Point_3& p, const Point_3 q,
|
FT curve_segment_length(const Point_3& p, const Point_3 q,
|
||||||
const Curve_index& curve_index,
|
const Curve_index& curve_index,
|
||||||
CGAL::Orientation orientation) const;
|
CGAL::Orientation orientation) const;
|
||||||
|
|
||||||
/// Implements `MeshDomainWithFeatures_3::curve_length()`.
|
/// implements `MeshDomainWithFeatures_3::curve_length()`.
|
||||||
FT curve_length(const Curve_index& curve_index) const;
|
FT curve_length(const Curve_index& curve_index) const;
|
||||||
|
|
||||||
/// Implements `MeshDomainWithFeatures_3::construct_point_on_curve()`.
|
/// implements `MeshDomainWithFeatures_3::construct_point_on_curve()`.
|
||||||
Point_3
|
Point_3
|
||||||
construct_point_on_curve(const Point_3& starting_point,
|
construct_point_on_curve(const Point_3& starting_point,
|
||||||
const Curve_index& curve_index,
|
const Curve_index& curve_index,
|
||||||
FT distance) const;
|
FT distance) const;
|
||||||
/// Implements `MeshDomainWithFeatures_3::distance_sign_along_loop()`.
|
/// implements `MeshDomainWithFeatures_3::distance_sign_along_loop()`.
|
||||||
CGAL::Sign distance_sign_along_loop(const Point_3& p,
|
CGAL::Sign distance_sign_along_loop(const Point_3& p,
|
||||||
const Point_3& q,
|
const Point_3& q,
|
||||||
const Point_3& r,
|
const Point_3& r,
|
||||||
const Curve_index& index) const;
|
const Curve_index& index) const;
|
||||||
|
|
||||||
/// Implements `MeshDomainWithFeatures_3::distance_sign()`.
|
/// implements `MeshDomainWithFeatures_3::distance_sign()`.
|
||||||
CGAL::Sign distance_sign(const Point_3& p, const Point_3& q,
|
CGAL::Sign distance_sign(const Point_3& p, const Point_3& q,
|
||||||
const Curve_index& index) const;
|
const Curve_index& index) const;
|
||||||
|
|
||||||
/// Implements `MeshDomainWithFeatures_3::is_loop()`.
|
/// implements `MeshDomainWithFeatures_3::is_loop()`.
|
||||||
bool is_loop(const Curve_index& index) const;
|
bool is_loop(const Curve_index& index) const;
|
||||||
|
|
||||||
/// Implements `MeshDomainWithFeatures_3::is_curve_segment_covered()`.
|
/// implements `MeshDomainWithFeatures_3::is_curve_segment_covered()`.
|
||||||
bool is_curve_segment_covered(const Curve_index& index,
|
bool is_curve_segment_covered(const Curve_index& index,
|
||||||
CGAL::Orientation orientation,
|
CGAL::Orientation orientation,
|
||||||
const Point_3& c1, const Point_3& c2,
|
const Point_3& c1, const Point_3& c2,
|
||||||
const FT sq_r1, const FT sq_r2) const;
|
const FT sq_r1, const FT sq_r2) const;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the index to be stored in a vertex lying on the surface identified
|
* Returns the index to be stored in a vertex lying on the surface identified
|
||||||
* by `index`.
|
* by `index`.
|
||||||
|
|
@ -760,11 +757,11 @@ public:
|
||||||
Index index_from_subdomain_index(const Subdomain_index& index) const
|
Index index_from_subdomain_index(const Subdomain_index& index) const
|
||||||
{ return Index(index); }
|
{ return Index(index); }
|
||||||
|
|
||||||
/// Returns an `Index` from a `Curve_index`
|
/// returns an `Index` from a `Curve_index`
|
||||||
Index index_from_curve_index(const Curve_index& index) const
|
Index index_from_curve_index(const Curve_index& index) const
|
||||||
{ return Index(index); }
|
{ return Index(index); }
|
||||||
|
|
||||||
/// Returns an `Index` from a `Corner_index`
|
/// returns an `Index` from a `Corner_index`
|
||||||
Index index_from_corner_index(const Corner_index& index) const
|
Index index_from_corner_index(const Corner_index& index) const
|
||||||
{ return Index(index); }
|
{ return Index(index); }
|
||||||
|
|
||||||
|
|
@ -782,11 +779,11 @@ public:
|
||||||
Subdomain_index subdomain_index(const Index& index) const
|
Subdomain_index subdomain_index(const Index& index) const
|
||||||
{ return boost::get<Subdomain_index>(index); }
|
{ return boost::get<Subdomain_index>(index); }
|
||||||
|
|
||||||
/// Returns a `Curve_index` from an `Index`
|
/// returns a `Curve_index` from an `Index`
|
||||||
Curve_index curve_index(const Index& index) const
|
Curve_index curve_index(const Index& index) const
|
||||||
{ return boost::get<Curve_index>(index); }
|
{ return boost::get<Curve_index>(index); }
|
||||||
|
|
||||||
/// Returns a `Corner_index` from an `Index`
|
/// returns a `Corner_index` from an `Index`
|
||||||
Corner_index corner_index(const Index& index) const
|
Corner_index corner_index(const Index& index) const
|
||||||
{ return boost::get<Corner_index>(index); }
|
{ return boost::get<Corner_index>(index); }
|
||||||
|
|
||||||
|
|
@ -832,12 +829,12 @@ public:
|
||||||
Curve_index insert_edge(InputIterator first, InputIterator end);
|
Curve_index insert_edge(InputIterator first, InputIterator end);
|
||||||
/// @endcond
|
/// @endcond
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void compute_corners_incidences();
|
void compute_corners_incidences();
|
||||||
|
|
||||||
/// Returns Index associated to p (p must be the coordinates of a corner
|
/// returns Index associated to p (p must be the coordinates of a corner
|
||||||
/// point)
|
/// point)
|
||||||
Index point_corner_index(const Point_3& p) const;
|
Index point_corner_index(const Point_3& p) const;
|
||||||
|
|
||||||
|
|
@ -918,9 +915,11 @@ public:
|
||||||
timer.stop();
|
timer.stop();
|
||||||
std::cerr << " done (" << timer.time() * 1000 << " ms)" << std::endl;
|
std::cerr << " done (" << timer.time() * 1000 << " ms)" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
} // end build_curves_aabb_tree()
|
} // build_curves_aabb_tree()
|
||||||
|
|
||||||
/// @endcond
|
/// @endcond
|
||||||
}; // end class Mesh_domain_with_polyline_features_3
|
|
||||||
|
}; // class Mesh_domain_with_polyline_features_3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1548,9 +1547,6 @@ is_curve_segment_covered(const Curve_index& index,
|
||||||
c1, c2, sq_r1, sq_r2);
|
c1, c2, sq_r1, sq_r2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} //namespace CGAL
|
} //namespace CGAL
|
||||||
|
|
||||||
|
|
||||||
#endif // CGAL_MESH_DOMAIN_WITH_POLYLINE_FEATURES_3_H
|
#endif // CGAL_MESH_DOMAIN_WITH_POLYLINE_FEATURES_3_H
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,8 @@ public:
|
||||||
/// \name Creation
|
/// \name Creation
|
||||||
/// @{
|
/// @{
|
||||||
/*!
|
/*!
|
||||||
* Returns an object to serve as criteria for edges.
|
* returns an object to serve as criteria for edges.
|
||||||
|
*
|
||||||
* \param length_bound is an upper bound
|
* \param length_bound is an upper bound
|
||||||
* for the length of the edges which are used to discretize the curves.
|
* for the length of the edges which are used to discretize the curves.
|
||||||
* \param min_length_bound is a desired lower bound
|
* \param min_length_bound is a desired lower bound
|
||||||
|
|
@ -132,7 +133,7 @@ public:
|
||||||
* break all the surface topology guarantees of the meshing algorithm.
|
* break all the surface topology guarantees of the meshing algorithm.
|
||||||
* It is not guaranteed to be exactly respected in the output mesh.
|
* It is not guaranteed to be exactly respected in the output mesh.
|
||||||
*
|
*
|
||||||
* \note if one parameter is set to 0, then its corresponding criterion is ignored.
|
* \note If one parameter is set to 0, then its corresponding criterion is ignored.
|
||||||
*/
|
*/
|
||||||
Mesh_edge_criteria_3(const FT& length_bound,
|
Mesh_edge_criteria_3(const FT& length_bound,
|
||||||
const FT& min_length_bound = 0)
|
const FT& min_length_bound = 0)
|
||||||
|
|
@ -149,13 +150,12 @@ public:
|
||||||
// as int.
|
// as int.
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @tparam SizingField a model of `MeshDomainField_3`
|
* returns an object to serve as criteria for edges.
|
||||||
*
|
|
||||||
* Returns an object to serve as criteria for edges.
|
|
||||||
* The behavior and semantic of the argument are the same
|
* The behavior and semantic of the argument are the same
|
||||||
* as above, except that the `length_bound`
|
* as above, except that the `length_bound`
|
||||||
* parameter is a functional instead of a constant.
|
* parameter is a functional instead of a constant.
|
||||||
|
*
|
||||||
|
* @tparam SizingField a model of `MeshDomainField_3`
|
||||||
*/
|
*/
|
||||||
template < typename SizingField >
|
template < typename SizingField >
|
||||||
Mesh_edge_criteria_3
|
Mesh_edge_criteria_3
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,8 @@ public:
|
||||||
*/
|
*/
|
||||||
typedef typename Tr::Geom_traits::FT FT;
|
typedef typename Tr::Geom_traits::FT FT;
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
|
||||||
typedef Visitor_ Visitor;
|
typedef Visitor_ Visitor;
|
||||||
typedef typename Visitor::Facet_quality Facet_quality;
|
typedef typename Visitor::Facet_quality Facet_quality;
|
||||||
typedef typename Visitor::Is_facet_bad Is_facet_bad;
|
typedef typename Visitor::Is_facet_bad Is_facet_bad;
|
||||||
|
|
@ -84,15 +86,13 @@ private:
|
||||||
public:
|
public:
|
||||||
typedef CGAL::Tag_true Has_manifold_criterion;
|
typedef CGAL::Tag_true Has_manifold_criterion;
|
||||||
|
|
||||||
/// @}
|
|
||||||
|
|
||||||
|
|
||||||
/// \name Creation
|
/// \name Creation
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
#ifdef DOXYGEN_RUNNING
|
#ifdef DOXYGEN_RUNNING
|
||||||
/*!
|
/*!
|
||||||
Returns an object to serve as criteria for facets.
|
returns an object to serve as criteria for facets.
|
||||||
|
|
||||||
\param angle_bound is the lower bound for the angle in degrees of the
|
\param angle_bound is the lower bound for the angle in degrees of the
|
||||||
surface mesh facets.
|
surface mesh facets.
|
||||||
\param radius_bound is a uniform upper bound
|
\param radius_bound is a uniform upper bound
|
||||||
|
|
@ -105,6 +105,7 @@ public:
|
||||||
\param min_radius_bound is a uniform lower bound for the radius of
|
\param min_radius_bound is a uniform lower bound for the radius of
|
||||||
the surface Delaunay balls. Only facets with a radius larger than that
|
the surface Delaunay balls. Only facets with a radius larger than that
|
||||||
bound will be refined.
|
bound will be refined.
|
||||||
|
|
||||||
@note If one parameter is set to 0, then its corresponding
|
@note If one parameter is set to 0, then its corresponding
|
||||||
criterion is ignored.
|
criterion is ignored.
|
||||||
*/
|
*/
|
||||||
|
|
@ -154,6 +155,7 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief returns whether the facet `facet` is bad or not.
|
* @brief returns whether the facet `facet` is bad or not.
|
||||||
|
*
|
||||||
* @param tr the triangulation within which `facet` lives
|
* @param tr the triangulation within which `facet` lives
|
||||||
* @param facet the facet
|
* @param facet the facet
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -214,34 +214,40 @@ public:
|
||||||
|
|
||||||
The class `Mesh_polyhedron_3` provides a customized `Polyhedron_3` type. This type uses
|
The class `Mesh_polyhedron_3` provides a customized `Polyhedron_3` type. This type uses
|
||||||
as `PolyhedronItems_3` a customized type which adds data to the Vertex, Face and
|
as `PolyhedronItems_3` a customized type which adds data to the Vertex, Face and
|
||||||
Halfedge class. Those data are required to use the detection of sharp features.
|
Halfedge classes. Those data are required to use the detection of sharp features.
|
||||||
|
|
||||||
\tparam IGT stands for the geometric traits associated
|
\tparam IGT stands for the geometric traits associated
|
||||||
to the meshing process. It must be a model of the two concepts
|
to the meshing process. It must be a model of the two concepts
|
||||||
`PolyhedronTraits_3` and `IntersectionGeometricTraits_3`.
|
`PolyhedronTraits_3` and `IntersectionGeometricTraits_3`.
|
||||||
|
|
||||||
\sa `CGAL::Polyhedron_3<Gt>`
|
\sa `CGAL::Polyhedron_3<GT>`
|
||||||
\sa `CGAL::Polyhedral_mesh_domain_with_features_3<IGT>`
|
\sa `CGAL::Polyhedral_mesh_domain_with_features_3<IGT>`
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template <typename IGT, typename Patch_id=int>
|
#ifdef DOXYGEN_RUNNING
|
||||||
|
template <typename IGT>
|
||||||
struct Mesh_polyhedron_3
|
struct Mesh_polyhedron_3
|
||||||
{
|
{
|
||||||
#ifdef DOXYGEN_RUNNING
|
|
||||||
/// \name Types
|
/// \name Types
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
`CGAL::Polyhedron_3<IGT>` type with customized `PolyhedronItems_3`
|
`CGAL::Polyhedron_3<IGT>` type with customized `PolyhedronItems_3` designed to handle sharp feature detection.
|
||||||
*/
|
*/
|
||||||
typedef unspecified_type type;
|
typedef unspecified_type type;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
};
|
||||||
#else
|
#else
|
||||||
|
template <typename IGT,
|
||||||
|
typename Patch_id = int>
|
||||||
|
struct Mesh_polyhedron_3
|
||||||
|
{
|
||||||
typedef Polyhedron_3<IGT, Mesh_3::Mesh_polyhedron_items<Patch_id> > type;
|
typedef Polyhedron_3<IGT, Mesh_3::Mesh_polyhedron_items<Patch_id> > type;
|
||||||
typedef type Type;
|
typedef type Type;
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
} // end namespace CGAL
|
} // end namespace CGAL
|
||||||
|
|
||||||
#endif // CGAL_MESH_POLYHEDRON_3_H
|
#endif // CGAL_MESH_POLYHEDRON_3_H
|
||||||
|
|
|
||||||
|
|
@ -134,15 +134,15 @@ type to be used for the 3D triangulation embedding the mesh.
|
||||||
\tparam GT must be a model of `MeshTriangulationTraits_3` or `Default`
|
\tparam GT must be a model of `MeshTriangulationTraits_3` or `Default`
|
||||||
and defaults to `Kernel_traits<MD>::%Kernel`.
|
and defaults to `Kernel_traits<MD>::%Kernel`.
|
||||||
|
|
||||||
\tparam Concurrency_tag_ enables sequential versus parallel meshing and optimization algorithms.
|
\tparam ConcurrencyTag enables sequential versus parallel meshing and optimization algorithms.
|
||||||
Possible values are `Sequential_tag` (the default), `Parallel_tag`,
|
Possible values are `Sequential_tag` (the default), `Parallel_tag`,
|
||||||
and `Parallel_if_available_tag`.
|
and `Parallel_if_available_tag`.
|
||||||
|
|
||||||
\tparam Vertex_base__ must be a model of `MeshVertexBase_3` or `Default`
|
\tparam VertexBase must be a model of `MeshVertexBase_3` or `Default`
|
||||||
and defaults to `Mesh_vertex_base_3<Gt, MD>`.
|
and defaults to `Mesh_vertex_base_3<GT, MD>`.
|
||||||
|
|
||||||
\tparam Cell_base_ must be a model of `MeshCellBase_3` or `Default`
|
\tparam CellBase must be a model of `MeshCellBase_3` or `Default`
|
||||||
and defaults to `Compact_mesh_cell_base_3<Gt, MD>`.
|
and defaults to `Compact_mesh_cell_base_3<GT, MD>`.
|
||||||
|
|
||||||
\warning To improve the robustness of the meshing process, the input traits `GT`
|
\warning To improve the robustness of the meshing process, the input traits `GT`
|
||||||
is wrapped with the traits class `Robust_weighted_circumcenter_filtered_traits_3`.
|
is wrapped with the traits class `Robust_weighted_circumcenter_filtered_traits_3`.
|
||||||
|
|
@ -190,27 +190,24 @@ private:
|
||||||
Mesh_3_regular_triangulation_3_wrapper<Geom_traits, Tds>;
|
Mesh_3_regular_triangulation_3_wrapper<Geom_traits, Tds>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
#ifndef DOXYGEN_RUNNING
|
#ifndef DOXYGEN_RUNNING
|
||||||
using type = Triangulation;
|
using type = Triangulation;
|
||||||
using Type = type;
|
using Type = type;
|
||||||
#else
|
#else
|
||||||
|
/// \name Types
|
||||||
|
/// @{
|
||||||
|
|
||||||
/// \name Types
|
/*!
|
||||||
/// @{
|
The triangulation type to be used for the 3D triangulation embedding the mesh.
|
||||||
|
This type is a wrapper around the type `CGAL::Regular_triangulation_3`, whose vertex
|
||||||
/*!
|
and cell base classes are respectively `VertexBase` and `CellBase`.
|
||||||
The triangulation type to be used for the 3D triangulation embedding the mesh.
|
*/
|
||||||
This type is a wrapper around the type `CGAL::Regular_triangulation_3`, whose vertex
|
typedef unspecified_type type;
|
||||||
and cell base classes are respectively `Vertex_base` and `Cell_base`.
|
|
||||||
*/
|
|
||||||
typedef unspecified_type type;
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
#endif // DOXYGEN_RUNNING
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}; // end struct Mesh_triangulation_3
|
|
||||||
} // end namespace CGAL
|
} // end namespace CGAL
|
||||||
|
|
||||||
#include <CGAL/enable_warnings.h>
|
#include <CGAL/enable_warnings.h>
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ surface, the sub-domain indices on both sides are known.
|
||||||
\tparam Polyhedron stands for the type of the input polyhedral surface(s),
|
\tparam Polyhedron stands for the type of the input polyhedral surface(s),
|
||||||
model of `FaceListGraph`.
|
model of `FaceListGraph`.
|
||||||
|
|
||||||
\tparam IGT_ stands for a geometric traits class
|
\tparam IGT stands for a geometric traits class
|
||||||
providing the types and functors required to implement
|
providing the types and functors required to implement
|
||||||
the intersection tests and intersection computations
|
the intersection tests and intersection computations
|
||||||
for polyhedral boundary surfaces. This parameter has to be instantiated
|
for polyhedral boundary surfaces. This parameter has to be instantiated
|
||||||
|
|
@ -93,7 +93,6 @@ with a model of the concept `IntersectionGeometricTraits_3`.
|
||||||
|
|
||||||
\cgalModels `MeshDomainWithFeatures_3`
|
\cgalModels `MeshDomainWithFeatures_3`
|
||||||
|
|
||||||
\sa `IntersectionGeometricTraits_3`
|
|
||||||
\sa `CGAL::make_mesh_3()`
|
\sa `CGAL::make_mesh_3()`
|
||||||
\sa `CGAL::Mesh_domain_with_polyline_features_3<MD>`
|
\sa `CGAL::Mesh_domain_with_polyline_features_3<MD>`
|
||||||
\sa `CGAL::Polyhedral_mesh_domain_3<Polyhedron,IGT>`
|
\sa `CGAL::Polyhedral_mesh_domain_3<Polyhedron,IGT>`
|
||||||
|
|
@ -104,53 +103,47 @@ template < class IGT,
|
||||||
class Polyhedron = typename Mesh_polyhedron_3<IGT>::type>
|
class Polyhedron = typename Mesh_polyhedron_3<IGT>::type>
|
||||||
class Polyhedral_complex_mesh_domain_3
|
class Polyhedral_complex_mesh_domain_3
|
||||||
: public Mesh_domain_with_polyline_features_3<
|
: public Mesh_domain_with_polyline_features_3<
|
||||||
Polyhedral_mesh_domain_3< Polyhedron,
|
Polyhedral_mesh_domain_3<Polyhedron,
|
||||||
IGT> >
|
IGT> >
|
||||||
#else
|
#else
|
||||||
template < class IGT_,
|
template < class IGT_,
|
||||||
class Polyhedron_ = typename Mesh_polyhedron_3<IGT_>::type,
|
class Polyhedron_ = typename Mesh_polyhedron_3<IGT_>::type,
|
||||||
class TriangleAccessor=CGAL::Default>
|
class TriangleAccessor = CGAL::Default>
|
||||||
class Polyhedral_complex_mesh_domain_3
|
class Polyhedral_complex_mesh_domain_3
|
||||||
: public Mesh_domain_with_polyline_features_3<
|
: public Mesh_domain_with_polyline_features_3<
|
||||||
Polyhedral_mesh_domain_3< Polyhedron_,
|
Polyhedral_mesh_domain_3< Polyhedron_,
|
||||||
IGT_,
|
IGT_,
|
||||||
TriangleAccessor,
|
TriangleAccessor,
|
||||||
int, //Use_patch_id_tag
|
int, // Use_patch_id_tag
|
||||||
Tag_true > >//Use_exact_intersection_tag
|
Tag_true > >// Use_exact_intersection_tag
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/// The base class
|
// The base class
|
||||||
typedef Polyhedron_ Polyhedron;
|
typedef Polyhedron_ Polyhedron;
|
||||||
typedef Mesh_domain_with_polyline_features_3<
|
typedef Mesh_domain_with_polyline_features_3<
|
||||||
Polyhedral_mesh_domain_3<
|
Polyhedral_mesh_domain_3<
|
||||||
Polyhedron, IGT_, TriangleAccessor,
|
Polyhedron, IGT_, TriangleAccessor, int, Tag_true > > Base;
|
||||||
int, Tag_true > > Base;
|
|
||||||
/// @cond DEVELOPERS
|
|
||||||
private:
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// @cond DEVELOPERS
|
||||||
typedef Polyhedral_mesh_domain_3<Polyhedron, IGT_, CGAL::Default,
|
typedef Polyhedral_mesh_domain_3<Polyhedron, IGT_, CGAL::Default,
|
||||||
int, Tag_true > BaseBase;
|
int, Tag_true > BaseBase;
|
||||||
typedef Polyhedral_complex_mesh_domain_3<IGT_, Polyhedron> Self;
|
typedef Polyhedral_complex_mesh_domain_3<IGT_, Polyhedron> Self;
|
||||||
/// @endcond
|
/// @endcond
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/*!
|
// Numerical type
|
||||||
Numerical type.
|
|
||||||
*/
|
|
||||||
typedef typename Base::FT FT;
|
typedef typename Base::FT FT;
|
||||||
|
|
||||||
/// The polyhedron type
|
// The polyhedron type
|
||||||
typedef Polyhedron Polyhedron_type;
|
typedef Polyhedron Polyhedron_type;
|
||||||
|
|
||||||
/// \name Index types
|
// The types are `int` or types compatible with `int`.
|
||||||
/// @{
|
|
||||||
/// The types are `int` or types compatible with `int`.
|
|
||||||
typedef typename Base::Corner_index Corner_index;
|
typedef typename Base::Corner_index Corner_index;
|
||||||
typedef typename Base::Curve_index Curve_index;
|
typedef typename Base::Curve_index Curve_index;
|
||||||
typedef typename Base::Surface_patch_index Surface_patch_index;
|
typedef typename Base::Surface_patch_index Surface_patch_index;
|
||||||
typedef typename Base::Subdomain_index Subdomain_index;
|
typedef typename Base::Subdomain_index Subdomain_index;
|
||||||
/// @}
|
|
||||||
|
|
||||||
/// @cond DEVELOPERS
|
/// @cond DEVELOPERS
|
||||||
typedef typename Base::Ray_3 Ray_3;
|
typedef typename Base::Ray_3 Ray_3;
|
||||||
|
|
@ -162,6 +155,7 @@ public:
|
||||||
typedef typename Base::AABB_primitive AABB_primitive;
|
typedef typename Base::AABB_primitive AABB_primitive;
|
||||||
typedef typename Base::AABB_primitive_id AABB_primitive_id;
|
typedef typename Base::AABB_primitive_id AABB_primitive_id;
|
||||||
typedef typename Base::Surface_patch_index Patch_id;
|
typedef typename Base::Surface_patch_index Patch_id;
|
||||||
|
|
||||||
// Backward compatibility
|
// Backward compatibility
|
||||||
#ifndef CGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX
|
#ifndef CGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX
|
||||||
typedef Surface_patch_index Surface_index;
|
typedef Surface_patch_index Surface_index;
|
||||||
|
|
@ -192,9 +186,12 @@ protected:
|
||||||
/// @endcond
|
/// @endcond
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Constructor
|
/// \name Creation
|
||||||
/*! Constructs a domain defined by a set of polyhedral surfaces,
|
/// @{
|
||||||
describing a polyhedral complex.
|
|
||||||
|
/*!
|
||||||
|
constructs a domain defined by a set of polyhedral surfaces, describing a polyhedral complex.
|
||||||
|
|
||||||
@param begin first iterator on the input polyhedral surfaces
|
@param begin first iterator on the input polyhedral surfaces
|
||||||
@param end past the end iterator on the input polyhedral surfaces
|
@param end past the end iterator on the input polyhedral surfaces
|
||||||
@param indices_begin first iterator on the pairs of subdomain indices
|
@param indices_begin first iterator on the pairs of subdomain indices
|
||||||
|
|
@ -214,8 +211,7 @@ public:
|
||||||
*/
|
*/
|
||||||
template <typename InputPolyhedraIterator,
|
template <typename InputPolyhedraIterator,
|
||||||
typename InputPairOfSubdomainIndicesIterator>
|
typename InputPairOfSubdomainIndicesIterator>
|
||||||
Polyhedral_complex_mesh_domain_3
|
Polyhedral_complex_mesh_domain_3(InputPolyhedraIterator begin,
|
||||||
( InputPolyhedraIterator begin,
|
|
||||||
InputPolyhedraIterator end,
|
InputPolyhedraIterator end,
|
||||||
InputPairOfSubdomainIndicesIterator indices_begin,
|
InputPairOfSubdomainIndicesIterator indices_begin,
|
||||||
InputPairOfSubdomainIndicesIterator indices_end
|
InputPairOfSubdomainIndicesIterator indices_end
|
||||||
|
|
@ -254,7 +250,10 @@ public:
|
||||||
this->build();
|
this->build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
|
||||||
/// @cond DEVELOPERS
|
/// @cond DEVELOPERS
|
||||||
|
|
||||||
Polyhedral_complex_mesh_domain_3
|
Polyhedral_complex_mesh_domain_3
|
||||||
(
|
(
|
||||||
CGAL::Random* p_rng = nullptr
|
CGAL::Random* p_rng = nullptr
|
||||||
|
|
@ -266,17 +265,15 @@ public:
|
||||||
const std::vector<Polyhedron>& polyhedra() const {
|
const std::vector<Polyhedron>& polyhedra() const {
|
||||||
return stored_polyhedra;
|
return stored_polyhedra;
|
||||||
}
|
}
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
/// @cond DEVELOPERS
|
|
||||||
/*!
|
/*!
|
||||||
* construct_initial_points_object() is one of the very first functions called
|
* construct_initial_points_object() is one of the very first functions called
|
||||||
* when make_mesh_3 starts
|
* when make_mesh_3 starts.
|
||||||
* BEFORE make_mesh_3 starts, we have to make sure that (at least) the borders have
|
* BEFORE make_mesh_3 starts, we have to make sure that (at least) the borders have
|
||||||
* been detected, and the polyhedral complex internal data structures initialized
|
* been detected, and the polyhedral complex internal data structures initialized
|
||||||
* So, this function is overloaded to make sure they are (checking that
|
* So, this function is overloaded to make sure they are (checking that
|
||||||
* borders_detected_ is false is enough)
|
* borders_detected_ is false is enough).
|
||||||
* Then, call the base class function
|
* Then, call the base class function.
|
||||||
*/
|
*/
|
||||||
typename BaseBase::Construct_initial_points construct_initial_points_object() const
|
typename BaseBase::Construct_initial_points construct_initial_points_object() const
|
||||||
{
|
{
|
||||||
|
|
@ -289,9 +286,13 @@ public:
|
||||||
void detect_features(FT angle_in_degree,
|
void detect_features(FT angle_in_degree,
|
||||||
std::vector<Polyhedron_type>& p,
|
std::vector<Polyhedron_type>& p,
|
||||||
const bool dont_protect);//if true, features will not be protected
|
const bool dont_protect);//if true, features will not be protected
|
||||||
|
|
||||||
|
void detect_borders(std::vector<Polyhedron_type>& p, const bool dont_protect);
|
||||||
|
|
||||||
/// @endcond
|
/// @endcond
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Detects sharp features and boundaries of the polyhedral components of the complex
|
detects sharp features and boundaries of the polyhedral components of the complex
|
||||||
(including potential internal polyhedra),
|
(including potential internal polyhedra),
|
||||||
and inserts them as features of the domain. `angle_bound` gives the maximum
|
and inserts them as features of the domain. `angle_bound` gives the maximum
|
||||||
angle (in degrees) between the two normal vectors of adjacent triangles.
|
angle (in degrees) between the two normal vectors of adjacent triangles.
|
||||||
|
|
@ -303,13 +304,10 @@ public:
|
||||||
detect_features(angle_bound, stored_polyhedra, false/*do protect*/);
|
detect_features(angle_bound, stored_polyhedra, false/*do protect*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @cond DEVELOPERS
|
|
||||||
void detect_borders(std::vector<Polyhedron_type>& p, const bool dont_protect);
|
|
||||||
/// @endcond
|
|
||||||
/*!
|
/*!
|
||||||
Detects border edges of the polyhedral components of the complex,
|
detects border edges of the polyhedral components of the complex,
|
||||||
and inserts them as features of the domain.
|
and inserts them as features of the domain.
|
||||||
This function should be called alone only, and not before or after `detect_features()`.
|
This function should only be called alone, and not before or after `detect_features()`.
|
||||||
*/
|
*/
|
||||||
void detect_borders() {
|
void detect_borders() {
|
||||||
detect_borders(stored_polyhedra, false/*do protect*/);
|
detect_borders(stored_polyhedra, false/*do protect*/);
|
||||||
|
|
@ -373,11 +371,10 @@ public:
|
||||||
this->boundary_polyhedra_ids.push_back(poly_id);
|
this->boundary_polyhedra_ids.push_back(poly_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
/// @cond DEVELOPERS
|
|
||||||
template <typename C3t3>
|
template <typename C3t3>
|
||||||
void add_vertices_to_c3t3_on_patch_without_feature_edges(C3t3& c3t3) const {
|
void add_vertices_to_c3t3_on_patch_without_feature_edges(C3t3& c3t3) const
|
||||||
|
{
|
||||||
#ifdef CGAL_MESH_3_VERBOSE
|
#ifdef CGAL_MESH_3_VERBOSE
|
||||||
std::cout << "add_vertices_to_c3t3_on_patch_without_feature_edges...";
|
std::cout << "add_vertices_to_c3t3_on_patch_without_feature_edges...";
|
||||||
std::cout.flush();
|
std::cout.flush();
|
||||||
|
|
|
||||||
|
|
@ -133,19 +133,17 @@ with a model of the concept `IntersectionGeometricTraits_3`.
|
||||||
|
|
||||||
\sa `IntersectionGeometricTraits_3`
|
\sa `IntersectionGeometricTraits_3`
|
||||||
\sa `CGAL::make_mesh_3()`.
|
\sa `CGAL::make_mesh_3()`.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef DOXYGEN_RUNNING
|
#ifdef DOXYGEN_RUNNING
|
||||||
template<class Polyhedron /*FaceGraph*/
|
template<class Polyhedron /*FaceGraph*/
|
||||||
,class IGT>
|
,class IGT>
|
||||||
#else
|
#else // DOXYGEN_RUNNING
|
||||||
template<class Polyhedron /*FaceGraph*/
|
template<class Polyhedron, /*FaceGraph*/
|
||||||
,class IGT_
|
class IGT_,
|
||||||
,class TriangleAccessor = CGAL::Default
|
class TriangleAccessor = CGAL::Default,
|
||||||
,class Patch_id_ = void
|
class Patch_id_ = void,
|
||||||
,class Use_exact_intersection_construction_tag = CGAL::Tag_true>
|
class Use_exact_intersection_construction_tag = CGAL::Tag_true>
|
||||||
#endif
|
#endif // DOXYGEN_RUNNING
|
||||||
class Polyhedral_mesh_domain_3
|
class Polyhedral_mesh_domain_3
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -155,7 +153,7 @@ public:
|
||||||
|
|
||||||
typedef Patch_id_ Patch_id;
|
typedef Patch_id_ Patch_id;
|
||||||
|
|
||||||
/// Geometric object types
|
// Geometric object types
|
||||||
typedef typename IGT::Point_3 Point_3;
|
typedef typename IGT::Point_3 Point_3;
|
||||||
typedef typename IGT::Segment_3 Segment_3;
|
typedef typename IGT::Segment_3 Segment_3;
|
||||||
typedef typename IGT::Ray_3 Ray_3;
|
typedef typename IGT::Ray_3 Ray_3;
|
||||||
|
|
@ -166,25 +164,25 @@ public:
|
||||||
//-------------------------------------------------------
|
//-------------------------------------------------------
|
||||||
// Index Types
|
// Index Types
|
||||||
//-------------------------------------------------------
|
//-------------------------------------------------------
|
||||||
/// Type of indexes for cells of the input complex
|
// Type of indexes for cells of the input complex
|
||||||
typedef int Subdomain_index;
|
typedef int Subdomain_index;
|
||||||
typedef boost::optional<Subdomain_index> Subdomain;
|
typedef boost::optional<Subdomain_index> Subdomain;
|
||||||
|
|
||||||
/// Type of indexes for surface patch of the input complex
|
// Type of indexes for surface patch of the input complex
|
||||||
typedef typename boost::property_map<Polyhedron,
|
typedef typename boost::property_map<Polyhedron,
|
||||||
face_patch_id_t<Patch_id>
|
face_patch_id_t<Patch_id>
|
||||||
>::type Face_patch_id_pmap;
|
>::type Face_patch_id_pmap;
|
||||||
typedef typename boost::property_traits<
|
typedef typename boost::property_traits<
|
||||||
Face_patch_id_pmap>::value_type Surface_patch_index;
|
Face_patch_id_pmap>::value_type Surface_patch_index;
|
||||||
typedef boost::optional<Surface_patch_index> Surface_patch;
|
typedef boost::optional<Surface_patch_index> Surface_patch;
|
||||||
/// Type of indexes to characterize the lowest dimensional face of the input
|
|
||||||
/// complex on which a vertex lie
|
// Type of indexes to characterize the lowest dimensional face of the input
|
||||||
|
// complex on which a vertex lie
|
||||||
typedef typename Mesh_3::internal::Index_generator<
|
typedef typename Mesh_3::internal::Index_generator<
|
||||||
Subdomain_index, Surface_patch_index>::type Index;
|
Subdomain_index, Surface_patch_index>::type Index;
|
||||||
|
|
||||||
typedef std::tuple<Point_3,Index,int> Intersection;
|
typedef std::tuple<Point_3,Index,int> Intersection;
|
||||||
|
|
||||||
|
|
||||||
typedef typename IGT::FT FT;
|
typedef typename IGT::FT FT;
|
||||||
|
|
||||||
// Kernel_traits compatibility
|
// Kernel_traits compatibility
|
||||||
|
|
@ -229,8 +227,6 @@ public:
|
||||||
typedef typename AABB_traits::Bounding_box Bounding_box;
|
typedef typename AABB_traits::Bounding_box Bounding_box;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// Default constructor
|
|
||||||
Polyhedral_mesh_domain_3(CGAL::Random* p_rng = nullptr)
|
Polyhedral_mesh_domain_3(CGAL::Random* p_rng = nullptr)
|
||||||
: tree_()
|
: tree_()
|
||||||
, bounding_tree_(&tree_)
|
, bounding_tree_(&tree_)
|
||||||
|
|
@ -238,15 +234,13 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// \name Creation
|
||||||
/// \name Creation
|
/// @{
|
||||||
/// @{
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Construction from a bounding polyhedral surface which must be closed, and free of intersections.
|
Construction from a bounding polyhedral surface which must be closed, and free of intersections.
|
||||||
The inside of `bounding_polyhedron` will be meshed.
|
The inside of `bounding_polyhedron` will be meshed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Polyhedral_mesh_domain_3(const Polyhedron& bounding_polyhedron
|
Polyhedral_mesh_domain_3(const Polyhedron& bounding_polyhedron
|
||||||
#ifndef DOXYGEN_RUNNING
|
#ifndef DOXYGEN_RUNNING
|
||||||
, CGAL::Random* p_rng = nullptr
|
, CGAL::Random* p_rng = nullptr
|
||||||
|
|
@ -270,11 +264,11 @@ public:
|
||||||
and free of intersections.
|
and free of intersections.
|
||||||
Using this constructor allows to mesh a polyhedral surface which is not closed, or has holes.
|
Using this constructor allows to mesh a polyhedral surface which is not closed, or has holes.
|
||||||
The inside of `bounding_polyhedron` will be meshed.
|
The inside of `bounding_polyhedron` will be meshed.
|
||||||
*/
|
*/
|
||||||
Polyhedral_mesh_domain_3(const Polyhedron& p
|
Polyhedral_mesh_domain_3(const Polyhedron& p,
|
||||||
,const Polyhedron& bounding_polyhedron
|
const Polyhedron& bounding_polyhedron
|
||||||
#ifndef DOXYGEN_RUNNING
|
#ifndef DOXYGEN_RUNNING
|
||||||
,CGAL::Random* p_rng = nullptr
|
, CGAL::Random* p_rng = nullptr
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
: tree_()
|
: tree_()
|
||||||
|
|
@ -300,14 +294,14 @@ public:
|
||||||
*
|
*
|
||||||
* @param begin iterator for a sequence of pointers to polyhedra
|
* @param begin iterator for a sequence of pointers to polyhedra
|
||||||
* @param end iterator for a sequence of pointers to polyhedra
|
* @param end iterator for a sequence of pointers to polyhedra
|
||||||
* @param bounding_polyhedron reference to the bounding surface
|
* @param bounding_polyhedron the bounding surface
|
||||||
*/
|
*/
|
||||||
template <typename InputPolyhedraPtrIterator>
|
template <typename InputPolyhedraPtrIterator>
|
||||||
Polyhedral_mesh_domain_3(InputPolyhedraPtrIterator begin
|
Polyhedral_mesh_domain_3(InputPolyhedraPtrIterator begin,
|
||||||
,InputPolyhedraPtrIterator end
|
InputPolyhedraPtrIterator end,
|
||||||
,const Polyhedron& bounding_polyhedron
|
const Polyhedron& bounding_polyhedron
|
||||||
#ifndef DOXYGEN_RUNNING
|
#ifndef DOXYGEN_RUNNING
|
||||||
,CGAL::Random* p_rng = nullptr
|
, CGAL::Random* p_rng = nullptr
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
: p_rng_(p_rng)
|
: p_rng_(p_rng)
|
||||||
|
|
@ -328,7 +322,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Constructor from a sequence of polyhedral surfaces, without bounding
|
* Constructor from a sequence of polyhedral surfaces, without a bounding
|
||||||
* surface. The domain will always answer `false` to `is_in_domain()`
|
* surface. The domain will always answer `false` to `is_in_domain()`
|
||||||
* queries.
|
* queries.
|
||||||
*
|
*
|
||||||
|
|
@ -356,6 +350,8 @@ public:
|
||||||
bounding_tree_ = 0;
|
bounding_tree_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
~Polyhedral_mesh_domain_3() {
|
~Polyhedral_mesh_domain_3() {
|
||||||
if(bounding_tree_ != 0 && bounding_tree_ != &tree_) {
|
if(bounding_tree_ != 0 && bounding_tree_ != &tree_) {
|
||||||
|
|
@ -366,11 +362,9 @@ public:
|
||||||
void set_surface_only() {
|
void set_surface_only() {
|
||||||
bounding_tree_ = 0;
|
bounding_tree_ = 0;
|
||||||
}
|
}
|
||||||
/// @}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a set of `n` points on the surface, and output them to
|
* constructs a set of `n` points on the surface, and output them to
|
||||||
* the output iterator `pts` whose value type is required to be
|
* the output iterator `pts` whose value type is required to be
|
||||||
* `std::pair<Points_3, Index>`.
|
* `std::pair<Points_3, Index>`.
|
||||||
*/
|
*/
|
||||||
|
|
@ -422,7 +416,7 @@ public:
|
||||||
return tree_.closest_point(p);
|
return tree_.closest_point(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allowed query types
|
// Allowed query types
|
||||||
typedef boost::mpl::vector<Segment_3, Ray_3, Line_3> Allowed_query_types;
|
typedef boost::mpl::vector<Segment_3, Ray_3, Line_3> Allowed_query_types;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -62,14 +62,14 @@ namespace CGAL {
|
||||||
|
|
||||||
The class `Polyhedral_mesh_domain_with_features_3` implements a domain whose
|
The class `Polyhedral_mesh_domain_with_features_3` implements a domain whose
|
||||||
boundary is a simplicial polyhedral surface.
|
boundary is a simplicial polyhedral surface.
|
||||||
This surface must be free of intersection.
|
|
||||||
It can either be closed,
|
This surface must be free of intersection. It can either be closed,
|
||||||
included inside another polyhedral surface which is closed and free of intersection,
|
included inside another polyhedral surface which is closed and free of intersection,
|
||||||
or open. In the latter case, the meshing process will only take care of the quality
|
or open. In the latter case, the meshing process will only take care of the quality
|
||||||
of the 1D (features and boundaries) and 2D (surfaces) components of the mesh.
|
of the 1D (features and boundaries) and 2D (surfaces) components of the mesh.
|
||||||
|
|
||||||
It is a model of the concept `MeshDomainWithFeatures_3`. It also
|
It is a model of the concept `MeshDomainWithFeatures_3`. It also provides
|
||||||
provides a member function to automatically detect sharp features and boundaries from
|
a member function to automatically detect sharp features and boundaries from
|
||||||
the input polyhedral surface(s).
|
the input polyhedral surface(s).
|
||||||
|
|
||||||
\tparam IGT stands for a geometric traits class providing the types
|
\tparam IGT stands for a geometric traits class providing the types
|
||||||
|
|
@ -78,7 +78,6 @@ for polyhedral boundary surfaces. This parameter has to be
|
||||||
instantiated with a model of the concept
|
instantiated with a model of the concept
|
||||||
`IntersectionGeometricTraits_3`.
|
`IntersectionGeometricTraits_3`.
|
||||||
|
|
||||||
|
|
||||||
\tparam Polyhedron stands for the type of the input polyhedral surface(s), model of `FaceListGraph`.
|
\tparam Polyhedron stands for the type of the input polyhedral surface(s), model of `FaceListGraph`.
|
||||||
|
|
||||||
\cgalModels `MeshDomainWithFeatures_3`
|
\cgalModels `MeshDomainWithFeatures_3`
|
||||||
|
|
@ -88,21 +87,21 @@ instantiated with a model of the concept
|
||||||
\sa `CGAL::Mesh_polyhedron_3<IGT>`
|
\sa `CGAL::Mesh_polyhedron_3<IGT>`
|
||||||
*/
|
*/
|
||||||
#ifdef DOXYGEN_RUNNING
|
#ifdef DOXYGEN_RUNNING
|
||||||
template < class IGT
|
template <class IGT,
|
||||||
,class Polyhedron = typename Mesh_polyhedron_3<IGT_>::type>
|
class Polyhedron = typename Mesh_polyhedron_3<IGT_>::type>
|
||||||
class Polyhedral_mesh_domain_with_features_3
|
class Polyhedral_mesh_domain_with_features_3
|
||||||
: public Mesh_domain_with_polyline_features_3<
|
: public Mesh_domain_with_polyline_features_3<
|
||||||
Polyhedral_mesh_domain_3< Polyhedron,
|
Polyhedral_mesh_domain_3<Polyhedron,
|
||||||
IGT> >
|
IGT> >
|
||||||
#else
|
#else
|
||||||
template < class IGT_
|
template <class IGT_,
|
||||||
,class Polyhedron_ = typename Mesh_polyhedron_3<IGT_>::type
|
class Polyhedron_ = typename Mesh_polyhedron_3<IGT_>::type,
|
||||||
,class TriangleAccessor= CGAL::Default
|
class TriangleAccessor = CGAL::Default,
|
||||||
,class Patch_id=int
|
class Patch_id = int,
|
||||||
,class Use_exact_intersection_construction_tag = Tag_true>
|
class Use_exact_intersection_construction_tag = Tag_true>
|
||||||
class Polyhedral_mesh_domain_with_features_3
|
class Polyhedral_mesh_domain_with_features_3
|
||||||
: public Mesh_domain_with_polyline_features_3<
|
: public Mesh_domain_with_polyline_features_3<
|
||||||
Polyhedral_mesh_domain_3< Polyhedron_,
|
Polyhedral_mesh_domain_3<Polyhedron_,
|
||||||
IGT_,
|
IGT_,
|
||||||
TriangleAccessor,
|
TriangleAccessor,
|
||||||
Patch_id,
|
Patch_id,
|
||||||
|
|
@ -131,8 +130,9 @@ public:
|
||||||
typedef typename Base::Surface_patch_index Surface_patch_index;
|
typedef typename Base::Surface_patch_index Surface_patch_index;
|
||||||
typedef typename Base::Subdomain_index Subdomain_index;
|
typedef typename Base::Subdomain_index Subdomain_index;
|
||||||
|
|
||||||
|
// Backward-compatibility
|
||||||
#ifndef CGAL_NO_DEPRECATED_CODE
|
#ifndef CGAL_NO_DEPRECATED_CODE
|
||||||
typedef Curve_index Curve_segment_index; ///< Backward-compatibility
|
typedef Curve_index Curve_segment_index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef typename boost::property_map<Polyhedron,
|
typedef typename boost::property_map<Polyhedron,
|
||||||
|
|
@ -149,35 +149,26 @@ public:
|
||||||
typedef typename Base::R R;
|
typedef typename Base::R R;
|
||||||
typedef typename Base::Point_3 Point_3;
|
typedef typename Base::Point_3 Point_3;
|
||||||
|
|
||||||
|
|
||||||
/// \name Types
|
|
||||||
/// @{
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Numerical type.
|
|
||||||
*/
|
|
||||||
typedef typename Base::FT FT;
|
typedef typename Base::FT FT;
|
||||||
|
|
||||||
/// @}
|
|
||||||
|
|
||||||
typedef CGAL::Tag_true Has_features;
|
typedef CGAL::Tag_true Has_features;
|
||||||
|
|
||||||
typedef std::vector<Point_3> Bare_polyline;
|
typedef std::vector<Point_3> Bare_polyline;
|
||||||
typedef Mesh_3::Polyline_with_context<Surface_patch_index, Curve_index,
|
typedef Mesh_3::Polyline_with_context<Surface_patch_index, Curve_index,
|
||||||
Bare_polyline > Polyline_with_context;
|
Bare_polyline > Polyline_with_context;
|
||||||
|
|
||||||
/// \name Creation
|
/// \name Creation
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Constructs a `Polyhedral_mesh_domain_with_features_3` from a polyhedral surface.
|
Constructor from a polyhedral surface.
|
||||||
No feature detection is done at this level. Note that a copy of `bounding_polyhedron` will be done.
|
No feature detection is done at this level. Note that a copy of `bounding_polyhedron` will be done.
|
||||||
The polyhedron `bounding_polyhedron` has to be closed and free of intersections.
|
The polyhedron `bounding_polyhedron` has to be closed and free of intersections.
|
||||||
Its interior of `bounding_polyhedron` will be meshed.
|
Its interior of `bounding_polyhedron` will be meshed.
|
||||||
*/
|
*/
|
||||||
Polyhedral_mesh_domain_with_features_3(const Polyhedron& bounding_polyhedron
|
Polyhedral_mesh_domain_with_features_3(const Polyhedron& bounding_polyhedron
|
||||||
#ifndef DOXYGEN_RUNNING
|
#ifndef DOXYGEN_RUNNING
|
||||||
,CGAL::Random* p_rng = nullptr
|
, CGAL::Random* p_rng = nullptr
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
: Base(p_rng) , borders_detected_(false)
|
: Base(p_rng) , borders_detected_(false)
|
||||||
|
|
@ -191,14 +182,13 @@ public:
|
||||||
|
|
||||||
#ifndef CGAL_NO_DEPRECATED_CODE
|
#ifndef CGAL_NO_DEPRECATED_CODE
|
||||||
/*!
|
/*!
|
||||||
\deprecated Constructs a `Polyhedral_mesh_domain_with_features_3` from an off file. No feature
|
\deprecated Constructor from an OFF file. No feature detection is done at this level.
|
||||||
detection is done at this level. Users must read the file into a `Polyhedron` and call the
|
Users must read the file into a `Polyhedron` and call the constructor above.
|
||||||
constructor above.
|
|
||||||
*/
|
*/
|
||||||
CGAL_DEPRECATED
|
CGAL_DEPRECATED
|
||||||
Polyhedral_mesh_domain_with_features_3(const std::string& filename
|
Polyhedral_mesh_domain_with_features_3(const std::string& filename
|
||||||
#ifndef DOXYGEN_RUNNING
|
#ifndef DOXYGEN_RUNNING
|
||||||
,CGAL::Random* p_rng = nullptr
|
, CGAL::Random* p_rng = nullptr
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
: Base(p_rng) , borders_detected_(false)
|
: Base(p_rng) , borders_detected_(false)
|
||||||
|
|
@ -217,20 +207,20 @@ public:
|
||||||
{
|
{
|
||||||
load_from_file(filename);
|
load_from_file(filename);
|
||||||
}
|
}
|
||||||
#endif
|
#endif // DOXYGEN_RUNNING
|
||||||
#endif // not CGAL_NO_DEPRECATED_CODE
|
#endif // not CGAL_NO_DEPRECATED_CODE
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Constructs a `Polyhedral_mesh_domain_with_features_3` from a polyhedral surface, and a bounding polyhedral surface.
|
Constructor from a polyhedral surface, and a bounding polyhedral surface.
|
||||||
The first polyhedron should be entirely included inside `bounding_polyhedron`, which has to be closed
|
The first polyhedron should be entirely included inside `bounding_polyhedron`, which has to be closed
|
||||||
and free of intersections.
|
and free of intersections.
|
||||||
Using this constructor enables to mesh a polyhedral surface which is not closed, or has holes.
|
Using this constructor enables to mesh a polyhedral surface which is not closed, or has holes.
|
||||||
The inside of `bounding_polyhedron` will be meshed.
|
The inside of `bounding_polyhedron` will be meshed.
|
||||||
*/
|
*/
|
||||||
Polyhedral_mesh_domain_with_features_3(const Polyhedron& polyhedron
|
Polyhedral_mesh_domain_with_features_3(const Polyhedron& polyhedron,
|
||||||
,const Polyhedron& bounding_polyhedron
|
const Polyhedron& bounding_polyhedron
|
||||||
#ifndef DOXYGEN_RUNNING
|
#ifndef DOXYGEN_RUNNING
|
||||||
,CGAL::Random* p_rng = nullptr
|
, CGAL::Random* p_rng = nullptr
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
: Base(p_rng) , borders_detected_(false)
|
: Base(p_rng) , borders_detected_(false)
|
||||||
|
|
@ -249,10 +239,24 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Constructor from a sequence of polyhedral surfaces, without a bounding
|
||||||
|
* surface. The domain will always answer `false` to `is_in_domain()`
|
||||||
|
* queries.
|
||||||
|
*
|
||||||
|
* @tparam InputPolyhedraPtrIterator must be a model of
|
||||||
|
* `ForwardIterator` and value type `Polyhedron*`
|
||||||
|
*
|
||||||
|
* @param begin iterator for a sequence of pointers to polyhedra
|
||||||
|
* @param end iterator for a sequence of pointers to polyhedra
|
||||||
|
*/
|
||||||
template <typename InputPolyhedraPtrIterator>
|
template <typename InputPolyhedraPtrIterator>
|
||||||
Polyhedral_mesh_domain_with_features_3(InputPolyhedraPtrIterator begin,
|
Polyhedral_mesh_domain_with_features_3(InputPolyhedraPtrIterator begin,
|
||||||
InputPolyhedraPtrIterator end,
|
InputPolyhedraPtrIterator end
|
||||||
CGAL::Random* p_rng = nullptr)
|
#ifndef DOXYGEN_RUNNING
|
||||||
|
, CGAL::Random* p_rng = nullptr
|
||||||
|
#endif
|
||||||
|
)
|
||||||
: Base(p_rng) , borders_detected_(false)
|
: Base(p_rng) , borders_detected_(false)
|
||||||
{
|
{
|
||||||
stored_polyhedra.reserve(std::distance(begin, end));
|
stored_polyhedra.reserve(std::distance(begin, end));
|
||||||
|
|
@ -265,11 +269,25 @@ public:
|
||||||
this->build();
|
this->build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Constructor from a sequence of polyhedral surfaces, and a bounding
|
||||||
|
* polyhedral surface.
|
||||||
|
*
|
||||||
|
* @tparam InputPolyhedraPtrIterator must be a model of
|
||||||
|
* `ForwardIterator` and value type `Polyhedron*`
|
||||||
|
*
|
||||||
|
* @param begin iterator for a sequence of pointers to polyhedra
|
||||||
|
* @param end iterator for a sequence of pointers to polyhedra
|
||||||
|
* @param bounding_polyhedron the bounding surface
|
||||||
|
*/
|
||||||
template <typename InputPolyhedraPtrIterator>
|
template <typename InputPolyhedraPtrIterator>
|
||||||
Polyhedral_mesh_domain_with_features_3(InputPolyhedraPtrIterator begin,
|
Polyhedral_mesh_domain_with_features_3(InputPolyhedraPtrIterator begin,
|
||||||
InputPolyhedraPtrIterator end,
|
InputPolyhedraPtrIterator end,
|
||||||
const Polyhedron& bounding_polyhedron,
|
const Polyhedron& bounding_polyhedron
|
||||||
CGAL::Random* p_rng = nullptr)
|
#ifndef DOXYGEN_RUNNING
|
||||||
|
, CGAL::Random* p_rng = nullptr
|
||||||
|
#endif
|
||||||
|
)
|
||||||
: Base(p_rng) , borders_detected_(false)
|
: Base(p_rng) , borders_detected_(false)
|
||||||
{
|
{
|
||||||
stored_polyhedra.reserve(std::distance(begin, end)+1);
|
stored_polyhedra.reserve(std::distance(begin, end)+1);
|
||||||
|
|
@ -291,26 +309,27 @@ public:
|
||||||
this->build();
|
this->build();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Destructor
|
/// @}
|
||||||
|
|
||||||
|
// Destructor
|
||||||
~Polyhedral_mesh_domain_with_features_3() {}
|
~Polyhedral_mesh_domain_with_features_3() {}
|
||||||
|
|
||||||
/// @}
|
// Detect features
|
||||||
|
|
||||||
/// Detect features
|
|
||||||
void initialize_ts(Polyhedron& p);
|
void initialize_ts(Polyhedron& p);
|
||||||
|
|
||||||
|
void detect_borders(std::vector<Polyhedron>& p);
|
||||||
|
|
||||||
void detect_features(FT angle_in_degree, std::vector<Polyhedron>& p);
|
void detect_features(FT angle_in_degree, std::vector<Polyhedron>& p);
|
||||||
|
|
||||||
/// \name Operations
|
/// \name Operations
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Detects sharp features and boundaries of the internal bounding polyhedron (and the potential internal polyhedron)
|
detects sharp features and boundaries of the internal bounding polyhedron (and the potential
|
||||||
and inserts them as features of the domain.
|
internal polyhedra) and inserts them as features of the domain.
|
||||||
@param angle_bound gives the maximum
|
|
||||||
angle (in degrees) between the two normal vectors of adjacent triangles.
|
@param angle_bound gives the maximum angle (in degrees) between the two normal vectors of adjacent triangles.
|
||||||
For an edge of the polyhedron, if the angle between the two normal vectors of its
|
For an edge of a polyhedron, if the angle between the two normal vectors of its
|
||||||
incident facets is bigger than the given bound, then the edge is considered as
|
incident facets is bigger than the given bound, then the edge is considered as
|
||||||
a feature edge.
|
a feature edge.
|
||||||
*/
|
*/
|
||||||
|
|
@ -319,13 +338,11 @@ public:
|
||||||
detect_features(angle_bound, stored_polyhedra);
|
detect_features(angle_bound, stored_polyhedra);
|
||||||
}
|
}
|
||||||
|
|
||||||
void detect_borders(std::vector<Polyhedron>& p);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Detects border edges of the bounding polyhedron and inserts them as features of the domain.
|
detects border edges of the bounding polyhedron and inserts them as features of the domain.
|
||||||
This function should be called alone only, and not before or after `detect_features()`.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
This function should only be called alone, and not before or after `detect_features()`.
|
||||||
|
*/
|
||||||
void detect_borders() { detect_borders(stored_polyhedra); };
|
void detect_borders() { detect_borders(stored_polyhedra); };
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@
|
||||||
|
|
||||||
#include <CGAL/license/Mesh_3.h>
|
#include <CGAL/license/Mesh_3.h>
|
||||||
|
|
||||||
|
|
||||||
#include <CGAL/Polyhedron_3.h>
|
#include <CGAL/Polyhedron_3.h>
|
||||||
#include <CGAL/Surface_mesh/Surface_mesh_fwd.h>
|
#include <CGAL/Surface_mesh/Surface_mesh_fwd.h>
|
||||||
#include <CGAL/boost/graph/Graph_with_descriptor_with_graph.h>
|
#include <CGAL/boost/graph/Graph_with_descriptor_with_graph.h>
|
||||||
|
|
@ -40,26 +39,14 @@ template < class K,class Items,
|
||||||
class Triangle_accessor_3<Polyhedron_3<K,Items,T_HDS,Alloc>, K >
|
class Triangle_accessor_3<Polyhedron_3<K,Items,T_HDS,Alloc>, K >
|
||||||
{
|
{
|
||||||
typedef Polyhedron_3<K,Items,T_HDS,Alloc> Polyhedron;
|
typedef Polyhedron_3<K,Items,T_HDS,Alloc> Polyhedron;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// \name Types
|
|
||||||
/// @{
|
|
||||||
/*!
|
|
||||||
Triangle type.
|
|
||||||
*/
|
|
||||||
typedef typename K::Triangle_3 Triangle_3;
|
typedef typename K::Triangle_3 Triangle_3;
|
||||||
|
|
||||||
/*!
|
|
||||||
Triangle iterator.
|
|
||||||
*/
|
|
||||||
typedef typename Polyhedron::Facet_const_iterator Triangle_iterator;
|
typedef typename Polyhedron::Facet_const_iterator Triangle_iterator;
|
||||||
|
|
||||||
/*!
|
|
||||||
Triangle handle.
|
|
||||||
*/
|
|
||||||
typedef typename Polyhedron::Facet_const_handle Triangle_handle;
|
typedef typename Polyhedron::Facet_const_handle Triangle_handle;
|
||||||
|
|
||||||
/// @}
|
|
||||||
|
|
||||||
Triangle_accessor_3() { }
|
Triangle_accessor_3() { }
|
||||||
|
|
||||||
Triangle_iterator triangles_begin(const Polyhedron& p) const
|
Triangle_iterator triangles_begin(const Polyhedron& p) const
|
||||||
|
|
@ -82,8 +69,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class P, class K>
|
||||||
template <class P, class K>
|
|
||||||
class Triangle_accessor_3<Graph_with_descriptor_with_graph<Surface_mesh<P> >, K >
|
class Triangle_accessor_3<Graph_with_descriptor_with_graph<Surface_mesh<P> >, K >
|
||||||
{
|
{
|
||||||
typedef Graph_with_descriptor_with_graph<Surface_mesh<P> > Polyhedron;
|
typedef Graph_with_descriptor_with_graph<Surface_mesh<P> > Polyhedron;
|
||||||
|
|
@ -124,5 +110,4 @@ public:
|
||||||
|
|
||||||
} // end namespace CGAL
|
} // end namespace CGAL
|
||||||
|
|
||||||
|
|
||||||
#endif // POLYHEDRON_TRIANGLE_ACCESSOR_H
|
#endif // POLYHEDRON_TRIANGLE_ACCESSOR_H
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue