Matlab – 使用surf和min函数减去两个3D图形

我正在尝试制作一个看起来像的冲浪图:

《Matlab – 使用surf和min函数减去两个3D图形》

到目前为止,我有:

x = [-1:1/100:1];
y = [-1:1/100:1];

[X,Y] = meshgrid(x,y);

Triangle1 = -abs(X) + 1.5;
Triangle2 = -abs(Y) + 1.5;

Z = min(Triangle1, Triangle2);

surf(X,Y,Z);
shading flat
colormap winter;
hold on;

[X,Y,Z] = sphere();
Sphere = surf(X, Y, Z + 1.5 );% sphere with radius 1 centred at (0,0,1.5)
hold off;

此代码生成的图形如下所示:

《Matlab – 使用surf和min函数减去两个3D图形》

>正方形基座([-1,1] x [-1,1])的金字塔和高于原点(0,0)的高度c = 1.5的顶点竖立.
>通过去除落在以顶点为中心的半径为r = 1的球体内的部分来挖空金字塔的顶部.

所以我需要保留金字塔内部球体表面的一部分并删除其余部分.请注意,每个图中的y轴是不同的,这就是为什么第二个图看起来有点浓缩的原因.是的,有一个金字塔进入球体,很难从这个角度看到.

我将使用70(方位角)和35(仰角)的视角.并确保轴正确缩放(如图所示).在移除球体的适当表面后,我将使用AXIS TIGHT选项获得适当的尺寸.

最佳答案 这是我谦虚的建议:

N = 400; % resolution
x = linspace(-1,1,N);
y = linspace(-1,1,N);
[X,Y] = meshgrid(x,y);
Triangle1 = -abs(X)+1.5 ;
Triangle2 = -abs(Y)+1.5 ;
Z = min(Triangle1, Triangle2);
Trig = alphaShape(X(:),Y(:),Z(:),2);
[Xs,Ys,Zs] = sphere(N-1);
Sphere = alphaShape(Xs(:),Ys(:),Zs(:)+2,2);
% get all the points from the pyramid that are within the sphere:
inSphere = inShape(Sphere,X(:),Y(:),Z(:));
Zt = Z;
Zt(inSphere) = nan; % remove the points in the sphere
surf(X,Y,Zt)
shading interp
view(70,35)
axis tight

我使用alphaShape对象从金字塔中删除所有不需要的点,然后在没有它们的情况下绘制它:

《Matlab – 使用surf和min函数减去两个3D图形》

我知道,它并不完美,因为你没有在金字塔中看到圆圈的底部,但是我所有尝试实现这一目标都失败了.我的基本想法是将它们绘制在一起,如下所示:

hold on;
Zc = Zs;
inTrig = inShape(Trig,Xs(:),Ys(:),Zs(:)+1.5);
Zc(~inTrig) = nan;
surf(Xs,Ys,Zc+1.5)
hold off

但结果并不是那么好,因为你无法真正看到金字塔内的圆圈.

无论如何,我在这里发布,因为它可能会给你一个指导.

点赞