2017-05-21 24 views
1

我正在使用Point_set_2数据结构为了查找查询点的k个最近邻居,我想检索邻居的索引;我使用了下面的代码,但它 - > info()会产生错误! 我也看到this post,但对我来说,优先使用Point_set_2方法:CGAL:获取最近邻居的信息

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
#include <CGAL/Delaunay_triangulation_2.h> 
#include <CGAL/Triangulation_vertex_base_with_info_2.h> 
#include <CGAL/Point_set_2.h> 
#include <vector> 

typedef CGAL::Exact_predicates_inexact_constructions_kernel  K; 
typedef CGAL::Triangulation_vertex_base_with_info_2<unsigned, K> Vb; 
typedef CGAL::Triangulation_data_structure_2<Vb>     Tds; 
typedef CGAL::Delaunay_triangulation_2<K, Tds>     Delaunay; 
//typedef Delaunay::Point            Point; 
typedef CGAL::Point_set_2<K,Tds>::Edge_iterator     Edge_iterator; 
typedef CGAL::Point_set_2<K,Tds>::Vertex_handle     Vertex_handle; 
typedef K::Point_2            Point_2; 

CGAL::Point_set_2<K,Tds> PSet; 

int main() 
{ 
    std::vector< std::pair<Point_2,unsigned> > points; 
    points.push_back(std::make_pair(Point_2(0,0),0) ); 
    points.push_back(std::make_pair(Point_2(1,0),1) ); 
    points.push_back(std::make_pair(Point_2(0,1),2) ); 
    points.push_back(std::make_pair(Point_2(14,4),3) ); 
    points.push_back(std::make_pair(Point_2(2,2),4) ); 
    points.push_back(std::make_pair(Point_2(-4,0),5) ); 

    PSet.insert(points.begin(),points.end()); 
    // init 
    Point_2 actual(30,45,10); 
    // nearest neighbor ... 
    Vertex_handle v = PSet.nearest_neighbor(actual); 
    std::cout << "Nearest neighbor:" << v->point() << "\n"; 
    // k nearest neighbors ... 
    std::vector<Vertex_handle> L; 
    std::vector<Vertex_handle>::const_iterator it; 
    PSet.nearest_neighbors(actual,5, std::back_inserter(L)); 
    std::cout << "actual point: " << actual << "\n"; 
    for (it=L.begin();it != L.end(); it++) 
     std::cout << it->info() << "\n"; 
    return 0; 
} 

回答

0

一个Vertex_handle大致相当于一个指针。要访问它的数据成员,您必须对其进行解引用或使用->运算符。 如果你有一个向量Vertex_handle,那么迭代器在Vertex_handle 这意味着你必须取消引用迭代器来访问Vertex_handle。你应该写(*it)->info()

也许混淆来自三角测量的迭代器可以隐式转换为句柄类型的事实。