1

我正在尝试创建一个类似于下图的立方体,但使用从方程式创建的直线和曲线而不是直线。 3D 网格图像

类似于how-to-plot-3d-grid-cube-in-matlab

在小组和 am304 的帮助下,我可以创建立方体的一侧,见下图 立方体的一侧

我可以重复侧面见下图。但我不知道如何挤压它以产生一个将线条和曲线连接在一起的立方体。 重复面

这是我尝试使用的代码。

clear all,clf reset,tic,clc, close all, 

S=[15.3039,10.3612,7.9153,6.3793,5.3019,4.4955,3.8656,3.3584,2.9405,2.5903,2.2926,2.0367,1.8146,1.6204,1.4496,1.2983,1.1638,1.04377,.93622,.83959,.75256,.67401,.603,.53871,.48045,.42762,.37969,.33619,.29673,.26094,.22852,.19917,.17265,.14874,.12722,.10791,.090664,.075316,.061733,.049793,.039383,.030399,.0227475,.0163414,.0111008,.0069525,.0038286,.0016664,.0004081];
x = linspace(0,1,100);
T = 1.12;

y1 = zeros(length(x),length(S));
for ii = 1:length(x)
   for jj = 1:length(S)
      y1(ii,jj) = exp(log(1-x(ii)^(S(jj)*T))/(S(jj)*T));
   end
end

[x2 z2]=meshgrid(y1(1,:),x); %create mesh grid to get correct array size

x1a_dis=linspace(0,1,5); %number of slices wanted
for rr=1:1:length(x1a_dis)
  x1a_new=repmat(x1a_dis(rr),[size(x2,1),size(x2,2)]);
  hold on
  plot3(x1a_new,y1,z2,'r');
end
axis([-.1 1.1 0 1 0 1])
xlabel('X-axis')
ylabel('Y-axis')
zlabel('Z-axis')
view(3)
grid on
rotate3d on %enables automatic 3d rotation

PS:我使用的是类似于 Matlab 的 Octave 4.2.2

4

1 回答 1

1

您需要添加另外两个循环来绘制另外两组 2D 网格:

for rr=1:1:length(x1a_dis)
  x1a_new = repmat(x1a_dis(rr),size(z2));
  hold on
  plot3(x1a_new,y1,z2,'r');
end

for rr=1:1:length(x1a_dis)
  x1a_new = repmat(x1a_dis(rr),size(z2));
  hold on
  plot3(z2,x1a_new,y1,'r');
end

for rr=1:1:length(x1a_dis)
  x1a_new = repmat(x1a_dis(rr),size(z2));
  hold on
  plot3(y1,z2,x1a_new,'r');
end

3D立方体

注意:您可以通过以下几种方式简化代码:

1.线路:

y1(ii,jj) = exp(log(1-x(ii)^(S(jj)*T))/(S(jj)*T));

可以简化为:

y1(ii,jj) = (1-x(ii)^(S(jj)*T)).^(1/(S(jj)*T));

使用 log 和 exp 规则。

2.循环(更改编号1后):

y1 = zeros(length(x),length(S));
for ii = 1:length(x)
   for jj = 1:length(S)
      y1(ii,jj) = (1-x(ii)^(S(jj)*T)).^(1/(S(jj)*T));
   end
end

可以简化为:

[SMesh, xMesh] = meshgrid(S, x);
y1 = ( 1 - xMesh.^(SMesh*T) ).^( 1./(SMesh*T) );

它更快更短。

3.绘图循环:

[x2 z2]=meshgrid(y1(1,:),x); %create mesh grid to get correct array size

x1a_dis=linspace(0,1,5); %number of slices wanted
for rr=1:1:length(x1a_dis)
  x1a_new=repmat(x1a_dis(rr),[size(x2,1),size(x2,2)]);
  hold on
  plot3(x1a_new,y1,z2,'r');
end

可以简化为:

z2 = repmat(x(:), [1 length(S)]);

x1a_dis=linspace(0,1,5); %number of slices wanted
for rr=1:1:length(x1a_dis)
  x1a_new = repmat(x1a_dis(rr),size(z2));
  hold on
  plot3(x1a_new,y1,z2,'r');
end

可能还有更多的简化可以做。

于 2019-05-20T09:02:45.973 回答