(MATLAB)创建三维隐式函数的曲面图



我正试图将在Matlab上创建的这个形状导出到.stl文件中,我遇到了";surf2stl";在Mathworks文件交换中。(https://mathworks.com/matlabcentral/fileexchange/4512-surf2stl)

function out=fun2(x,y,z)
fun1=@(x,y,z) (x.^2+y.^2).^(2)-(x.^3+y.^3).*(z/4-z.^2).^(1/2);

dt=0.25*(z/4-z.^2).^(1/2); %z-dependent translation

out=fun1(x+dt,y+dt,z);                
end

同时,使用surf2stl的一个简单示例是:

x=linspace(0,2)
y=linspace(-pi,pi)
[X,Y] = meshgrid(x,y);
Z=sqrt(X).*cos(Y);
surf2stl('fun.stl', X, Y, Z);

问题是,我的代码在X、Y和Z之间有一个隐式函数,加上有一个移动X和Y坐标的Z相关转换,所以将这个函数实现到surf2stl可能很棘手。我不知道如何处理这个问题。有什么想法吗?

(R2021a(

请注意,surf2stl仅适用于在规则矩形网格上采样的参数化曲面。您可以改用stlwrite。但是,要从隐式函数创建曲面,我们首先需要在网格上对函数进行采样(首先使用meshgrid创建网格(,然后调用isosurface。然后stlwrite需要一个三角测量对象,我们可以使用triangulation创建它。

% define function
fun1=@(x,y,z) (x.^2+y.^2).^2-(x.^3+y.^3).*(z/4-z.^2).^(1/2);
dt=@(z)0.25*(z/4-z.^2).^(1/2);
helper=@(x,y,z,dt)fun1(x+dt, y+dt, z);
fun=@(x,y,z)helper(x,y,z,dt(z));
% code
[x,y,z] = meshgrid(linspace(-3, 3, 40));
v = fun(x,y,z);
v = real(v); % deal with complex values
[faces, verts] = isosurface(x,y,z,v,0);
t = triangulation(faces, verts);
stlwrite(t, 'test.stl');
disp('done');

最新更新