将变换应用于等值面的面/顶点并绘制结果

db1*_*234 2 3d matlab plot contour volume-rendering

如果我在Matlab中获得了轮廓

 [f, v] = isosurface(x, y, z, v, isovalue)
Run Code Online (Sandbox Code Playgroud)

是否有一种干净的方法将变换应用于曲面并很好地将结果绘制为光滑的表面?转变T是非线性的.

我试图将转换T应用于两者f并且vert使用patch但不能完全使用它.

Hok*_*oki 8

诀窍是对您应用转换vertices,但保留相同的faces数据.这样,无论新的位置如何,面部总是链接相同的点.

由于没有样本数据,我将Matlab示例作为起点.这来自Matlab isosurface页面(对于这个例子稍作修改):

%// Generate an isosurface
[x,y,z,v] = flow;
fv = isosurface(x,y,z,v,-3) ;
figure(1);cla
p1 = patch(fv,'FaceColor','red','EdgeColor','none');
%// refine the view
grid off ; set(gca,'Color','none') ; daspect([1,1,1]) ; view(3) ; axis tight ; camlight ; lighting gouraud
Run Code Online (Sandbox Code Playgroud)

这个输出:
原始的等值面

到目前为止没有任何原创.请注意,我使用单结构输出类型fv而不是2个单独的数组[f,v].它并不重要,只是为了简化下一次调用补丁对象的选择.

我需要检索顶点坐标:

%// Retrieve the vertices coordinates
X = fv.vertices(:,1) ;
Y = fv.vertices(:,2) ;
Z = fv.vertices(:,3) ;
Run Code Online (Sandbox Code Playgroud)

然后,您可以应用转换.我在这个例子中选择了一个简单的,但任何转换函数都是有效的.

%// Transform
X = -X.*Y.^2 ;
Y = Y.*X ;
Z = Z*2 ;
Run Code Online (Sandbox Code Playgroud)

然后我重新构建了一个新的结构,用于显示转换后的对象.
这是重要的一点:

%// create new patch structure
fvt.vertices = [X Y Z] ;   %// with the new transformed 'vertices'
fvt.faces = fv.faces ;     %// but we keep the same 'faces'
Run Code Online (Sandbox Code Playgroud)

然后我以相同的方式显示它(以稍微不同的角度以获得更好的视图):

%// Plot the transformed isosurface
figure(2);cla
pt = patch( fvt ,'FaceColor','red','EdgeColor','none');
%// refine the view
grid off ; set(gca,'Color','none') ; daspect([1,1,1]) ; view(-3,4) ; axis tight ; camlight ; lighting gouraud
Run Code Online (Sandbox Code Playgroud)

这产生了这个数字:
转换的等值面

(如果将所有代码段粘贴到一个文件中,它应该运行并为您提供相同的输出.)