mirror of https://github.com/CGAL/cgal
Merge branch 'Mesh_3-add_minimal_size_criterion_new-jtournois' into Mesh_3-min_size-jtournois
This commit is contained in:
commit
e30ccd2cc5
|
|
@ -1212,3 +1212,4 @@ gmon.*
|
|||
Polygonal_surface_reconstruction/examples/build*
|
||||
Polygonal_surface_reconstruction/test/build*
|
||||
Solver_interface/examples/build*
|
||||
/Mesh_3/examples/Mesh_3/indicator_0.inr.gz
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ extracted from labeled images.
|
|||
|
||||
### [3D Mesh Generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgMesh3)
|
||||
- Deprecated usage of boost parameters in favor of function named parameters.
|
||||
- Added new meshing criteria `facet_min_size` and `cell_min_size` to prevent Delaunay refinement from creating simplices smaller than the prescribed bound.
|
||||
|
||||
### [3D Periodic Mesh Generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgPeriodic3Mesh3)
|
||||
- Deprecated usage of boost parameters in favor of function named parameters.
|
||||
|
|
|
|||
|
|
@ -37,15 +37,21 @@ typedef Tr::FT FT;
|
|||
/// @{
|
||||
|
||||
/*!
|
||||
Returns an object to serve as default criteria for cells. The argument
|
||||
`radius_edge_bound` is the upper bound for the radius-edge ratio
|
||||
of the tetrahedra. The argument `radius_bound` is a uniform upper bound
|
||||
for the circumradii of the tetrahedra in the mesh. See
|
||||
section \ref introsecparam for further details.
|
||||
Note that if one parameter is set to 0, then its corresponding criteria is ignored.
|
||||
* Returns an object to serve as default criteria for cells.
|
||||
* @param radius_edge_bound is the upper bound for the radius-edge ratio
|
||||
* of the tetrahedra.
|
||||
* @param radius_bound is a uniform upper bound
|
||||
* for the circumradii of the tetrahedra in the mesh. See
|
||||
* section \ref introsecparam for further details.
|
||||
* @param min_radius_bound is a uniform lower bound for the
|
||||
* circumradii of the tetrahedra in the mesh.
|
||||
* Only cells with a circumradius larger than that
|
||||
* bound will be refined.
|
||||
* Note that if one parameter is set to 0, then its corresponding criteria is ignored.
|
||||
*/
|
||||
Mesh_cell_criteria_3(const FT& radius_edge_bound,
|
||||
const FT& radius_bound);
|
||||
const FT& radius_bound,
|
||||
const FT& min_radius_bound = 0.);
|
||||
|
||||
/*!
|
||||
Returns an object to serve as default criteria for facets. The type `SizingField` must
|
||||
|
|
@ -54,7 +60,8 @@ as above, except that the radius bound parameter is a functional instead of a co
|
|||
*/
|
||||
template<class SizingField>
|
||||
Mesh_cell_criteria_3(const FT& radius_edge_bound,
|
||||
const SizingField& radius_bound);
|
||||
const SizingField& radius_bound,
|
||||
const FT& min_radius_bound = 0.);
|
||||
|
||||
/// @}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,11 +53,15 @@ of the surface mesh facets.
|
|||
which have to be verified by each surface facet. See
|
||||
section \ref Mesh_3DelaunayRefinement for further details.
|
||||
Note that if one parameter is set to 0, then its corresponding criteria is ignored.
|
||||
\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
|
||||
bound will be refined.
|
||||
*/
|
||||
Mesh_facet_criteria_3(const FT& angle_bound,
|
||||
const FT& radius_bound,
|
||||
const FT& distance_bound,
|
||||
Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE);
|
||||
Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE,
|
||||
const FT& min_radius_bound = 0.);
|
||||
|
||||
/*!
|
||||
Returns an object to serve as criteria for facets. The types `SizingField` and
|
||||
|
|
@ -69,7 +73,8 @@ as above, except that the radius and distance bound parameters are functionals i
|
|||
Mesh_facet_criteria_3(const FT& angle_bound,
|
||||
const SizingField& radius_bound,
|
||||
const DistanceField& distance_bound,
|
||||
Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE);
|
||||
Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE,
|
||||
const FT& min_radius_bound = 0.);
|
||||
|
||||
/// @}
|
||||
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ if(TARGET CGAL::CGAL_ImageIO)
|
|||
target_link_libraries(mesh_3D_image_variable_size
|
||||
PUBLIC CGAL::Eigen3_support)
|
||||
|
||||
find_package(ITK QUIET COMPONENTS ITKCommon ITKThresholding ITKSmoothing ITKImageIntensity)
|
||||
find_package(ITK NAMES ITK InsightToolkit QUIET COMPONENTS ITKCommon ITKThresholding ITKSmoothing ITKImageIntensity)
|
||||
if(ITK_FOUND)
|
||||
include(CGAL_ITK_support)
|
||||
create_single_source_cgal_program("mesh_3D_weighted_image.cpp")
|
||||
|
|
|
|||
|
|
@ -142,12 +142,20 @@ class Cell_uniform_size_criterion
|
|||
|
||||
public:
|
||||
// Constructor
|
||||
Cell_uniform_size_criterion(const FT& radius_bound)
|
||||
: sq_radius_bound_(radius_bound*radius_bound) {}
|
||||
Cell_uniform_size_criterion(const FT& radius_bound,
|
||||
const bool is_lower_bound = false)
|
||||
: sq_radius_bound_(radius_bound*radius_bound)
|
||||
, is_lower_bound_(is_lower_bound)
|
||||
{}
|
||||
|
||||
// Destructor
|
||||
~Cell_uniform_size_criterion() {}
|
||||
|
||||
bool is_lower_bound() const
|
||||
{
|
||||
return is_lower_bound_;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void do_accept(Visitor_& v) const
|
||||
{
|
||||
|
|
@ -182,11 +190,19 @@ protected:
|
|||
|
||||
const FT size = sq_radius(p, q, r, s);
|
||||
|
||||
if ( size > sq_radius_bound_ )
|
||||
if (!is_lower_bound() && size > sq_radius_bound_ )
|
||||
{
|
||||
#ifdef CGAL_MESH_3_DEBUG_CELL_CRITERIA
|
||||
std::cerr << "bad cell " << (void*)(ch.operator->()) << " (radius bound): size[" << size
|
||||
<< "] bound[" << sq_radius_bound_ << "]\n" ;
|
||||
#endif
|
||||
return Is_bad(Quality(sq_radius_bound_/ size));
|
||||
}
|
||||
else if(is_lower_bound() && size <= sq_radius_bound_)
|
||||
{
|
||||
#ifdef CGAL_MESH_3_DEBUG_FACET_CRITERIA
|
||||
std::cerr << "Cell too small (uniform size): sq_radius[" << size
|
||||
<< "] bound[" << B_ << "]\n";
|
||||
#endif
|
||||
return Is_bad(Quality(sq_radius_bound_/size));
|
||||
}
|
||||
|
|
@ -196,6 +212,7 @@ protected:
|
|||
|
||||
private:
|
||||
FT sq_radius_bound_;
|
||||
const bool is_lower_bound_;
|
||||
|
||||
}; // end class Cell_uniform_size_criterion
|
||||
|
||||
|
|
@ -378,11 +395,6 @@ class Cell_criteria_visitor_with_features
|
|||
typedef Criterion_visitor<Tr, typename Tr::Cell_handle> Base;
|
||||
typedef Cell_criteria_visitor_with_features<Tr> Self;
|
||||
|
||||
|
||||
typedef Abstract_criterion<Tr, Self> Criterion;
|
||||
typedef Mesh_3::Cell_size_criterion<Tr, Self> Cell_size_criterion;
|
||||
typedef Mesh_3::Cell_radius_edge_criterion<Tr, Self> Cell_radius_edge_criterion;
|
||||
|
||||
typedef typename Tr::Geom_traits Gt;
|
||||
typedef typename Gt::FT FT;
|
||||
typedef typename Tr::Weighted_point Weighted_point;
|
||||
|
|
@ -501,7 +513,8 @@ public:
|
|||
~Cell_criteria_visitor_with_features() {}
|
||||
|
||||
// visit functions
|
||||
void visit(const Cell_size_criterion& criterion)
|
||||
template<typename T, typename V>
|
||||
void visit(const Mesh_3::Cell_size_criterion<T,V>& criterion)
|
||||
{
|
||||
if ( ratio_ < size_ratio_
|
||||
&& (do_spheres_intersect_ || 1 == wp_nb_) )
|
||||
|
|
@ -513,7 +526,8 @@ public:
|
|||
Base::do_visit(criterion);
|
||||
}
|
||||
|
||||
void visit(const Cell_radius_edge_criterion& criterion)
|
||||
template<typename T, typename V>
|
||||
void visit(const Mesh_3::Cell_radius_edge_criterion<T,V>& criterion)
|
||||
{
|
||||
if ( (wp_nb_ >= 2 && do_spheres_intersect_)
|
||||
|| 1 == wp_nb_ )
|
||||
|
|
@ -525,7 +539,8 @@ public:
|
|||
Base::do_visit(criterion);
|
||||
}
|
||||
|
||||
void visit(const Criterion& criterion)
|
||||
template<typename T, typename V>
|
||||
void visit(const Abstract_criterion<T,V>& criterion)
|
||||
{
|
||||
Base::do_visit(criterion);
|
||||
}
|
||||
|
|
@ -535,9 +550,74 @@ private:
|
|||
bool do_spheres_intersect_;
|
||||
FT ratio_;
|
||||
FT size_ratio_;
|
||||
}; // end class Cell_criterion_visitor
|
||||
}; // end class Cell_criteria_visitor_with_features
|
||||
|
||||
|
||||
template<typename Tr>
|
||||
class Cell_criterion_visitor_with_radius_lower_bound
|
||||
: public Cell_criteria_visitor_with_features<Tr>
|
||||
{
|
||||
typedef Cell_criteria_visitor_with_features<Tr> Base;
|
||||
typedef Cell_criterion_visitor_with_radius_lower_bound<Tr> Self;
|
||||
|
||||
typedef typename Tr::Geom_traits Gt;
|
||||
typedef typename Gt::FT FT;
|
||||
|
||||
public:
|
||||
typedef typename Base::Quality Cell_quality;
|
||||
typedef typename Base::Is_bad Is_cell_bad;
|
||||
typedef typename Base::Handle Handle;
|
||||
typedef Handle Cell_handle;
|
||||
|
||||
// Constructor
|
||||
Cell_criterion_visitor_with_radius_lower_bound(const Tr& tr,
|
||||
const Cell_handle& ch)
|
||||
: Base(tr, ch)
|
||||
, dont_go_further_(false)
|
||||
{}
|
||||
|
||||
Is_cell_bad is_bad() const
|
||||
{
|
||||
if (dont_go_further_)
|
||||
return Is_cell_bad();
|
||||
else
|
||||
return Base::is_bad();
|
||||
}
|
||||
|
||||
bool go_further() const
|
||||
{
|
||||
if (dont_go_further_)
|
||||
return false;
|
||||
else
|
||||
return Base::go_further();
|
||||
}
|
||||
|
||||
// visit functions
|
||||
template<typename Criterion>
|
||||
void visit(const Criterion& criterion)
|
||||
{
|
||||
Base::visit(criterion);
|
||||
}
|
||||
|
||||
template<typename T, typename V>
|
||||
void visit(const Mesh_3::Abstract_criterion<T, V>& criterion)
|
||||
{
|
||||
Base::visit(criterion);
|
||||
}
|
||||
|
||||
template<typename T, typename V>
|
||||
void visit(const Mesh_3::Cell_uniform_size_criterion<T, V>& criterion)
|
||||
{
|
||||
Base::visit(criterion);
|
||||
|
||||
if (criterion.is_lower_bound() && Base::is_bad())
|
||||
dont_go_further_ = true;
|
||||
}
|
||||
|
||||
private:
|
||||
bool dont_go_further_;
|
||||
|
||||
};// end class Cell_criterion_visitor_with_radius_lower_bound
|
||||
|
||||
} // end namespace Mesh_3
|
||||
|
||||
|
|
|
|||
|
|
@ -398,7 +398,16 @@ private:
|
|||
public:
|
||||
// Nb: the default bound of the criterion is such that the criterion
|
||||
// is always fulfilled
|
||||
Uniform_size_criterion(const FT b = 1e20) : B_(b * b) {}
|
||||
Uniform_size_criterion(const FT b = 1e20,
|
||||
const bool is_lower_bound = false)
|
||||
: B_(b * b)
|
||||
, is_lower_bound_(is_lower_bound)
|
||||
{}
|
||||
|
||||
bool is_lower_bound() const
|
||||
{
|
||||
return is_lower_bound_;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void do_accept(Visitor_& v) const
|
||||
|
|
@ -429,11 +438,19 @@ protected:
|
|||
|
||||
const FT sq_radius = tr.min_squared_distance(p1, ball_center);
|
||||
|
||||
if ( sq_radius > B_ )
|
||||
if (!is_lower_bound() && sq_radius > B_ )
|
||||
{
|
||||
#ifdef CGAL_MESH_3_DEBUG_FACET_CRITERIA
|
||||
std::cerr << "Bad facet (uniform size): sq_radius[" << sq_radius
|
||||
<< "] bound[" << B_ << "]\n";
|
||||
#endif
|
||||
return Is_bad(Quality(B_/sq_radius));
|
||||
}
|
||||
else if(is_lower_bound() && sq_radius <= B_)
|
||||
{
|
||||
#ifdef CGAL_MESH_3_DEBUG_FACET_CRITERIA
|
||||
std::cerr << "Facet too small (uniform size): sq_radius[" << sq_radius
|
||||
<< "] bound[" << B_ << "]\n";
|
||||
#endif
|
||||
return Is_bad(Quality(B_/sq_radius));
|
||||
}
|
||||
|
|
@ -443,6 +460,7 @@ protected:
|
|||
|
||||
private:
|
||||
FT B_;
|
||||
const bool is_lower_bound_;
|
||||
|
||||
}; // end Uniform_size_criterion
|
||||
|
||||
|
|
@ -635,13 +653,6 @@ class Facet_criterion_visitor_with_features
|
|||
typedef Mesh_3::Criterion_visitor<Tr, typename Tr::Facet> Base;
|
||||
typedef Facet_criterion_visitor_with_features<Tr> Self;
|
||||
|
||||
typedef Mesh_3::Abstract_criterion<Tr, Self> Criterion;
|
||||
typedef Mesh_3::Curvature_size_criterion<Tr, Self> Curvature_size_criterion;
|
||||
typedef Mesh_3::Aspect_ratio_criterion<Tr, Self> Aspect_ratio_criterion;
|
||||
typedef Mesh_3::Facet_on_surface_criterion<Tr, Self> Facet_on_surface_criterion;
|
||||
typedef Mesh_3::Facet_size_criterion<Tr, Self> Facet_size_criterion;
|
||||
typedef Mesh_3::Facet_on_same_surface_criterion<Tr, Self> Facet_on_same_surface_criterion;
|
||||
|
||||
typedef typename Tr::Geom_traits Gt;
|
||||
typedef typename Gt::FT FT;
|
||||
|
||||
|
|
@ -736,11 +747,9 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
// Destructor
|
||||
~Facet_criterion_visitor_with_features() {}
|
||||
|
||||
// visit functions
|
||||
void visit(const Criterion& criterion)
|
||||
template<typename T, typename V>
|
||||
void visit(const Mesh_3::Abstract_criterion<T, V>& criterion)
|
||||
{
|
||||
if ( 3 == wp_nb_ && do_spheres_intersect_ )
|
||||
{
|
||||
|
|
@ -751,7 +760,8 @@ public:
|
|||
Base::do_visit(criterion);
|
||||
}
|
||||
|
||||
void visit(const Curvature_size_criterion& criterion)
|
||||
template<typename T, typename V>
|
||||
void visit(const Mesh_3::Curvature_size_criterion<T, V>& criterion)
|
||||
{
|
||||
if ( ratio_ < approx_ratio_
|
||||
&& (do_spheres_intersect_ || 1 == wp_nb_ ) )
|
||||
|
|
@ -763,7 +773,8 @@ public:
|
|||
Base::do_visit(criterion);
|
||||
}
|
||||
|
||||
void visit(const Aspect_ratio_criterion& criterion)
|
||||
template<typename T, typename V>
|
||||
void visit(const Mesh_3::Aspect_ratio_criterion<T, V>& criterion)
|
||||
{
|
||||
if ( ratio_ < angle_ratio_
|
||||
&& (do_spheres_intersect_ || 1 == wp_nb_) )
|
||||
|
|
@ -775,7 +786,8 @@ public:
|
|||
Base::do_visit(criterion);
|
||||
}
|
||||
|
||||
void visit(const Facet_size_criterion& criterion)
|
||||
template<typename T, typename V>
|
||||
void visit(const Mesh_3::Facet_size_criterion<T, V>& criterion)
|
||||
{
|
||||
if ( ratio_ < size_ratio_
|
||||
&& (do_spheres_intersect_ || 1 == wp_nb_) )
|
||||
|
|
@ -798,6 +810,74 @@ private:
|
|||
}; // end class Facet_criterion_visitor
|
||||
|
||||
|
||||
template <typename Tr>
|
||||
class Facet_criterion_visitor_with_radius_lower_bound
|
||||
: public Facet_criterion_visitor_with_features<Tr>
|
||||
{
|
||||
typedef Facet_criterion_visitor_with_features<Tr> Base;
|
||||
typedef Facet_criterion_visitor_with_radius_lower_bound<Tr> Self;
|
||||
|
||||
typedef typename Tr::Geom_traits Gt;
|
||||
typedef typename Gt::FT FT;
|
||||
|
||||
public:
|
||||
typedef typename Base::Quality Facet_quality;
|
||||
typedef typename Base::Is_bad Is_facet_bad;
|
||||
typedef typename Base::Handle Handle;
|
||||
typedef Handle Facet;
|
||||
|
||||
// Constructor
|
||||
Facet_criterion_visitor_with_radius_lower_bound(const Tr& tr, const Facet& fh)
|
||||
: Base(tr, fh)
|
||||
, dont_go_further_(false)
|
||||
{}
|
||||
|
||||
Is_facet_bad is_bad() const
|
||||
{
|
||||
if (dont_go_further_)
|
||||
return Is_facet_bad();
|
||||
else
|
||||
return Base::is_bad();
|
||||
}
|
||||
|
||||
bool go_further() const
|
||||
{
|
||||
if (dont_go_further_)
|
||||
return false;
|
||||
else
|
||||
return Base::go_further();
|
||||
}
|
||||
|
||||
// visit functions
|
||||
template<typename Criterion>
|
||||
void visit(const Criterion& criterion)
|
||||
{
|
||||
Base::visit(criterion);
|
||||
}
|
||||
|
||||
template<typename T, typename V>
|
||||
void visit(const Mesh_3::Abstract_criterion<T, V>& criterion)
|
||||
{
|
||||
Base::visit(criterion);
|
||||
}
|
||||
|
||||
template<typename T, typename V>
|
||||
void visit(const Mesh_3::Uniform_size_criterion<T, V>& criterion)
|
||||
{
|
||||
Base::visit(criterion);
|
||||
|
||||
if (criterion.is_lower_bound() && Base::is_bad())
|
||||
dont_go_further_ = true;
|
||||
}
|
||||
|
||||
private:
|
||||
bool dont_go_further_;
|
||||
|
||||
|
||||
};// end class Facet_criterion_visitor_with_radius_lower_bound
|
||||
|
||||
|
||||
|
||||
} // end namespace Mesh_3
|
||||
|
||||
} // end namespace CGAL
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
namespace CGAL {
|
||||
|
||||
template <typename Tr,
|
||||
typename Visitor_ = Mesh_3::Cell_criteria_visitor_with_features<Tr> >
|
||||
typename Visitor_ = Mesh_3::Cell_criterion_visitor_with_radius_lower_bound<Tr> >
|
||||
class Mesh_cell_criteria_3
|
||||
{
|
||||
public:
|
||||
|
|
@ -53,8 +53,12 @@ public:
|
|||
* @param radius_bound the radius bound (tet sizing)
|
||||
*/
|
||||
Mesh_cell_criteria_3(const FT& radius_edge_bound,
|
||||
const FT& radius_bound)
|
||||
const FT& radius_bound,
|
||||
const FT& min_radius_bound = 0.)
|
||||
{
|
||||
if (FT(0) != min_radius_bound)
|
||||
init_min_radius(min_radius_bound);
|
||||
|
||||
if ( FT(0) != radius_bound )
|
||||
init_radius(radius_bound);
|
||||
|
||||
|
|
@ -67,11 +71,15 @@ public:
|
|||
template <typename Sizing_field>
|
||||
Mesh_cell_criteria_3(const FT& radius_edge_bound,
|
||||
const Sizing_field& radius_bound,
|
||||
const FT& min_radius_bound = 0.,
|
||||
std::enable_if_t<
|
||||
Mesh_3::Is_mesh_domain_field_3<Tr,Sizing_field>::value
|
||||
>* = 0
|
||||
)
|
||||
{
|
||||
if (FT(0) != min_radius_bound)
|
||||
init_min_radius(min_radius_bound);
|
||||
|
||||
init_radius(radius_bound);
|
||||
|
||||
if ( FT(0) != radius_edge_bound )
|
||||
|
|
@ -118,6 +126,13 @@ private:
|
|||
criteria_.add(new Radius_criterion(radius_bound));
|
||||
}
|
||||
|
||||
void init_min_radius(const FT& min_radius_bound)
|
||||
{
|
||||
typedef Mesh_3::Cell_uniform_size_criterion<Tr, Visitor> Radius_criterion;
|
||||
criteria_.add(new Radius_criterion(min_radius_bound, true/*lower bound*/));
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
Criteria criteria_;
|
||||
|
||||
|
|
|
|||
|
|
@ -78,12 +78,14 @@ public:
|
|||
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::facet_sizing_field_param),
|
||||
parameters::choose_parameter(parameters::get_parameter(np, internal_np::sizing_field_param), FT(0)))),
|
||||
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::facet_distance_param), FT(0)),
|
||||
parameters::choose_parameter(parameters::get_parameter(np, internal_np::facet_topology_param), CGAL::FACET_VERTICES_ON_SURFACE)),
|
||||
parameters::choose_parameter(parameters::get_parameter(np, internal_np::facet_topology_param), CGAL::FACET_VERTICES_ON_SURFACE),
|
||||
parameters::choose_parameter(parameters::get_parameter(np, internal_np::facet_min_size_param), FT(0))),
|
||||
cell_criteria_(parameters::choose_parameter(parameters::get_parameter(np, internal_np::cell_radius_edge_ratio_param),
|
||||
parameters::choose_parameter(parameters::get_parameter(np, internal_np::cell_radius_edge_param), FT(0))),
|
||||
parameters::choose_parameter(parameters::get_parameter(np, internal_np::cell_size_param),
|
||||
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::cell_sizing_field_param),
|
||||
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::sizing_field_param), FT(0)))))
|
||||
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::sizing_field_param), FT(0)))),
|
||||
parameters::choose_parameter(parameters::get_parameter(np, internal_np::cell_min_size_param), FT(0)))
|
||||
{ }
|
||||
|
||||
#ifndef CGAL_NO_DEPRECATED_CODE
|
||||
|
|
@ -261,6 +263,12 @@ typedef Mesh_cell_criteria_3<Tr> Cell_criteria;
|
|||
* \cgalParamDescription{a scalar field (resp. a constant) describing
|
||||
* a space varying (resp. a uniform) upper-bound or for the radii of the surface Delaunay balls.}
|
||||
* \cgalParamNEnd
|
||||
* \cgalParamNBegin{facet_min_size}
|
||||
* \cgalParamDescription{a constant describing a uniform lower-bound for the radii of the surface Delaunay balls.
|
||||
* Only facets with a radius larger than this bound will be refined.
|
||||
* If a facet is too small with respect to this criterion,
|
||||
* it will not be refined whether the other criteria are met or not.}
|
||||
* \cgalParamNEnd
|
||||
* \cgalParamNBegin{facet_distance}
|
||||
* \cgalParamDescription{a scalar field (resp. a constant) describing a space varying (resp. a uniform)
|
||||
* upper bound for the distance between the facet circumcenter and the center of its surface
|
||||
|
|
@ -279,6 +287,13 @@ typedef Mesh_cell_criteria_3<Tr> Cell_criteria;
|
|||
* \cgalParamDescription{ a scalar field (resp. a constant) describing
|
||||
* a space varying (resp. a uniform) upper-bound for the circumradii of the mesh tetrahedra.}
|
||||
* \cgalParamNEnd
|
||||
* \cgalParamNBegin{cell_min_size}
|
||||
* \cgalParamDescription{ a constant describing a uniform lower-bound for the radii of the circumradii
|
||||
* of the mesh tetrahedra.
|
||||
* Only tetrahedra with a circumradius larger than this bound will be refined.
|
||||
* If a cell is too small with respect to this criterion,
|
||||
* it will not be refined whether the other criteria are met or not.}
|
||||
* \cgalParamNEnd
|
||||
* \cgalNamedParamsEnd
|
||||
*/
|
||||
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
namespace CGAL {
|
||||
|
||||
template<typename Tr,
|
||||
typename Visitor_ = Mesh_3::Facet_criterion_visitor_with_features<Tr> >
|
||||
typename Visitor_ = Mesh_3::Facet_criterion_visitor_with_radius_lower_bound<Tr> >
|
||||
class Mesh_facet_criteria_3
|
||||
{
|
||||
public:
|
||||
|
|
@ -55,9 +55,12 @@ public:
|
|||
Mesh_facet_criteria_3(const FT& angle_bound,
|
||||
const Sizing_field & radius_bound,
|
||||
const Sizing_field2& distance_bound,
|
||||
const Mesh_facet_topology topology =
|
||||
FACET_VERTICES_ON_SURFACE)
|
||||
const Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE,
|
||||
const FT& min_radius_bound = 0.)
|
||||
{
|
||||
if (FT(0) != min_radius_bound)
|
||||
init_min_radius(min_radius_bound);
|
||||
|
||||
if ( FT(0) != angle_bound )
|
||||
init_aspect(angle_bound);
|
||||
|
||||
|
|
@ -113,6 +116,12 @@ private:
|
|||
criteria_.add(new Variable_size_criterion(radius_bound));
|
||||
}
|
||||
|
||||
void init_min_radius(const FT& min_radius_bound)
|
||||
{
|
||||
typedef Mesh_3::Uniform_size_criterion<Tr, Visitor> Uniform_size_criterion;
|
||||
criteria_.add(new Uniform_size_criterion(min_radius_bound, true/*lower bound*/));
|
||||
}
|
||||
|
||||
void init_distance(const FT& distance_bound, Tag_false)
|
||||
{
|
||||
if(FT(0) == distance_bound) return;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ if(CGAL_ImageIO_USE_ZLIB)
|
|||
create_single_source_cgal_program( "test_meshing_3D_image_with_features.cpp" )
|
||||
create_single_source_cgal_program( "test_meshing_3D_gray_image.cpp" )
|
||||
create_single_source_cgal_program( "test_meshing_3D_gray_image_deprecated.cpp" )
|
||||
create_single_source_cgal_program( "test_min_size_criteria.cpp")
|
||||
else()
|
||||
message(STATUS "NOTICE: The test 'test_meshing_3D_image' requires the ZLIB library, and will not be compiled.")
|
||||
endif()
|
||||
|
|
@ -82,7 +83,9 @@ foreach(target
|
|||
test_mesh_3_issue_1554
|
||||
test_mesh_polyhedral_domain_with_features_deprecated
|
||||
test_mesh_cell_base_3
|
||||
test_meshing_with_one_step.cpp)
|
||||
test_meshing_with_one_step
|
||||
test_min_size_criteria
|
||||
)
|
||||
if(TARGET ${target})
|
||||
target_link_libraries(${target} PUBLIC CGAL::Eigen3_support)
|
||||
endif()
|
||||
|
|
@ -105,6 +108,7 @@ if(TARGET CGAL::TBB_support)
|
|||
test_mesh_3_issue_1554
|
||||
test_mesh_polyhedral_domain_with_features_deprecated
|
||||
test_mesh_cell_base_3
|
||||
test_min_size_criteria
|
||||
)
|
||||
if(TARGET ${target})
|
||||
target_link_libraries(${target} PUBLIC CGAL::TBB_support)
|
||||
|
|
|
|||
|
|
@ -141,12 +141,15 @@ int main()
|
|||
Mc fc10(facet_angle = 10.1,
|
||||
facet_distance = 10.2,
|
||||
facet_size = 10.3,
|
||||
facet_min_size = 0.2,
|
||||
facet_sizing_field = Fsf(10.4),
|
||||
sizing_field = 10.5);
|
||||
|
||||
// Test construction from int
|
||||
Mc fc11(facet_size = 11);
|
||||
Mc fc11b(facet_size = 11, facet_min_size = 1);
|
||||
Mc fc12(facet_sizing_field = 12);
|
||||
Mc fc12b(facet_sizing_field = 12, facet_min_size = 2);
|
||||
Mc fc13(sizing_field = 13);
|
||||
|
||||
// Test topological criterion creation
|
||||
|
|
@ -197,11 +200,14 @@ int main()
|
|||
sizing_field = Csf(9.2) );
|
||||
Mc cc10(cell_radius_edge_ratio = 10.1,
|
||||
cell_size = 10.2,
|
||||
cell_min_size = 0.1,
|
||||
cell_sizing_field = Csf(10.3),
|
||||
sizing_field = 10.4);
|
||||
|
||||
// Test construction from int
|
||||
Mc cc11(cell_size = 11);
|
||||
Mc cc11b(cell_size = 11, cell_min_size = 1);
|
||||
Mc cc12(cell_sizing_field = 12);
|
||||
Mc cc12b(cell_sizing_field = 12, cell_min_size = 2);
|
||||
Mc cc13(sizing_field = 13);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,148 @@
|
|||
// Copyright (c) 2009 INRIA Sophia-Antipolis (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org).
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
//
|
||||
// Author(s) : Jane Tournois
|
||||
//
|
||||
//******************************************************************************
|
||||
// File Description :
|
||||
//
|
||||
//******************************************************************************
|
||||
|
||||
#include "test_meshing_utilities.h"
|
||||
|
||||
#include <CGAL/Image_3.h>
|
||||
#include <CGAL/Labeled_mesh_domain_3.h>
|
||||
#include <CGAL/use.h>
|
||||
#include <CGAL/Mesh_criteria_3.h>
|
||||
|
||||
template <typename Concurrency_tag = CGAL::Sequential_tag>
|
||||
struct Image_tester : public Tester<K_e_i>
|
||||
{
|
||||
public:
|
||||
void image() const
|
||||
{
|
||||
using Image = CGAL::Image_3;
|
||||
using Mesh_domain = CGAL::Labeled_mesh_domain_3<K_e_i>;
|
||||
|
||||
using Tr = typename CGAL::Mesh_triangulation_3<
|
||||
Mesh_domain,
|
||||
CGAL::Kernel_traits<Mesh_domain>::Kernel,
|
||||
Concurrency_tag>::type;
|
||||
using C3t3 = CGAL::Mesh_complex_3_in_triangulation_3<Tr>;
|
||||
|
||||
using Gt = typename Tr::Geom_traits;
|
||||
using FT = typename Tr::Geom_traits::FT;
|
||||
using Bare_point = typename Tr::Bare_point;
|
||||
|
||||
using Mesh_criteria = CGAL::Mesh_criteria_3<Tr>;
|
||||
using Facet_criteria = typename Mesh_criteria::Facet_criteria;
|
||||
using Cell_criteria = typename Mesh_criteria::Cell_criteria;
|
||||
|
||||
//-------------------------------------------------------
|
||||
// Data generation
|
||||
//-------------------------------------------------------
|
||||
Image image;
|
||||
image.read(CGAL::data_file_path("images/liver.inr.gz"));
|
||||
|
||||
std::cout << "\tSeed is\t"
|
||||
<< CGAL::get_default_random().get_seed() << std::endl;
|
||||
Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain
|
||||
(image,
|
||||
CGAL::parameters::relative_error_bound = 1e-9,
|
||||
CGAL::parameters::p_rng = &CGAL::get_default_random());
|
||||
|
||||
// Set mesh criteria
|
||||
const double fangle = 25;
|
||||
const double fsize = 20 * image.vx();
|
||||
const double fapprox = image.vx();
|
||||
const CGAL::Mesh_facet_topology ftopo = CGAL::FACET_VERTICES_ON_SURFACE;
|
||||
const double fminsize = 0.5 * image.vx();
|
||||
|
||||
const double cshape = 4.;
|
||||
const double csize = 25 * image.vx();
|
||||
const double cminsize = 0.5 * image.vx();
|
||||
|
||||
Facet_criteria facet_criteria(fangle, fsize, fapprox, ftopo, fminsize);
|
||||
Cell_criteria cell_criteria(cshape, csize, cminsize);
|
||||
Mesh_criteria criteria(facet_criteria, cell_criteria);
|
||||
|
||||
// Mesh generation
|
||||
C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria,
|
||||
CGAL::parameters::no_exude(),
|
||||
CGAL::parameters::no_perturb());
|
||||
|
||||
const Tr& tr = c3t3.triangulation();
|
||||
typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object();
|
||||
typename Gt::Compute_squared_radius_3 sq_radius = tr.geom_traits().compute_squared_radius_3_object();
|
||||
|
||||
double max_sq_facet_radius = 0.;
|
||||
double max_sq_cell_radius = 0.;
|
||||
|
||||
for (auto f : c3t3.facets_in_complex())
|
||||
{
|
||||
const Bare_point p1 = cp(tr.point(f.first, (f.second + 1) & 3));
|
||||
const Bare_point& ball_center = f.first->get_facet_surface_center(f.second);
|
||||
|
||||
const FT sqr = tr.min_squared_distance(p1, ball_center);
|
||||
max_sq_facet_radius = (std::max)(max_sq_facet_radius, sqr);
|
||||
}
|
||||
|
||||
for (auto c : c3t3.cells_in_complex())
|
||||
{
|
||||
const Bare_point& p = cp(tr.point(c, 0));
|
||||
const Bare_point& q = cp(tr.point(c, 1));
|
||||
const Bare_point& r = cp(tr.point(c, 2));
|
||||
const Bare_point& s = cp(tr.point(c, 3));
|
||||
|
||||
const FT sqr = sq_radius(p, q, r, s);
|
||||
max_sq_cell_radius = (std::max)(max_sq_cell_radius, sqr);
|
||||
}
|
||||
|
||||
const std::size_t nbv = c3t3.triangulation().number_of_vertices();
|
||||
std::cout << "C3t3 initial = " << nbv << std::endl;
|
||||
|
||||
//new criteria with really small facet_size and cell_size
|
||||
//compared to actual elements size
|
||||
const double c3t3_fsize = CGAL::approximate_sqrt(max_sq_facet_radius);
|
||||
const double c3t3_csize = CGAL::approximate_sqrt(max_sq_cell_radius);
|
||||
|
||||
//use the other construction API
|
||||
Mesh_criteria new_criteria(CGAL::parameters::facet_size = 0.01 * c3t3_fsize,
|
||||
CGAL::parameters::facet_min_size = 1.00001 * c3t3_fsize,
|
||||
CGAL::parameters::cell_size = 0.01 * c3t3_csize,
|
||||
CGAL::parameters::cell_min_size = 1.00001 * c3t3_csize);
|
||||
|
||||
CGAL::refine_mesh_3(c3t3, domain, new_criteria,
|
||||
CGAL::parameters::no_perturb(),
|
||||
CGAL::parameters::no_exude());
|
||||
|
||||
const std::size_t nbv2 = c3t3.triangulation().number_of_vertices();
|
||||
std::cout << "C3t3 after refinement = " << nbv2 << std::endl;
|
||||
|
||||
assert(nbv == nbv2);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
Image_tester<> test_epic;
|
||||
std::cerr << "Mesh generation from a 3D image:\n";
|
||||
test_epic.image();
|
||||
|
||||
#ifdef CGAL_LINKED_WITH_TBB
|
||||
Image_tester<CGAL::Parallel_tag> test_epic_p;
|
||||
std::cerr << "Parallel mesh generation from a 3D image:\n";
|
||||
test_epic_p.image();
|
||||
#endif
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -28,7 +28,7 @@ target_link_libraries(
|
|||
${OPENGL_gl_LIBRARY})
|
||||
target_include_directories(mesh_3_plugin PRIVATE include)
|
||||
|
||||
find_package(ITK QUIET COMPONENTS ITKCommon ITKThresholding ITKSmoothing ITKImageIntensity)
|
||||
find_package(ITK NAMES ITK InsightToolkit QUIET COMPONENTS ITKCommon ITKThresholding ITKSmoothing ITKImageIntensity)
|
||||
if(ITK_FOUND)
|
||||
include(CGAL_ITK_support)
|
||||
target_link_libraries(mesh_3_plugin PUBLIC CGAL::ITK_support)
|
||||
|
|
|
|||
|
|
@ -203,7 +203,9 @@ private:
|
|||
int approx_decimals;
|
||||
double edges_sizing;
|
||||
double facets_sizing;
|
||||
double facets_min_sizing;
|
||||
double tets_sizing;
|
||||
double tets_min_sizing;
|
||||
double tets_shape;
|
||||
bool manifold_criterion;
|
||||
CGAL::Mesh_facet_topology facet_topology;
|
||||
|
|
@ -421,6 +423,8 @@ void Mesh_3_plugin::set_defaults() {
|
|||
facets_sizing = get_approximate(diag * 0.05, 2, sizing_decimals);
|
||||
edges_sizing = facets_sizing;
|
||||
tets_sizing = facets_sizing;
|
||||
facets_min_sizing = 0.1 * facets_sizing;
|
||||
tets_min_sizing = 0.1 * tets_sizing;
|
||||
angle = 25.;
|
||||
sharp_edges_angle_bound = 60.;
|
||||
approx = get_approximate(diag * 0.005, 2, approx_decimals);
|
||||
|
|
@ -491,6 +495,11 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
ui.facetSizing,
|
||||
SLOT(setEnabled(bool)));
|
||||
|
||||
connect(ui.noFacetMinSizing,
|
||||
SIGNAL(toggled(bool)),
|
||||
ui.facetMinSizing,
|
||||
SLOT(setEnabled(bool)));
|
||||
|
||||
connect(
|
||||
ui.noAngle, SIGNAL(toggled(bool)), ui.facetAngle, SLOT(setEnabled(bool)));
|
||||
|
||||
|
|
@ -499,6 +508,11 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
ui.tetSizing,
|
||||
SLOT(setEnabled(bool)));
|
||||
|
||||
connect(ui.noTetMinSizing,
|
||||
SIGNAL(toggled(bool)),
|
||||
ui.tetMinSizing,
|
||||
SLOT(setEnabled(bool)));
|
||||
|
||||
connect(ui.noTetShape,
|
||||
SIGNAL(toggled(bool)),
|
||||
ui.tetShape,
|
||||
|
|
@ -556,11 +570,13 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
ui.facetSizing->setRange(diag * 10e-6, // min
|
||||
diag); // max
|
||||
ui.facetSizing->setValue(facets_sizing);
|
||||
ui.facetMinSizing->setValue(facets_min_sizing);
|
||||
ui.edgeSizing->setValue(edges_sizing);
|
||||
|
||||
ui.tetSizing->setRange(diag * 10e-6, // min
|
||||
diag); // max
|
||||
ui.tetSizing->setValue(tets_sizing); // default value
|
||||
ui.tetMinSizing->setValue(tets_min_sizing);
|
||||
|
||||
ui.approx->setRange(diag * 10e-7, // min
|
||||
diag); // max
|
||||
|
|
@ -662,9 +678,11 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
edges_sizing =
|
||||
!ui.noEdgeSizing->isChecked() ? DBL_MAX : ui.edgeSizing->value();
|
||||
facets_sizing = !ui.noFacetSizing->isChecked() ? 0 : ui.facetSizing->value();
|
||||
facets_min_sizing = !ui.noFacetMinSizing->isChecked() ? 0 : ui.facetMinSizing->value();
|
||||
approx = !ui.noApprox->isChecked() ? 0 : ui.approx->value();
|
||||
tets_shape = !ui.noTetShape->isChecked() ? 0 : ui.tetShape->value();
|
||||
tets_sizing = !ui.noTetSizing->isChecked() ? 0 : ui.tetSizing->value();
|
||||
tets_min_sizing = !ui.noTetMinSizing->isChecked() ? 0 : ui.tetMinSizing->value();
|
||||
|
||||
const int pe_ci = ui.protectEdges->currentIndex();
|
||||
protect_borders = ui.protect->isChecked()
|
||||
|
|
@ -739,8 +757,10 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
item_name,
|
||||
angle,
|
||||
facets_sizing,
|
||||
facets_min_sizing,
|
||||
approx,
|
||||
tets_sizing,
|
||||
tets_min_sizing,
|
||||
edges_sizing,
|
||||
tets_shape,
|
||||
protect_features,
|
||||
|
|
@ -757,8 +777,10 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
item_name,
|
||||
angle,
|
||||
facets_sizing,
|
||||
facets_min_sizing,
|
||||
approx,
|
||||
tets_sizing,
|
||||
tets_min_sizing,
|
||||
edges_sizing,
|
||||
tets_shape,
|
||||
protect_features,
|
||||
|
|
@ -781,8 +803,10 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
thread = cgal_code_mesh_3(pFunction,
|
||||
angle,
|
||||
facets_sizing,
|
||||
facets_min_sizing,
|
||||
approx,
|
||||
tets_sizing,
|
||||
tets_min_sizing,
|
||||
edges_sizing,
|
||||
tets_shape,
|
||||
manifold,
|
||||
|
|
@ -821,8 +845,10 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
(img_polylines_item == nullptr) ? plc : img_polylines_item->polylines,
|
||||
angle,
|
||||
facets_sizing,
|
||||
facets_min_sizing,
|
||||
approx,
|
||||
tets_sizing,
|
||||
tets_min_sizing,
|
||||
edges_sizing,
|
||||
tets_shape,
|
||||
protect_features,
|
||||
|
|
|
|||
|
|
@ -39,8 +39,10 @@ Meshing_thread* cgal_code_mesh_3(QList<const SMesh*> pMeshes,
|
|||
QString filename,
|
||||
const double facet_angle,
|
||||
const double facet_sizing,
|
||||
const double facet_min_sizing,
|
||||
const double facet_approx,
|
||||
const double tet_sizing,
|
||||
const double tet_min_sizing,
|
||||
const double edge_size,
|
||||
const double tet_shape,
|
||||
bool protect_features,
|
||||
|
|
@ -120,6 +122,8 @@ Meshing_thread* cgal_code_mesh_3(QList<const SMesh*> pMeshes,
|
|||
param.facet_sizing = facet_sizing;
|
||||
param.facet_approx = facet_approx;
|
||||
param.tet_sizing = tet_sizing;
|
||||
param.facet_min_sizing = facet_min_sizing;
|
||||
param.tet_min_sizing = tet_min_sizing;
|
||||
param.tet_shape = tet_shape;
|
||||
param.edge_sizing = edge_size;
|
||||
param.manifold = manifold;
|
||||
|
|
@ -138,8 +142,10 @@ Meshing_thread* cgal_code_mesh_3(const QList<const SMesh*> pMeshes,
|
|||
QString filename,
|
||||
const double facet_angle,
|
||||
const double facet_sizing,
|
||||
const double facet_min_sizing,
|
||||
const double facet_approx,
|
||||
const double tet_sizing,
|
||||
const double tet_min_sizing,
|
||||
const double edge_size,
|
||||
const double tet_shape,
|
||||
bool protect_features,
|
||||
|
|
@ -214,6 +220,8 @@ Meshing_thread* cgal_code_mesh_3(const QList<const SMesh*> pMeshes,
|
|||
param.facet_sizing = facet_sizing;
|
||||
param.facet_approx = facet_approx;
|
||||
param.tet_sizing = tet_sizing;
|
||||
param.facet_min_sizing = facet_min_sizing;
|
||||
param.tet_min_sizing = tet_min_sizing;
|
||||
param.tet_shape = tet_shape;
|
||||
param.edge_sizing = edge_size;
|
||||
param.manifold = manifold;
|
||||
|
|
@ -233,8 +241,10 @@ Meshing_thread* cgal_code_mesh_3(const QList<const SMesh*> pMeshes,
|
|||
Meshing_thread* cgal_code_mesh_3(const Implicit_function_interface* pfunction,
|
||||
const double facet_angle,
|
||||
const double facet_sizing,
|
||||
const double facet_min_sizing,
|
||||
const double facet_approx,
|
||||
const double tet_sizing,
|
||||
const double tet_min_sizing,
|
||||
const double edge_size,
|
||||
const double tet_shape,
|
||||
const int manifold,
|
||||
|
|
@ -261,8 +271,10 @@ Meshing_thread* cgal_code_mesh_3(const Implicit_function_interface* pfunction,
|
|||
param.protect_features = false;
|
||||
param.facet_angle = facet_angle;
|
||||
param.facet_sizing = facet_sizing;
|
||||
param.facet_min_sizing = facet_min_sizing;
|
||||
param.facet_approx = facet_approx;
|
||||
param.tet_sizing = tet_sizing;
|
||||
param.tet_min_sizing = tet_min_sizing;
|
||||
param.tet_shape = tet_shape;
|
||||
param.edge_sizing = edge_size;
|
||||
param.manifold = manifold;
|
||||
|
|
@ -289,8 +301,10 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage,
|
|||
const Polylines_container& polylines,
|
||||
const double facet_angle,
|
||||
const double facet_sizing,
|
||||
const double facet_min_sizing,
|
||||
const double facet_approx,
|
||||
const double tet_sizing,
|
||||
const double tet_min_sizing,
|
||||
const double edge_size,
|
||||
const double tet_shape,
|
||||
bool protect_features, //detect_polylines
|
||||
|
|
@ -312,8 +326,12 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage,
|
|||
param.detect_connected_components = detect_connected_components;
|
||||
param.facet_angle = facet_angle;
|
||||
param.facet_sizing = facet_sizing;
|
||||
param.facet_min_sizing = facet_min_sizing;
|
||||
param.facet_approx = facet_approx;
|
||||
param.tet_sizing = tet_sizing;
|
||||
param.tet_min_sizing = tet_min_sizing;
|
||||
param.facet_min_sizing = facet_min_sizing;
|
||||
param.tet_min_sizing = tet_min_sizing;
|
||||
param.edge_sizing = edge_size;
|
||||
param.tet_shape = tet_shape;
|
||||
param.manifold = manifold;
|
||||
|
|
|
|||
|
|
@ -26,8 +26,10 @@ Meshing_thread* cgal_code_mesh_3(QList<const SMesh*> pMeshes,
|
|||
QString filename,
|
||||
const double facet_angle,
|
||||
const double facet_sizing,
|
||||
const double facet_min_sizing,
|
||||
const double facet_approx,
|
||||
const double tet_sizing,
|
||||
const double tet_min_sizing,
|
||||
const double edge_size,
|
||||
const double tet_shape,
|
||||
bool protect_features,
|
||||
|
|
@ -41,8 +43,10 @@ Meshing_thread* cgal_code_mesh_3(const QList<const SMesh*> pMeshes,
|
|||
QString filename,
|
||||
const double facet_angle,
|
||||
const double facet_sizing,
|
||||
const double facet_min_sizing,
|
||||
const double facet_approx,
|
||||
const double tet_sizing,
|
||||
const double tet_min_sizing,
|
||||
const double edge_size,
|
||||
const double tet_shape,
|
||||
bool protect_features,
|
||||
|
|
@ -55,8 +59,10 @@ Meshing_thread* cgal_code_mesh_3(const QList<const SMesh*> pMeshes,
|
|||
Meshing_thread* cgal_code_mesh_3(const Implicit_function_interface* pfunction,
|
||||
const double facet_angle,
|
||||
const double facet_sizing,
|
||||
const double facet_min_sizing,
|
||||
const double facet_approx,
|
||||
const double tet_sizing,
|
||||
const double tet_min_sizing,
|
||||
const double edge_size,
|
||||
const double tet_shape,
|
||||
const int manifold,
|
||||
|
|
@ -68,8 +74,10 @@ Meshing_thread* cgal_code_mesh_3(const CGAL::Image_3* pImage,
|
|||
const Polylines_container& polylines,
|
||||
const double facet_angle,
|
||||
const double facet_sizing,
|
||||
const double facet_min_sizing,
|
||||
const double facet_approx,
|
||||
const double tet_sizing,
|
||||
const double tet_min_sizing,
|
||||
const double edge_size,
|
||||
const double tet_shape,
|
||||
bool protect_features,
|
||||
|
|
|
|||
|
|
@ -44,10 +44,12 @@ struct Mesh_parameters
|
|||
{
|
||||
double facet_angle;
|
||||
double facet_sizing;
|
||||
double facet_min_sizing;
|
||||
double facet_approx;
|
||||
|
||||
double tet_shape;
|
||||
double tet_sizing;
|
||||
double tet_min_sizing;
|
||||
double edge_sizing;
|
||||
bool protect_features;
|
||||
bool detect_connected_components;
|
||||
|
|
@ -139,9 +141,11 @@ log() const
|
|||
<< QString("edge max size: %1").arg(edge_sizing)
|
||||
<< QString("facet min angle: %1").arg(facet_angle)
|
||||
<< QString("facet max size: %1").arg(facet_sizing)
|
||||
<< QString("facet min size: %1").arg(facet_min_sizing)
|
||||
<< QString("facet approx error: %1").arg(facet_approx)
|
||||
<< QString("tet shape (radius-edge): %1").arg(tet_shape)
|
||||
<< QString("tet max size: %1").arg(tet_sizing)
|
||||
<< QString("tet min size: %1").arg(tet_min_sizing)
|
||||
<< QString("detect connected components: %1")
|
||||
.arg(detect_connected_components)
|
||||
<< QString("protect features: %1").arg(protect_features);
|
||||
|
|
@ -296,9 +300,12 @@ launch()
|
|||
Mesh_criteria criteria(edge_criteria(p_.edge_sizing, Tag()),
|
||||
Facet_criteria(p_.facet_angle,
|
||||
p_.facet_sizing,
|
||||
p_.facet_approx),
|
||||
p_.facet_approx,
|
||||
CGAL::FACET_VERTICES_ON_SURFACE,
|
||||
p_.facet_min_sizing),
|
||||
Cell_criteria(p_.tet_shape,
|
||||
p_.tet_sizing));
|
||||
p_.tet_sizing,
|
||||
p_.tet_min_sizing));
|
||||
|
||||
tweak_criteria(criteria, Tag());
|
||||
initialize(criteria, Tag());
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>568</width>
|
||||
<height>1049</height>
|
||||
<width>799</width>
|
||||
<height>1231</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
|
|
@ -185,60 +185,15 @@
|
|||
<property name="title">
|
||||
<string>Surface</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2" rowstretch="0,0,0,0,0,0,0,0,0,0" columnstretch="0,1,0">
|
||||
<item row="2" column="2">
|
||||
<widget class="QCheckBox" name="noFacetSizing">
|
||||
<property name="toolTip">
|
||||
<string>Enable/Disable parameter</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2" rowstretch="0,0,0,0,0,0,0,0,0,0,0" columnstretch="0,1,0">
|
||||
<item row="1" column="1">
|
||||
<widget class="DoubleEdit" name="approx">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
<string>0.0017</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="approxLabel">
|
||||
<property name="text">
|
||||
<string>Approximation &error</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>approx</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QCheckBox" name="noApprox">
|
||||
<property name="toolTip">
|
||||
<string>Enable/Disable parameter</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="angleLabel">
|
||||
<property name="text">
|
||||
<string>Facet min. &angle (deg)</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>facetAngle</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="0" colspan="3">
|
||||
<item row="10" column="0" colspan="3">
|
||||
<widget class="QFrame" name="advanced">
|
||||
<property name="visible">
|
||||
<bool>true</bool>
|
||||
|
|
@ -299,15 +254,21 @@
|
|||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QCheckBox" name="checkBox">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="approxLabel">
|
||||
<property name="text">
|
||||
<string>See advanced &controls...</string>
|
||||
<string>Approximation &error</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>approx</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="2">
|
||||
<widget class="QCheckBox" name="noAngle">
|
||||
<item row="1" column="2">
|
||||
<widget class="QCheckBox" name="noApprox">
|
||||
<property name="toolTip">
|
||||
<string>Enable/Disable parameter</string>
|
||||
</property>
|
||||
|
|
@ -319,6 +280,43 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="angleLabel">
|
||||
<property name="text">
|
||||
<string>Facet min. &angle (deg)</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>facetAngle</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QCheckBox" name="checkBox">
|
||||
<property name="text">
|
||||
<string>See advanced &controls...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="DoubleEdit" name="facetAngle">
|
||||
<property name="inputMask">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>25.00</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="DoubleEdit" name="facetSizing">
|
||||
<property name="text">
|
||||
<string>0.065</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="sizingLabel">
|
||||
<property name="text">
|
||||
|
|
@ -332,27 +330,50 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="DoubleEdit" name="facetSizing">
|
||||
<item row="4" column="2">
|
||||
<widget class="QCheckBox" name="noAngle">
|
||||
<property name="toolTip">
|
||||
<string>Enable/Disable parameter</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>0.065</string>
|
||||
<string/>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QCheckBox" name="noFacetSizing">
|
||||
<property name="toolTip">
|
||||
<string>Enable/Disable parameter</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" alignment="Qt::AlignRight">
|
||||
<widget class="QLabel" name="sizingMinLabel">
|
||||
<property name="text">
|
||||
<string>Facet min. size</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="DoubleEdit" name="facetAngle">
|
||||
<property name="inputMask">
|
||||
<string/>
|
||||
</property>
|
||||
<widget class="DoubleEdit" name="facetMinSizing">
|
||||
<property name="text">
|
||||
<string>25.00</string>
|
||||
<string>0.00</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="DoubleEdit" name="approx">
|
||||
<item row="3" column="2">
|
||||
<widget class="QCheckBox" name="noFacetMinSizing">
|
||||
<property name="text">
|
||||
<string>0.0017</string>
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
@ -365,6 +386,33 @@
|
|||
<string>Volume</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_3" columnstretch="0,1,0">
|
||||
<item row="2" column="1">
|
||||
<widget class="DoubleEdit" name="tetShape">
|
||||
<property name="text">
|
||||
<string>3.00</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="DoubleEdit" name="tetSizing">
|
||||
<property name="text">
|
||||
<string>0.00</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="tetSizingLabel">
|
||||
<property name="text">
|
||||
<string>&Tetrahedron max. size</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>tetSizing</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QCheckBox" name="noTetSizing">
|
||||
<property name="toolTip">
|
||||
|
|
@ -378,7 +426,7 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<item row="2" column="2">
|
||||
<widget class="QCheckBox" name="noTetShape">
|
||||
<property name="toolTip">
|
||||
<string>Enable/Disable parameter</string>
|
||||
|
|
@ -391,8 +439,8 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="tetShapeLabel">
|
||||
<property name="text">
|
||||
<string>Tetrahedron shape (radius-edge ratio)</string>
|
||||
</property>
|
||||
|
|
@ -401,30 +449,24 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<item row="1" column="0" alignment="Qt::AlignRight">
|
||||
<widget class="QLabel" name="tetMinSizingLabel">
|
||||
<property name="text">
|
||||
<string>&Tetrahedron max. size</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>tetSizing</cstring>
|
||||
<string>Tetrahedron min. size</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="DoubleEdit" name="tetSizing">
|
||||
<item row="1" column="1">
|
||||
<widget class="DoubleEdit" name="tetMinSizing">
|
||||
<property name="text">
|
||||
<string>0.00</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="DoubleEdit" name="tetShape">
|
||||
<item row="1" column="2">
|
||||
<widget class="QCheckBox" name="noTetMinSizing">
|
||||
<property name="text">
|
||||
<string>3.00</string>
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
|
|||
|
|
@ -340,12 +340,14 @@ CGAL_add_named_parameter_with_compatibility(edge_size_param_t, edge_size_param,
|
|||
CGAL_add_named_parameter_with_compatibility_ref_only(edge_sizing_field_param_t, edge_sizing_field_param, edge_sizing_field)
|
||||
CGAL_add_named_parameter_with_compatibility(facet_angle_param_t, facet_angle_param, facet_angle)
|
||||
CGAL_add_named_parameter_with_compatibility(facet_size_param_t, facet_size_param, facet_size)
|
||||
CGAL_add_named_parameter_with_compatibility(facet_min_size_param_t, facet_min_size_param, facet_min_size)
|
||||
CGAL_add_named_parameter_with_compatibility_ref_only(facet_sizing_field_param_t, facet_sizing_field_param, facet_sizing_field)
|
||||
CGAL_add_named_parameter_with_compatibility_ref_only(facet_distance_param_t, facet_distance_param, facet_distance)
|
||||
CGAL_add_named_parameter_with_compatibility(facet_topology_param_t, facet_topology_param, facet_topology)
|
||||
CGAL_add_named_parameter_with_compatibility(cell_radius_edge_param_t, cell_radius_edge_param, cell_radius_edge)
|
||||
CGAL_add_named_parameter_with_compatibility(cell_radius_edge_ratio_param_t, cell_radius_edge_ratio_param, cell_radius_edge_ratio)
|
||||
CGAL_add_named_parameter_with_compatibility(cell_size_param_t, cell_size_param, cell_size)
|
||||
CGAL_add_named_parameter_with_compatibility(cell_min_size_param_t, cell_min_size_param, cell_min_size)
|
||||
CGAL_add_named_parameter_with_compatibility_ref_only(cell_sizing_field_param_t, cell_sizing_field_param, cell_sizing_field)
|
||||
CGAL_add_named_parameter_with_compatibility_ref_only(sizing_field_param_t, sizing_field_param, sizing_field)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue