【发布时间】:2016-05-23 06:54:53
【问题描述】:
下面的代码假设输入是点,而不是线段(这是错误的)。
按照这个2D Voronoi Diagram Adaptor 示例,我正在尝试编写一个程序,该程序将线段作为输入并打印Voronoi 图的各个面的顶点。
这是我的尝试(保留示例的包含/类型定义):
// standard includes
#include <iostream>
#include <fstream>
#include <cassert>
// includes for defining the Voronoi diagram adaptor
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <CGAL/Voronoi_diagram_2.h>
#include <CGAL/Delaunay_triangulation_adaptation_traits_2.h>
#include <CGAL/Delaunay_triangulation_adaptation_policies_2.h>
// typedefs for defining the adaptor
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Delaunay_triangulation_2<K> DT;
typedef CGAL::Delaunay_triangulation_adaptation_traits_2<DT> AT;
typedef CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2<DT> AP;
typedef CGAL::Voronoi_diagram_2<DT,AT,AP> VD;
// typedef for the result type of the point location
typedef AT::Site_2 Site_2;
typedef AT::Point_2 Point_2;
typedef VD::Locate_result Locate_result;
typedef VD::Vertex_handle Vertex_handle;
typedef VD::Face_handle Face_handle;
typedef VD::Halfedge_handle Halfedge_handle;
typedef VD::Ccb_halfedge_circulator Ccb_halfedge_circulator;
int main()
{
std::ifstream ifs("data.cin");
assert( ifs );
VD vd;
Site_2 t;
while ( ifs >> t ) { vd.insert(t); }
ifs.close();
assert( vd.is_valid() );
Face_handle* f = boost::get<Face_handle>(vd);
std::cout << "Exiting...\n";
return 0;
}
这会收到一个编译错误:
/home/gsamaras/CGAL-4.7/code/voronoi_adaptor/voronoi_adaptor.cpp:46:48: error: no matching function for call to ‘get(VD&)’
Face_handle* f = boost::get<Face_handle>(vd);
^
/home/gsamaras/CGAL-4.7/code/voronoi_adaptor/voronoi_adaptor.cpp:46:48: note: candidates are:
In file included from /usr/include/boost/variant.hpp:22:0,
from /home/gsamaras/CGAL-4.7/code/voronoi_adaptor/../../include/CGAL/Object.h:36,
from /home/gsamaras/CGAL-4.7/code/voronoi_adaptor/../../include/CGAL/kernel_basic.h:33,
from /home/gsamaras/CGAL-4.7/code/voronoi_adaptor/../../include/CGAL/basic.h:46,
from /home/gsamaras/CGAL-4.7/code/voronoi_adaptor/../../include/CGAL/Cartesian/Cartesian_base.h:28,
from /home/gsamaras/CGAL-4.7/code/voronoi_adaptor/../../include/CGAL/Simple_cartesian.h:28,
from /home/gsamaras/CGAL-4.7/code/voronoi_adaptor/../../include/CGAL/Exact_predicates_inexact_constructions_kernel.h:28,
from /home/gsamaras/CGAL-4.7/code/voronoi_adaptor/voronoi_adaptor.cpp:6:
/usr/include/boost/variant/get.hpp:141:1: note: template<class U, class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15, class T16, class T17, class T18, class T19> typename boost::add_pointer<T>::type boost::get(boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>*)
get(
^
/usr/include/boost/variant/get.hpp:141:1: note: template argument deduction/substitution failed:
/home/gsamaras/CGAL-4.7/code/voronoi_adaptor/voronoi_adaptor.cpp:46:48: note: mismatched types ‘boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>*’ and ‘CGAL::Voronoi_diagram_2<CGAL::Delaunay_triangulation_2<CGAL::Epick>, CGAL::Delaunay_triangulation_adaptation_traits_2<CGAL::Delaunay_triangulation_2<CGAL::Epick> >, CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2<CGAL::Delaunay_triangulation_2<CGAL::Epick> > >’
Face_handle* f = boost::get<Face_handle>(vd);
^
...
【问题讨论】:
-
您正在使用 boost::get 用于从类型元组中检索类型。尝试使用 bounded_face() 或 unbounded_face()
-
@Jonathan 是的,我知道我的错误。但是,尚不清楚如何使用您的建议。我试过
Face_handle* f = bounded_face(vd);,但它没有编译。 -
我建议你阅读 C++ 类或一般类,vd 是 CGAL::Voronoi_diagram_2
- 的一个实例,该类有一个名为 bounded_face() 的方法。使用类的实例调用类方法看起来像:vd.bounded_face()
-
@Jonathan 我知道c++,但我在手册中找不到该功能,因此我没有立即理解您。现在我找到了。我正在尝试使用
Face_handle f = vd./*un*/bounded_face();,它编译得很好,但由于核心转储而崩溃(但那是因为面数为0)。但是,您的建议很有价值,应该是一个答案。我猜我输入数据的方式应该有问题!
标签: c++ boost computational-geometry cgal voronoi