Tuesday, June 1, 2010

Faceのinfo, index

近隣のフェイスを参照するとき,これらのインデックスが着いていたほうが扱いやすいです.しかし,CGALでは標準でidを持ったfaceの形式がないため,別の情報で代替する必要があります.
ここで,適当なのはinfoで,どんな形式でも追加できる情報です.
今回は,Delaunay図でのインデックスを得る実験をします.
infoを持つfaceを使うために,以下のようにインクルードを指定します.

#include < CGAL/Exact_predicates_inexact_constructions_kernel.h >
#include < CGAL/Delaunay_triangulation_2.h >
#include < CGAL/Triangulation_vertex_base_with_id_2.h >
#include < CGAL/Triangulation_face_base_with_info_2.h >


最後のTriangulation_face_base_with_info_2.hがfaceにinfoを付加した形式です.
3番目はid付の頂点情報です.faceのインデックスの場合はこれである必要はありません.
typedefは以下のように設定します.


typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Triangulation_vertex_base_with_id_2< K > Tvb;
typedef CGAL::Triangulation_face_base_with_info_2< int, K > Tfb;
typedef CGAL::Triangulation_data_structure_2< Tvb,Tfb > Tds;
typedef CGAL::Delaunay_triangulation_2< K, Tds > Triangulation;


Triangulation_face_base_with_info_2< int, K > Tfbの最初の引数でinfoの形式を指定します.この場合は,intを指定します.


int cnt;
cnt = 0;
for(Finite_vertices_iterator fvi = t.finite_vertices_begin ();
fvi!=t.finite_vertices_end(); fvi++)
{
fvi->point().x();
fvi->point().y();
fvi->id() = cnt;
cnt++;
}

cnt = 0;
for(Finite_faces_iterator ffi = t.finite_faces_begin ();
ffi!=t.finite_faces_end(); ffi++)
{
int f[3];
f[0] = ffi->vertex(0)->id();//vertexから引いてくる
f[1] = ffi->vertex(1)->id();
f[2] = ffi->vertex(2)->id();
ffi->info() = cnt;
cnt++;
}


前半は,vertexのidで,後半がこの話題の中心であるfaceのインデックスです.idの指定同様
ffi->info()に直に通し番号を入れていきます.
これで,faceのインデックスを参照できます.

No comments: