我有一个功能,它采用3D景观的体素表示,并可以绘制X-Y部分以显示景观的中间。体素表示存储在3维矩阵中,其中数字表示重要的事物。矩阵显然是
1,1,1
2,2,2
在访问元素方面,但实际的3D位置可在以下方法中找到:
(index-1)*resolution+0.5*resolution+minPos;
其中分辨率是网格大小:
resolution
<-->
__ __ __
|__|__|__|
<- Min pos
和minPos是网格开始的地方。
现在就实际问题而言,我想提取这个体素表示的单个X-Y部分并将其显示为冲浪。这可以通过这样做来完成:
surf(voxel(:, :, section))
然而你得到了这个:
显而易见的问题是网格将从0开始,因为这是矩阵表示的方式。如何设置冲浪的最小值和单元尺寸,即网格将从最小值开始(如上所示)并具有分辨率的网格间距(如上所示)。
答案 0 :(得分:1)
阅读documentation of surf,您还可以提供与您的数据点对应的x和y坐标。
surf(X,Y,Z)
X和Y可以是矢量或矩阵:
surf(X,Y,Z)
使用Z
作为颜色数据和表面高度。X
和Y
是定义曲面的x和y分量的矢量或矩阵。如果X
和Y
是向量,length(X) = n
和length(Y) = m
,则为[m,n] = size(Z)
。在这种情况下,表面的顶点是(X(j), Y(i), Z(i,j))
三倍。要为任意域创建X
和Y
矩阵,请使用meshgrid函数
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矩阵/向量,如doc ^^中清楚描述的那样 请记住,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');
或者您选择错误的数字来构建xi
和yi
,而应该是这样的:
xi = (minPosX:resolution:(minPosX+resolution*s(2)-1));
yi = (minPosY:resolution:(minPosY+resolution*s(1)-1));
z = (voxel(:,:,section));
surf(xi, yi, z);
答案 1 :(得分: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);
提供以下图表:
这是旋转的,这很烦人,我似乎无法让它旋转回来(我只能想象其他方式,但没关系)