4

いくつかの点で Delaunay 三角形分割があり、その中のすべてのエッジを長さの昇順で反復処理して、最小スパン スレッドを構築したいと考えています。

次のアプローチを試しましたが、コンパイルできません。

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と言って、コンパイルは で失敗します。ただし、ドキュメントはここで私を混乱させます。sourceEdge_iterator

CGAL のドキュメントによると、エッジ イテレータの値の型はハーフエッジです。 ポイントにアクセスして使用できるsource()と言われています。target()

しかし、そうではないようです。私はここで何を台無しにしていますか?

4

4 に答える 4

4

は面と頂点インデックスの ですedge_iteratorstd::pairエッジのソース頂点とターゲット頂点には、この面参照を介してアクセスできます。edge_iterator の頂点インデックスは反対の頂点に準拠します。したがって、他の 2 つの ID は(i+2)%3(i+1)%3です。

他の解決策は、 経由でセグメントに到達し、および関数をtriangulation.segment(edge_iterator)使用してポイントに直接到達することです。ただし、その方法では頂点ハンドルにアクセスできません。source()target()

于 2011-02-02T21:34:49.320 に答える
2
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());
于 2013-11-03T13:47:37.257 に答える
1

によってエンドポイントの vertex_handle にアクセスできます

T::Vertex_handle sVertex = a->first->vertex(T::cw(a->second));

T::Vertex_handle fVertex = a->first->vertex(T::ccw(a->second));

など..各 Vertex_handle から、point メソッドを使用してポイントの座標を復元できます..

それが役立つことを願っています

于 2013-10-09T17:37:24.163 に答える
-1

イテレータは実際の要素へのポインタのように機能する必要があるため、メンバーにアクセスする前にイテレータを逆参照する必要があります。に変更してみてくださいa->source().point()

編集:ハンドルもポインターのようなものだと思います。これが好きかどうかを確認してください。

la = CGAL::squared_distance(a->source()->point(), a->target()->point());
lb = CGAL::squared_distance(b->source()->point(), b->target()->point());
于 2011-01-28T17:09:35.150 に答える