Wednesday, April 22, 2009

BCC Lattice and Cut point失敗したけどなんとなく出た結果


まぁ失敗なんですけど,以前からシコシコプログラムしていたBCC Latticeのドロネー図を用いたFEM Mesh生成のcut pointを計算した結果です.
cut pointは,陰関数のzero-setの近似でFEM Meshのエッジを切った点です.
一つの四面体の中のどこにcut pointがあるかを調べて,cut pointと四面体の各頂点の関数値を調べて,四面体をzero-set surfaceの近似になるように分割します.

この結果はその分割でミスっているのですが,そこはプログラムの書き間違い程度だろうと予想できるので,直せば,ある程度きれいに陰関数のzero-set surfaceを近似したFEM Meshを作ることができます.

プログラムでややこしかった点は,データの構造です.
BCC Latticeをはじめに計算し,点群を保持して,そこからドロネー図を計算し,一様に四面体を計算するのですが,ここまでで点と四面体のデータをそろえてしまっているのに,さらにcut pointなるものを付加して,四面体を分割するといったことが必要になります.

四面体クラスは,点を参照しています.
この点はBCC Latticeの点でもあり,cutpointでもあります.

cut pointや四面体の分割によってオブジェクトの数が変化するので,リスト構造を用いることを考えましたが,ヘッドのポインタから尻尾に向かって潜っていく時,リストの数が増えればその分遅くなりますので,やめました.

こんな状況でも,たまにはリスト構造のコードも組む時あるのですが,今回は,配列を予想できる数だけ確保して,アクセスすることで,少しだけストレスを減らしています.
(リスト構造でストレスがかかるとか言っている時点で,javaで言うとVectorクラスしか知らない原始人みたいに思われますが,その通りなので,言い返しません.microsoftが独自に用意してくれたライブラリとかカッコよく使いこなしたいです.)

また,四面体の分割方法は各頂点を固定して8通りあり,4頂点の配置は24通りあるため,一つの四面体を192通り確かめて,分割方法を決定します.
そこで,4!のループの中に8通りのチェック関数を入れて,チェックしました.
for(int i=0;i<4;i++){
  for(int j=0;j<4;j++){
    if(i==j) continue;
    for(int k=0;k<4;k++){
      if(k==i) continue;
      if(k==j) continue;
      for(int l=0;l<4;l++){
        if(l==i) continue;
        if(l==j) continue;
        if(l==k) continue;
        四面体pointのindex入れ替え(i,j,k,l)
        8通りチェック関数(四面体);
      }
    }
  }
}
みたいな感じで.

No comments: