(MATLAB) 创建 3 维隐函数的曲面图
(MATLAB) Creating a surface plot of a 3-dimensional implicit function
我试图将在 Matlab 上创建的这个形状导出到一个 .stl 文件,我在 Mathworks 文件交换中遇到了“surf2stl”。 (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');
我试图将在 Matlab 上创建的这个形状导出到一个 .stl 文件,我在 Mathworks 文件交换中遇到了“surf2stl”。 (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');