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 开始,因为这就是矩阵表示的方式。如何设置 surf 的最小值和单元格大小,即网格将从最小值开始(如上所示)并具有分辨率的网格间距(如上所示)。

4

2 回答 2

1

阅读surf 的文档,您还可以提供与您的数据点对应的 x 和 y 坐标。

surf(X,Y,Z)

X 和 Y 可以是向量或矩阵:

surf(X,Y,Z)用于Z颜色数据和表面高度。XY是定义表面的 x 和 y 分量的向量或矩阵。如果XY是向量,length(X) = n并且length(Y) = m,其中[m,n] = size(Z)。在这种情况下,曲面的顶点是(X(j), Y(i), Z(i,j))三元组。要为任意域创建X和矩阵,请使用meshgrid函数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 行中的元素是冲浪ed 作为沿 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 回答