1

3Dランドスケープのボクセル表現を取得し、XYセクションをプロットしてランドスケープの中央を表示できる関数があります。ボクセル表現は、重要なものを表す数値を含む3次元マトリックスに格納されます。明らかに、マトリックスは

1,1,1 
2,2,2

要素へのアクセスに関しては、実際の3D位置は次の方法で見つかります。

(index-1)*resolution+0.5*resolution+minPos;

ここで、解像度はグリッドサイズです。

resolution
<-->
 __ __ __
|__|__|__|
 <- Min pos

minPosはグリッドが始まる場所です。

ここで、実際の質問に関して、このボクセル表現の単一のXYセクションを抽出し、それをサーフとして表示したいと思います。これは、これを行うだけで実行できます。

surf(voxel(:, :, section)) 

しかし、あなたはこれを手に入れます:

明らかな問題は、グリッドが0から始まることです。これは、それが行列表現の方法であるためです。サーフの最小サイズとセルサイズを設定するにはどうすればよいですか。つまり、グリッドが最小(上に表示)で開始し、解像度のグリッド間隔(上に表示)を持つように設定できます。

4

2 に答える 2

1

surfのドキュメントを読んでください。また、データポイントに対応するx座標とy座標を提供することもできます。

surf(X,Y,Z)

XとYは、ベクトルまたは行列のいずれかになります。

surf(X,Y,Z)Zカラーデータと表面の高さに使用します。XおよびYは、サーフェスのxおよびyコンポーネントを定義するベクトルまたは行列です。XYがベクトルの場合、length(X) = nおよびlength(Y) = m、ここで、[m,n] = size(Z)。この場合、サーフェス面の頂点は(X(j), Y(i), Z(i,j))トリプルです。任意のドメインの行列を作成するには、Xmeshgrid関数使用しますY

 Z=[ 0 1 2  3;
     7 6 5  4;
     8 9 10 11];

 x=[-1 0 1 2];
 y=[-2 0 2];
 surf(x,y,Z);

ここに画像の説明を入力してください もちろん、ドキュメントで明確に説明されているように、Z、x、yの行列/ベクトルを一致させる必要があります^^ Zの列の要素はy軸に沿った値としてサーフされ、Zの行の要素はサーフされることを覚えておいてください。 x軸に沿った値として編集されます。これは、例の画像ではっきりとわかります。

解決

x軸とy軸を入れ替えたと思いますが、これは転置するだけで修正できますz

s = size(voxel);
xi = (minPosX:resolution:(minPosX+resolution*s(1)-1));
yi = (minPosY:resolution:(minPosY+resolution*s(2)-1));
z = (voxel(:,:,section));

surf(xi, yi, z');

または、構築するために間違った番号を選択していることxiyiそして代わりにこれである必要があります:

xi = (minPosX:resolution:(minPosX+resolution*s(2)-1));
yi = (minPosY:resolution:(minPosY+resolution*s(1)-1));
z = (voxel(:,:,section));
surf(xi, yi, z);
于 2012-07-31T07:24:42.260 に答える
0

したがって、次のことを行うのは簡単でした。

3D行列「ボクセル」があるとしましょう。

s = size(voxel);
xi = (minPosX:resolution:(minPosX+resolution*s(1)-1));
yi = (minPosY:resolution:(minPosY+resolution*s(2)-1));
z = (voxel(:,:,section));
[x y] = meshgrid(xi, yi);
x = x';
y = y';

surf(x, y, z);

次のプロットを提供します。

これは回転しているので面倒です。回転させて戻すことはできないようです(他の方法で視覚化することもできますが、問題ありません)。

于 2012-08-01T06:29:41.857 に答える