使用劳埃德优化和Mesh_domain :: create_labeled_image_mesh_domain

时间:2019-05-20 22:04:30

标签: cgal

我正在使用CGAL 4.13(Linux Fedora 29)从分段的无解剖图像生成3D网格。我想使用劳埃德(Lloyd)优化,但是以可复制的方式出现了运行时错误。

为了说明我的问题,我通过添加Lloyd优化步骤修改了示例 mesh_3D_image.cpp ,如下所示。程序编译时没有错误/警告消息。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>

#include <CGAL/Mesh_triangulation_3.h>
#include <CGAL/Mesh_complex_3_in_triangulation_3.h>
#include <CGAL/Mesh_criteria_3.h> 

#include <CGAL/Labeled_mesh_domain_3.h>
#include <CGAL/make_mesh_3.h>
#include <CGAL/Image_3.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Labeled_mesh_domain_3<K> Mesh_domain;

typedef CGAL::Sequential_tag Concurrency_tag;

typedef CGAL::Mesh_triangulation_3<Mesh_domain,CGAL::Default,Concurrency_tag>::type Tr;
typedef CGAL::Mesh_complex_3_in_triangulation_3<Tr> C3t3;
typedef CGAL::Mesh_criteria_3<Tr> Mesh_criteria; 

using namespace CGAL::parameters;

int main(int argc, char* argv[])
{
  const char* fname = (argc>1)?argv[1]:"data/liver.inr.gz";
  CGAL::Image_3 image;
  Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain(image);
  Mesh_criteria criteria(facet_angle=30, facet_size=6, facet_distance=4,
                     cell_radius_edge_ratio=3, cell_size=8);

  C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria);

  // !!! THE FOLLOWING LINE HAS BEEN ADDED !!!
  CGAL::lloyd_optimize_mesh_3(c3t3, domain, time_limit=30); 

  std::ofstream medit_file("out.mesh");
  c3t3.output_to_medit(medit_file); 

  return 0;
}

不生成网格。我收到以下消息:

  

$ ./build/mesh_3D_image   抛出'CGAL :: Precondition_exception'实例后调用终止     what():CGAL错误:违反前提条件!   Expr:std :: distance(first,last)> = 3   文件:/usr/include/CGAL/Mesh_3/Lloyd_move.h   线:419   中止(核心已弃用)

我的代码错误的地方,如何触发由3D图像生成的网格的优化?

2 个答案:

答案 0 :(得分:1)

实际上,当像这样调用CGAL::make_mesh_3()时:

C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria);

它在内部启动CGAL::perturb_mesh_3()CGAL::exude_mesh_3()。最近一次更改了常规三角剖分中顶点的权重,因此应始终将其称为最后一次(请参见documentation of CGAL::exude_mesh_3()中的警告。

对顺序的唯一限制是应该最后一次调用渗出液。所以你可以打电话

C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria, lloyd(time_limit=30));

C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria, no_exude());
CGAL::lloyd_optimize_mesh_3(c3t3, domain, time_limit = 30);
CGAL::exude_mesh_3(c3t3);

答案 1 :(得分:0)

您删除了该部分:

  if(!image.read(fname)){
    std::cerr << "Error: Cannot read file " <<  fname << std::endl;
    return EXIT_FAILURE;
  }

示例中的内容,实际上是从文件中读取图像的地方。