2011-01-28 67 views
3

我對某些點有Delaunay三角剖分,並且想要按長度遞增順序遍歷其中的所有邊,以便構建最小跨度線程。如何從CGAL中的Edge_iterator獲取源點和目標點

我試着用下面的方法,但不能讓它編譯:

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; 
typedef CGAL::Delaunay_triangulation_2<K> T; 
typedef K::Point_2 P; 
typedef T::Vertex_handle Vh; 
typedef T::Vertex_iterator Vi; 
typedef T::Edge_iterator Ei; 

bool sortFunction (Ei a, Ei b) { 
    K::FT la, lb; 
    la = CGAL::squared_distance(a.source().point(), a.target().point()); 
    lb = CGAL::squared_distance(b.source().point(), b.target().point()); 
    return la < lb; 
} 

... 
T g; 
... 
std::vector<Ei> edges; 
for (Ei ei = g.edges_begin(); ei != g.edges_end(); ei++) { 
    edges.push_back(ei); 
} 
std::sort(edges.begin(), edges.end(), sortFunction); 
... 

編譯在sortFunction失敗,說source是沒有Edge_iterator成員。但是,這裏的文檔讓我感到困惑。

CGAL documentation表示邊緣迭代器的值類型是halfedge。 There據說我可以用source()target()來獲得積分。

但是,這似乎並非如此。我在這裏搞什麼?

回答

3

edge_iterator是一個面和頂點索引的std::pair。邊緣的源和目標頂點可以通過該面參考進行訪問。 edge_iterator中的頂點索引符合相反的頂點。所以,另外兩個有id的(i+2)%3(i+1)%3

其他一些解決方案是通過triangulation.segment(edge_iterator)進入段,然後使用source()target()函數直接到達點。但是,您無法以這種方式訪問​​頂點句柄。

-1

迭代器應該有點像指向實際元素的指針,因此在訪問任何成員之前需要對其進行取消引用。嘗試將其更改爲a->source().point()

編輯:我猜句柄也是指針式的。看看它是否喜歡這個。

la = CGAL::squared_distance(a->source()->point(), a->target()->point()); 
lb = CGAL::squared_distance(b->source()->point(), b->target()->point()); 
+0

沒有工作:( – Etan 2011-01-28 19:06:09

1

可以通過訪問端點vertex_handle

T :: Vertex_handle sVertex = A->一階>頂點(T :: CW(A->第二)); T :: Vertex_handle fVertex = a-> first-> vertex(T :: ccw(a-> second));

的等等。從每個Vertex_handle您可以通過使用點法..

希望恢復點的座標,它可以幫助

1
Triangulation::Edge e; 
//TODO: get e 
Triangulation::Vertex_handle v1 = e.first->vertex((e.second + 1) % 3); 
Triangulation::Vertex_handle v2 = e.first->vertex((e.second + 2) % 3); 
K::FT squared_distance = CGAL::squared_distance(v1->point(), v2->point()); 
相關問題