2011-01-29 10 views
8

Tôi đang gặp một số khó khăn khi nhận được vertex_handle cho mỗi điểm kết thúc của một cạnh trong một tam giác Delaunay. Kể từ khi tôi rèn đầu tôi chống lại điều này trong vài giờ tôi nghĩ có lẽ một trong những bạn guys có thể giúp tôi ra với vấn đề dường như tầm thường này:Nhận một vertex_handle từ một edge_iterator

#include <iostream> 

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
#include <CGAL/Delaunay_triangulation_2.h> 

using namespace std; 

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; 
typedef CGAL::Delaunay_triangulation_2<K> Triangulation; 
typedef Triangulation::Point Point; 
typedef Triangulation::Edge_iterator Edge_iterator; 
typedef Triangulation::Vertex_handle Vertex; 

int main(){ 
    Point p; 
    Triangulation t; 
    while(cin >> p) 
    t.insert(p); 

    // Iterate over edges 
    for(Edge_iterator ei=t.finite_edges_begin();ei!=t.finite_edges_end(); ei++){ 
    // Get a vertex from the edge 
    Vertex vs = ei->source(); 
    } 
} 

Theo tài liệu dereferencing một Edge_iterator tôi sẽ nhận được một Edge_handle và Edge_handle nên có các thành viên nguồn() và target() chỉ cần lấy các điểm cuối, nhưng nó sẽ không biên dịch và có vẻ là sai. Derefencing như trên sẽ cho tôi một cặp <> mà không có những chức năng thành viên.

Bất kỳ ý tưởng nào tôi đang làm sai?

+0

Trình biên dịch không thành công ở đâu? – payne

+0

Đó là (ei *) là loại cặp mà rõ ràng là không có nguồn(). – cdecker

Trả lời

9

Dereferencing an Edge_iterator sẽ cung cấp cho bạn Edge theo số documentation.

Edge được definded như sau: typedef std::pair<Face_handle,int> Edge;

dereferencing các Face_handle sẽ cung cấp cho bạn một Face.

Hai đỉnh mà cạnh tham gia có thể được truy cập bằng cách:

for(Edge_iterator ei=t.finite_edges_begin();ei!=t.finite_edges_end(); ei++){ 
    // Get a vertex from the edge 
    Triangulation::Face& f = *(ei->first); 
    int i = ei->second; 
    Vertex vs = f.vertex(f.cw(i)); 
    Vertex vt = f.vertex(f.ccw(i)); 
    } 

Tôi không biết nếu nó là hữu ích cho bạn quest, nhưng là truy cập vào các điểm như thế này:

for (Edge_iterator it = m_tri.edges_begin(); it != m_tri.edges_end(); ++it) 
{ 
    Triangulation::Segment seg = m_tri.segment(*it); 

    Triangulation::Point p0 = seg.point(0); 
    Triangulation::Point p1 = seg.point(1); 
    // ... 
} 

Tài liệu CGAL gây nhầm lẫn cho tôi ... Tôi tò mò khi bạn tìm thấy các cuộc gọi eh->source()eh->target(), tôi không thể tìm thấy :-)

+0

Cần xử lý thay vì các đỉnh trong giải pháp đầu tiên của bạn 'Vertex_handle vs' và' Vertex_handle vt'. – rytis

Các vấn đề liên quan