gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:08:57 24 4
gpt4 key购买 nike

如果我在Matlab中得到一个轮廓

 [f, v] = isosurface(x, y, z, v, isovalue)

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

我尝试将转换 T 应用于 fvert 并使用 patch 但不能让它正常工作。

最佳答案

诀窍是在您的顶点上应用转换,但保留相同的数据。这样,无论它们的新位置如何,面总是连接相同的点。

由于没有示例数据,我以 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

这个输出:
Original isosurface

到目前为止没有原创内容。请注意,我使用了单一结构输出类型 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'

然后我以相同的方式显示它(为了更好的 View ,稍微不同的角度):

%// 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

生成图:
Transformed isosurface

(如果您将所有代码片段粘贴到一个文件中,它应该会运行并给出相同的输出。)

关于matlab - 将变换应用到等值面的面/顶点并绘制结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25895131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com