MATLAB slice - eiichiromomma/CVMLAB GitHub Wiki

(MATLAB) Volume Dataの断面

ボリュームデータを貫く任意の角度の断面を表示して値を取得

ボリュームデータの補間の続きを前提としている。 直接読込んだ値を使いたい場合はslice(doubleにしたimaVOL,xd,yd,zd)でできる筈。

surf

任意の角度の平面をsurfとrotateによって作成し、getで座標を得る。

hsp=surf(1:100,1:100,zeros(100)+100);
rotate(hsp,[1,-1,1],30)
xd = get(hsp,'XData');
yd = get(hsp,'YData');
zd = get(hsp,'ZData');

rotateの第2引数は基本ベクトルで[1 0 0]でx軸についての回転となる。 回転の中心はsurfaceの中心。

座標を得たらsurfは不要

delete(hsp)

任意断面の表示

slice(xi,yi,zi,vi,xd,yd,zd)

値の取得

sliceの返り値がハンドルとなる

H=slice(xi,yi,zi,vi,xd,yd,zd)

surfaceのプロパティはHandle Graphics Properties で定義されている。

ここで使えそうなのは

CData                        行列

頂点のカラー。 ZDataの中のすべての点でのカラーを指定した値を含む行列。 
FaceColorプロパティをtexturemapに設定すると、CDataは、ZDataと同じ大きさになる必要はありません。
この場合、MATLABは、CDataをZDataで定義されるサーフェスを確保できるようにマッピングします。

というわけで

slicevalue=get(H,'CData')

とすると、それらしい値が得られた。

おまけに

VertexNormals                ベクトル、または、行列

サーフェスの法線ベクトル。このプロパティは、Surfaceに対する頂点の法線を含んでいます。 
MATLAB は、ライティングの計算を行うためこのデータを作成します。
座標データと一致していなくても、ユーザ自身の頂点の法線データを提供することができます。
これは興味のあるライティング効果の作成に有効です。 

なんてのもあるので

slicenormal=get(H,'VertexNormals')

で法線ベクトル群が得られる。 平面なので全部同じ値。

線が邪魔

大きいスライスを表示しようとすると、メッシュの線が邪魔になる。 スライスを表示している状態で

set(H,'LineStyle','none')

とすれば線が消える。