【问题标题】:Boost error with CGAL SDF algorithm使用 CGAL SDF 算法提升误差
【发布时间】:2015-06-02 13:59:18
【问题描述】:

我目前正在尝试使用 CGAL 的 SDF 算法,但我有一些提升错误,我不知道它来自哪里。我遵循CGAL doc的示例代码

这是我的代码的一部分:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/mesh_segmentation.h>
#include <CGAL/property_map.h>

[...]

    void ShapeDiameterFunction_Component::SDF_Algorithm(PolyhedronPtr pMesh)
    {
        pMesh->triangulate();

        srand((unsigned)time(NULL));

        // create a property-map for segment-ids
        typedef std::map<Polyhedron::Facet_const_handle, std::size_t> Facet_int_map;
        Facet_int_map internal_segment_map;
        boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);

        // calculate SDF values and segment the mesh using default parameters.
        std::size_t number_of_segments = CGAL::segmentation_via_sdf_values(pMesh, segment_property_map);
        std::cout << "Number of segments: " << number_of_segments << std::endl;
    }

我在使用“segmentation_via_sdf_values”函数时遇到错误:

/usr/include/boost/mpl/eval_if.hpp|38|error: no type named ‘type’ in ‘boost::mpl::eval_if<boost::detail::has_vertex_property_type<boost::shared_ptr<Enriched_polyhedron<CGAL::Simple_cartesian<double>, Enriched_items> >, mpl_::bool_<false> >, boost::detail::get_vertex_property_type<boost::shared_ptr<Enriched_polyhedron<CGAL::Simple_cartesian<double>, Enriched_items> > >, boost::no_property>::f_ {aka struct boost::no_property}’|

我不知道它是来自我的 boost 安装还是来自代码本身。 我正在使用 1.55 版本的 libboost-dev 和 4.5.2 版本的 CGAL。 我使用的是 Ubuntu 15.04 版本,我的编译器是 GCC 编译器 4.9.2。

我尝试了 CGAL 文档中的示例是另一个项目,它确实编译了。

[编辑] 这是我的编译器log

谢谢, 玉米棒

【问题讨论】:

  • 您是否修改了示例?如果是,请发布您尝试编译的完整示例。
  • 我创建了一个只有示例代码和 CGAL 库的新项目,它工作正常。我将此代码与MEPP 项目一起使用,但它不起作用。无法发布完整代码,因为它非常大。
  • @CornFlex 请编辑您的问题,以便您可以了解您正在使用的 CGAL 和 Boost 版本,以及操作系统和编译器(名称和版本)。这可能很重要。
  • 使用编译器/OS/CGAL 版本编辑后
  • 感谢@CornFlex。由于我们无法重现您的错误(因为您无法提供代码),我们必须远程调试问题,提出问题。在您的编译器版本或 CGAL 和 Boost 版本中,我没有看到任何异常(或未经测试)。 1/ 我建议你尝试使用 CGAL-4.6。 2/你能复制粘贴到gist.github.com,例如,完整的错误日志(通常错误继续说“...期间检测到:”或解释实例化链。然后编辑你的问题添加完整日志的链接。这可能会有所帮助。

标签: c++ algorithm boost cgal


【解决方案1】:

我发现了我的问题,我使用的是使用 CGAL 库的 MEPP 库。 MEPP 库正在重新定义“Polyhedron”的 typedef 声明,并且发送到 sdf_values 函数的“pMesh”与所需的“Polyhedron”类型不同。 当然,类型是用 boost (eval_if) 检查的,这就是它给我这个错误的原因。

 typedef CGAL::Exact_predicates_inexact_constructions_kernel KernelSDF;
 typedef CGAL::Polyhedron_3<KernelSDF> PolyhedronSDF;

 PolyhedronSDF mesh;

 typedef std::map< PolyhedronSDF::Facet_const_handle, double> Facet_double_map;
 Facet_double_map internal_map;
 boost::associative_property_map<Facet_double_map> sdf_property_map(internal_map);
 // compute SDF values
 std::pair<double, double> min_max_sdf = CGAL::sdf_values(mesh, sdf_property_map);

现在我只需要将我的 pMesh 复制到我的网格对象中!

谢谢。

【讨论】:

  • 请注意,sdf 函数适用于任何多面体类型,只有属性映射应适应多面体类型。
猜你喜欢
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2011-11-15
  • 2011-01-26
  • 1970-01-01
相关资源
最近更新 更多