2017-05-21 3 views
1

J'utilise la structure de données Point_set_2 afin de trouver k voisins les plus proches d'un point de requête, je veux récupérer l'index des voisins; J'ai utilisé le code suivant, mais il-> info() produit des erreurs! J'ai aussi vu this post, mais pour moi la priorité est à l'aide méthode Point_set_2:CGAL: obtenir l'information des voisins les plus proches

#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; 
} 

Répondre

0

Un Vertex_handle est à peu près équivalent d'un pointeur. Pour accéder à ce membre de données, vous devez le déréférencer ou utiliser l'opérateur ->. Si vous avez un vecteur de Vertex_handle, alors l'itérateur est sur Vertex_handle ce qui signifie que vous devez déréférencer l'itérateur pour accéder au Vertex_handle. Vous devriez écrire (*it)->info().

Peut-être que la confusion est venue du fait que les itérateurs de la triangulation sont implicitement convertibles en types de poignée.