Skip to content

StructuredVolumeObject

Naohisa Sakamoto edited this page Mar 25, 2017 · 3 revisions

3.4 構造格子型ボリュームオブジェクト

構造格子型ボリュームオブジェクトは、各辺が座標軸に平行な直方体またはそれを歪ませた形状として表現されます。また、隣接する格子間において、境界面を除く内部の節点を共有する格子の数は8であり、格子の稜線(エッジ)を共有する格子の数は4となります。

3.4.1 データ構造

KVSでは、構造格子型ボリュームオブジェクトは以下のような情報から構成されています。

格子タイプ
格子の種類を表します。均一格子、直交格子または湾曲格子を指定することができます。
  • 均一格子(uniform grid) 格子点が直交等間隔に並ぶ形状
  • 直交格子(rectilinear grid) 各軸は直交であるが隣接する格子間隔が異なる形状
  • 湾曲格子(curvilinear grid) 直交格子と同じ接続関係を保ちそれを歪ませた形状
解像度
各軸方向の分割数を表します。
ベクトル長
数値データのベクトル長を表します。スカラ値の場合、1となります。
座標
節点の位置を表します。3次元の場合、x,y,zの値を持ちます。x, y, z座標の順でそれぞれ昇順となるように並べられその順に通し番号(節点番号)が自動的に割り振られます。均一格子の節点座標は、各座標軸上での分割数(解像度)が分かれば計算することができるため、明示的に指定する必要はありません。直交格子は、各座標軸上での分割点座標を単純に組み合わせることで得られます。湾曲格子については、直交格子を歪ませた形状であるため、全節点座標を明示的に指定する必要があります。
数値データ
節点上に定義される物理量を表します。節点番号順に並べられ、(節点数)×(ベクトル長)の1次元配列として定義します。

3.4.2 kvs::StructuredVolumeObjectクラス

KVSでは、構造格子型ボリュームオブジェクトはkvs::StructuredVolumeObjectクラスとして実装されています。以下では、kvs::StructuredVolumeObjectクラスの主なメソッドについて説明します。


const kvs::ValueArray<kvs::Real32>& coords() const

機能
点の座標値の配列を返す。ただし、均一格子の場合は空である。

戻り値
32ビット実数型(kvs::Real32型)の座標値の配列クラス


const kvs::AnyValueArray& values() const

機能
数値データの配列を返す。

戻り値
動的型(kvs::AnyValue型)の数値データの配列クラス


size_t veclen() const

機能
数値データのベクトル長を返す。

戻り値
数値データのベクトル長。スカラ値の場合、1を返す。


const kvs::Vector3ui& resolution() const

機能
各軸方向の解像度を返す。

戻り値
各軸方向の解像度を表す3次元ベクトルクラス


size_t numberOfNodes() const

機能
節点数を返す。

戻り値
節点数


GridType gridType() const

機能
格子の種類を返す。

戻り値
以下のいずれかの値を返す。

  • kvs::StructuredVolumeObject::Uniform ... 均一格子
  • kvs::StructuredVolumeObject::Rectilinear ... 直交格子
  • kvs::StructuredVolumeObject::Curvilinear ... 湾曲格子
  • kvs::StructuredVolumeObject::UnknownGridType ... その他

void setCoords( const kvs::ValueArray<kvs::Real32>& coords )

機能
節点の座標値を設定する。均一格子の場合は、座標値を指定する必要はない。直交格子の場合は、各軸上での分割点の座標値を、x, y, zの順で並べた配列(x0, x1, …, xi, y0, y1, …. yj, z0, z1, …, zk)として指定する。湾曲格子の場合は、設定する座標値を、x, y, zを点数分並べた配列(x0, y0, z0, x1, y1, z1, …, xi, yi, zi)として指定する。

引数
coords 節点の座標値の配列。指定する配列の型は32ビット実数型(kvs::Real32型)である。

戻り値
なし


void setValues( const kvs::AnyValueArray& values )

機能
節点の数値データを設定する。節点番号順に、(節点数)×(ベクトル長)の長さの配列を指定する。

引数
values 節点の数値データの配列。指定する配列の型は動的型(kvs::!AnyValueArray型)である。

戻り値
なし


void setVeclen( const size_t veclen )

機能
数値データのベクトル長を設定する。

引数
veclen 数値データのベクトル長

戻り値
なし


void setResolution( const kvs::Vector3ui& resolution )

機能
各軸方向の解像度を設定する。

引数
resolution 各軸方向の解像度

戻り値
なし


void setGridType( const GridType grid_type )

機能
格子の種類を設定する。

引数
grid_type 格子の種類。以下のいずれかの値を指定する。

  • kvs::StructuredVolumeObject::Uniform ... 均一格子
  • kvs::StructuredVolumeObject::Rectilinear ... 直交格子
  • kvs::StructuredVolumeObject::Curvilinear ... 湾曲格子
  • kvs::StructuredVolumeObject::UnknownGridType ... その他

戻り値
なし


3.4.3 作成例

構造格子型ボリュームオブジェクトを作成し、それをいったんポリゴンデータに変換し描画するサンプルコードを以下に示します。例では、CreateStructuredVolumeObject関数で構造格子型ボリュームオブジェクトを生成しています。

#include <kvs/glut/Application>
#include <kvs/glut/Screen>
#include <kvs/StructuredVolumeObject>
#include <kvs/ExternalFaces>

// 格子の解像度
const size_t dimx = 3;
const size_t dimy = 3;
const size_t dimz = 3;

// 数値データのベクトル長
const size_t veclen = 1;

// 数値データ
kvs::UInt8 ValueArray[ dimx * dimy * dimz * veclen ] = {
     0,  10,   0,
    50, 255, 200,
     0, 100,   0,

    50,   0, 150,
     0,   0,   0,
   150,   0,  50,

     0, 255, 0,
    50,  10, 50,
     0, 255, 0
};

// 構造格子型ボリュームオブジェクト(均一格子)を生成する関数
kvs::StructuredVolumeObject* CreateStructuredVolumeObject()
{
    // KVSの動的型配列クラス(kvs::AnyValueArray)にセットする。
    kvs::ValueArray<kvs::UInt8> values( ValueArray, sizeof( ValueArray ) );

    // 構造格子型ボリュームオブジェクトを生成する。
    kvs::StructuredVolumeObject* object = new kvs::StructuredVolumeObject();
    object->setGridType( kvs::StructuredVolumeObject::Uniform );
    object->setVeclen( veclen );
    object->setResolution( kvs::Vector3ui( dimx, dimy, dimz ) );
    object->setValues( kvs::AnyValueArray( values ) );

    return object;
}

// メイン関数
int main( int argc, char** argv )
{
    kvs::glut::Application app( argc, argv );

    // 構造格子型ボリュームオブジェクト(均一格子)の生成
    kvs::StructuredVolumeObject* volume = CreateStructuredVolumeObject();

    // 境界面ポリゴンの抽出
    // ※ボリュームデータをいったんポリゴンデータに変換する。
    kvs::PolygonObject* object = new kvs::ExternalFaces( volume );

    // ボリュームデータの削除
    // ※ポリゴンデータに変換したため元データを削除する。
    delete volume;

    kvs::glut::Screen screen( &app );
    screen.setTitle( "Structured Volume Object" );
    screen.registerObject( object );
    screen.show();

    return app.run();
}
Clone this wiki locally