如果我在Matlab中获得了轮廓
[f, v] = isosurface(x, y, z, v, isovalue)
是否有一种干净的方法将变换应用于曲面并很好地将结果绘制为光滑的曲面?转换T
是非线性的。
我尝试将转化T
应用于f
和vert
并使用patch
,但无法使其正常运行。
答案 0 :(得分: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
此输出:
到目前为止没有任何原创。请注意,我使用单结构输出类型fv
而不是2个单独的数组[f,v]
。它并不重要,只是为了简化下一次调用补丁对象的选择。
我需要检索顶点坐标:
%// Retrieve the vertices coordinates
X = fv.vertices(:,1) ;
Y = fv.vertices(:,2) ;
Z = fv.vertices(:,3) ;
然后,您可以应用转换。我在这个例子中选择了一个简单的,但任何转换函数都是有效的。
%// Transform
X = -X.*Y.^2 ;
Y = Y.*X ;
Z = Z*2 ;
然后我为修补程序重建一个新结构,它将显示转换后的对象 这是重要的一点:
%// create new patch structure
fvt.vertices = [X Y Z] ; %// with the new transformed 'vertices'
fvt.faces = fv.faces ; %// but we keep the same 'faces'
然后我以相同的方式显示它(以稍微不同的角度以获得更好的视图):
%// 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
产生这个数字:
(如果您将所有代码段粘贴到一个文件中,它应该运行并为您提供相同的输出。)