11

Delaunay 三角形分割のエッジの端点ごとに vertex_handle を取得するのにかなり苦労しています。私はこれに数時間頭を悩ませていたので、あなたの誰かがこの一見些細な問題で私を助けてくれるかもしれないと思いました:

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

Edge_iterator を逆参照するドキュメントによると、Edge_handle を取得する必要があり、Edge_handle にはエンドポイントを取得するためのメンバー source() および target() が必要ですが、コンパイルされず、間違っているようです。上記のようにデリファレンスすると、これらのメンバー関数を持たない pair<> が得られます。

私が間違っていることは何か分かりますか?

4

1 に答える 1

12

anを逆参照すると、ドキュメントに従ってanEdge_iteratorが得られます。Edge

Edgeは次のように定義されます。typedef std::pair<Face_handle,int> Edge;

を逆参照すると、 FaceFace_handleが得られます。

エッジが結合する 2 つの頂点には、次の方法でアクセスできます。

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

あなたのクエストに役立つかどうかはわかりませんが、次のようなポイントにアクセスできます。

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);
    // ...
}

CGAL のドキュメントは私を混乱させます... どこでeh->source()とのeh->target()呼び出しを見つけたのか知りたいのですが、見つかりませんでした :-)

于 2011-01-29T15:32:45.870 に答える