2

CGAL の三角形分割のコンテキストで三角形分割の継承されたクラスを使用するにはどうすればよいですか?

基本的に私は次のコードを持っています:

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;

typedef CGAL::Triangulation_vertex_base_with_info_2<int,K> Vb;
typedef CGAL::Triangulation_face_base_with_info_2<int,K>   Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb>        Tds;
typedef CGAL::Delaunay_triangulation_2<K,Tds>              Delaunay;
typedef CGAL::Triangulation_2<K,Tds>                       Triangulation;

typedef Triangulation::Point Point;

...

Triangulation *t = new Delaunay;

...

// x and y are properly defined and instantiated
t->insert(Point(x,y));

もちろん、Delaunay_triangulation_2 は Triangulation_2 を継承しています。

したがって、このコードを実行すると、Triangulation_2 クラスに対してリンクが行われます。つまり、ドローネー三角形分割は実行されず、代わりに通常の三角形分割が実行されます (子メソッドの代わりに親クラス メソッドが実行されます)。

これは、Triangulation_2 の挿入メソッドが virtual として宣言されていないため、再定義が機能しないためだと思います。

これを回避する方法を知っていますか?多分 Constrained_triangulation_2 と Constrained_delaunay_triangulation_2 を使用しますか? (これらのクラスはいくつかの仮想メソッドを定義しますが、ソース コードを読んだことがありますが、明示的な制約を追加しないと使用できないと思います)

何か案は?

4

3 に答える 3

3

あなたのプログラムをチェックしましたが、一般的なプログラミング モデルに適合するように、少し再フォーマットする必要があります。あなたのコードが何をするかを思い出させてください(githubで入手できるもの):

  1. コマンドラインを読む
  2. オプションに応じて、ヒープで Triangulation または Delaunay_triangulation のいずれかをインスタンス化します
  3. メソッドが仮想であると仮定して、このオブジェクトを何らかの処理に使用します (ただし、仮想ではありません)。

問題の解決策は、三角形分割タイプをテンプレート パラメーターとして使用して、ステップ 3 を別のメソッドに入れることです。のようなもの (私はあなたのタイプと名前を使用します):

template < class Triangulation >
void compute_mesh(int n_vertices, int max_x, int max_y)
{
    Triangulation t;
    // DO WHATEVER YOU WANT WITH t
}

次に、メイン関数で、次の方法で Delaunay または非 Delaunay 三角形分割の使用をトリガーします。

if (triang_type == 'D') 
    compute_mesh<Delaunay>(n_vertices, max_x, max_y);
else 
    compute_mesh<Triangulation>(n_vertices, max_x, max_y);
于 2009-09-09T07:59:06.677 に答える
0

これらの関数が仮想であると確信していますか? それらが仮想的に定義されていないと、コンパイラは派生クラス関数を呼び出しません。

CGAL ヘッダーをざっと見てみると、これらのクラスには仮想関数がまったくないように見えます。

于 2009-05-13T07:50:57.210 に答える
0

CGAL は、仮想関数ではなく、汎用プログラミングを使用します。これは STL に似ていますが、ドメインが少し難しく、STL で通常行うよりも多くのアルゴリズムに依存する必要があります。

コードの小さなスニペットを提供しただけなので、問題の答えはわかりませんが、置き換えてみてください

Triangle *t = new Delaunay;

Triangulation *t = new Delaunay;

最初。問題が解決しない場合は、タイプ定義から詳細を追加してください。

于 2009-05-13T18:27:37.763 に答える