Search code examples
c++cgal

Build CGAL Mesh_criteria one by one


I used to build my CGAL MeshCriteria as follows, and that works well.

auto criteria = Mesh_criteria(
    CGAL::parameters::edge_size=edge_size,
    CGAL::parameters::facet_angle=facet_angle,
    CGAL::parameters::facet_size=facet_size,
    CGAL::parameters::facet_distance=facet_distance,
    CGAL::parameters::cell_radius_edge_ratio=cell_radius_edge_ratio,
    CGAL::parameters::cell_size=size
);

Now I have a function which has only some criteria constraints, other values are invalid (e.g., negative). I would like to build Mesh_criteria as follows (pseudocode), but don't know how to do it:

auto criteria = Mesh_criteria();
if edge_size > 0.0:
    criteria.add(CGAL::parameters::edge_size=edge_size);

if facet_angle > 0.0:
    criteria.add(CGAL::parameters::facet_angle=facet_angle);

// [...]

Any hints?


Solution

  • I don't see any solution but knowing the default values and use the ternary operator ?:.

    Here is a copy paste from the code that will give you the default values:

      template <class ArgumentPack>
      Mesh_criteria_3_impl(const ArgumentPack& args)
        : edge_criteria_(args[parameters::edge_size
                              | args[parameters::edge_sizing_field
                                     | args[parameters::sizing_field | FT(DBL_MAX)] ] ])
        , facet_criteria_(args[parameters::facet_angle | FT(0)],
                          args[parameters::facet_size
                               | args[parameters::facet_sizing_field
                                      | args[parameters::sizing_field | FT(0)] ] ],
                          args[parameters::facet_distance | FT(0)],
                          args[parameters::facet_topology | CGAL::FACET_VERTICES_ON_SURFACE])
        , cell_criteria_(args[parameters::cell_radius_edge_ratio
                              | args[parameters::cell_radius_edge | FT(0)] ],
                         args[parameters::cell_size
                              | args[parameters::cell_sizing_field
                                     | args[parameters::sizing_field | FT(0)] ] ])
      { }