Выполните ограниченное уточнение с помощью CGAL isotropic_remeshing

Я хотел бы сделать доработку, например, простого куба (из .off); есть несколько способов, но те, которые подходят для того, что я хочу сделать дальше, заканчиваются «морщинами», то есть форма объекта искажается.

Этот способ ниже обещает позволить сохранить границы (форму?) Объекта, позволяя то, что вы ожидаете от уточнения, просто добавить больше ребер и вершин:

http://doc.cgal.org/latest/Polygon_mesh_processing/Polygon_mesh_processing_2isotropic_remeshing_example_8cpp-example.html

Мне нужна карта ограничения края (и если этого недостаточно, мне также нужна карта ограничения вершины), но я не могу достаточно хорошо понять абстракции шаблона. Я попробовал OpenMesh Constrained_edge_map из другого примера CGAL, но он слишком отличается и не компилируется. Я прошу карту краев и, возможно, карту вершин, которую я могу передать вызову:

PMP::isotropic_remeshing( faces(mesh), target_edge_length, mesh, PMP::parameters::number_of_iterations(nb_iter) .protect_constraints(true)//i.e. protect border, here );

Я использую CGAL 4.8.1, самую последнюю на момент написания. Спасибо.


person JDonner    schedule 25.07.2016    source источник
comment
Какую структуру данных вы используете для треугольной сетки?   -  person sloriot    schedule 25.07.2016
comment
Вот моя текущая попытка: pastebin.com/PcY1SLb8 Я пытаюсь записать его как .stl. Я не знал, что мне нужно сделать треугольную форму, я использовал связанный пример. Я использую split_long_edges, но сомневаюсь, что вы это имеете в виду.   -  person JDonner    schedule 25.07.2016


Ответы (1)


Вот минимальный пример изменения сетки триангулированного куба:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/boost/graph/graph_traits_Surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/remesh.h>
#include <CGAL/Mesh_3/dihedral_angle_3.h>
#include <boost/foreach.hpp>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Surface_mesh<K::Point_3>               Mesh;
typedef boost::graph_traits<Mesh>::halfedge_descriptor halfedge_descriptor;
typedef boost::graph_traits<Mesh>::edge_descriptor edge_descriptor;

namespace PMP=CGAL::Polygon_mesh_processing;

int main(int, char* argv[])
{
  std::ifstream input(argv[1]);
  Mesh tmesh;
  input >> tmesh;

  double target_edge_length = 0.20;
  unsigned int nb_iter = 10;

  // give each vertex a name, the default is empty
  Mesh::Property_map<edge_descriptor,bool> is_constrained =
    tmesh.add_property_map<edge_descriptor,bool>("e:is_constrained",false).first;

  //detect sharp features
  BOOST_FOREACH(edge_descriptor e, edges(tmesh))
  {
    halfedge_descriptor hd = halfedge(e,tmesh);
    if ( !is_border(e,tmesh) ){
      double angle = CGAL::Mesh_3::dihedral_angle(tmesh.point(source(hd,tmesh)),
                                                  tmesh.point(target(hd,tmesh)),
                                                  tmesh.point(target(next(hd,tmesh),tmesh)),
                                                  tmesh.point(target(next(opposite(hd,tmesh),tmesh),tmesh)));
      if ( CGAL::abs(angle)<100 )
        is_constrained[e]=true;
    }
  }

  //remesh
  PMP::isotropic_remeshing(
      faces(tmesh),
      target_edge_length,
      tmesh,
      PMP::parameters::number_of_iterations(nb_iter)
      .edge_is_constrained_map(is_constrained) );

  std::ofstream out("out.off");
  out << tmesh;
  return 0;
}
person sloriot    schedule 25.07.2016