質問
うまく使いこなせる方法、継承されたクラスの三角の角に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クラス、すなわちませんが実行べての三角ではなくそれが実行通常の三角(実行の親クラスメソッドの代わりに子どもできません。
と思うこれは、insertメソッドのTriangulation_2宣言されていませんで仮想としていredefinitionsいます。
いう。ものを使用Constrained_triangulation_2とConstrained_delaunay_triangulation_2?(クラス定義している仮想の手法がって、ソースコードにならないと思っきを添加することなく明示的な制約)
そのアイデア?
解決
私の計算プログラムするには整形で、その汎用プログラミングモデルで私のを思い出コードなので github):
- を読み込みコマンドライン
- によってはオプションinstantiatesは三角またはDelaunay_triangulationのヒープ
- このオブジェクトの一部の処理を想定し、この方法は仮想(ものではありません)
解の問題をうけステップ3は別の方法では、三角タイプとしてのテンプレートパラメータとします。のようなものを使用してい種類ごと名):
template < class Triangulation >
void compute_mesh(int n_vertices, int max_x, int max_y)
{
Triangulation t;
// DO WHATEVER YOU WANT WITH t
}
そして、メイン機能、トリガーのドローネまたは非べてのtriangulations次のようになっています:
if (triang_type == 'D')
compute_mesh<Delaunay>(n_vertices, max_x, max_y);
else
compute_mesh<Triangulation>(n_vertices, max_x, max_y);
他のヒント
あなたは、これらの機能は、仮想であることを確認していますか?それらを仮想定義されることなく、コンパイラは、派生クラスの関数を呼び出すことはありません。
CGALのヘッダでザッ見てから、これらのクラスはまったくの仮想関数を持っていることを思えません。
CGALはジェネリックプログラミングではなく、仮想関数を使用しています。それはちょうど、ドメインが少し難しくなり、STLに似ている、とあなたは1は、通常、STLでよりもアルゴリズムに多くを依存する必要があります。
私は本当にあなたがコードのほんのスニペットを提供するために、あなたの問題への答えが何であるか、教えてくれますが、
交換してくださいすることはできませんTriangle *t = new Delaunay;
タグ付き
Triangulation *t = new Delaunay;
最初。それが解決しない場合は、あなたのタイプ定義から詳細を追加してください。