Wednesday, May 26, 2010

2次元三角形のトラバース



CGALで,2次元三角形による領域分割が必要になったので,2次元ドロネー図の三角形をトラバースできるか実験してみました.
まず,インクルードファイルとtypedefの宣言します.


#include < stdlib.h >
#include < math.h >

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

#include < fstream >

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;

typedef CGAL::Delaunay_triangulation_2< K > Triangulation;
typedef Triangulation::Finite_faces_iterator Finite_faces_iterator;
typedef Triangulation::Edge_iterator Edge_iterator;
typedef Triangulation::Point Point;


以上で二次元ドロネー図を構成する準備ができました.
次にコードですが,簡単にいうと,ドロネー図に点を追加していって,できたグラフをトラバースするという手続きです.
点を追加する時点で,図を構成していますので,構成の関数を呼ぶことはないです.


Triangulation t;
for(int i=0;i < N;i++){
t.insert(Point((double)x[i][0], (double)x[i][1]));
}

int faceN = t.number_of_faces();
double *face = new double[faceN*3*2];//x 3 vertices x 2D

int i = 0;
for(Finite_faces_iterator ffi = t.finite_faces_begin (); ffi!=t.finite_faces_end(); ffi++)
{
face[i*3*2+0] = ffi->vertex(0)->point().x();
face[i*3*2+1] = ffi->vertex(0)->point().y();
face[i*3*2+2] = ffi->vertex(1)->point().x();
face[i*3*2+3] = ffi->vertex(1)->point().y();
face[i*3*2+4] = ffi->vertex(2)->point().x();
face[i*3*2+5] = ffi->vertex(2)->point().y();
i++;
}


xはランダムに配置した点です.
トラバースは三角形ごとに見ているので,faceのイタレーターで参照しています.

Monday, May 10, 2010

CGALでのメッシュ生成


以下のサイトのGenerating Meshes with CGALに,関数からメッシュを作ってメッシュにアクセスする方法が書いてある.
http://schmid.dk/wiki/index.php/CGAL

この方法で,メッシュ生成すると,ちゃんとメッシュが作れた.
ユーザーの気持ちを知っているすばらしいサイトだと思う.

Facet_iteratorでcomplex上のfaceにアクセスし,アクセスしたfaceのfirst(四面体)からsecond以外の頂点にアクセスする.そのsecond以外の頂点は,complex上のfaceなので,ちゃんと頂点が取れてくる.ということです.
知らないとできないです.こんなの.

C2t3でメッシュ生成後,以下のコード(上のサイトからの転載)で,メッシュにアクセスできます.


// for each facet (triangle), print the vertices
for(C2t3::Facet_iterator fi = c2t3.facets_begin();
fi != c2t3.facets_end(); fi++) {

C2t3::Cell_handle cell = fi->first;
int opposite_vertex_index = fi->second;
for(int i = 0; i < 4; i++)
if(i != opposite_vertex_index) {
std::cout << "(" << cell->vertex(i)->point().x()
<< "," << cell->vertex(i)->point().y()
<< "," << cell->vertex(i)->point().z() << ")"
<< std::endl;
}
}


ありがとうございました.

Sunday, May 9, 2010

CGAL理解できず

さっぱりわからなくなってきた.
handleとiteratorが理解できればほしいデータにアクセスできるのはわかるのだけれど,それらをどうやって使えばいいのかさっぱりわからない.そのせいで,ほしい三角形の頂点にアクセスできない.リファレンスにいろいろ載っているのだけれど,意味が理解できない.無駄に時間を過ごしているような気がしてきた.

Wednesday, May 5, 2010

陰関数でのメッシュ生成は多少時間がかかる

陰関数からメッシュ生成することが素晴らしいと思って開発していたのだけれど,計算時間がかかりすぎることを忘れていた.
ひとつの形状を作るのには,優れているかもしれないが,めちゃくちゃ多くのものを作るには,面白くない.
それに,今回の目的に対して陰関数である必要性が,弱い.
他の方法で,簡単にメッシュ作れるならばそっちを適用した方がかっこいいので,そっちに乗り換える.

Oracleによって

CGALのリファレンスにパラメータはOracleによって設定されるというような記述があったので面白い表現だということで,メモ