您可以將其作爲一個兩步過程來完成。
首先,像擬合曲線以所需的半徑創建所需的配置文件:
% Create the profile
Zradii = [0 1 5 10 12 14 16];
Rradii = [1 1.5 1 0.8 1.3 0.6 0.5];
pp = spline(Zradii,[0.5 Rradii 0]);
在這裏,我在Zradii
與相應Rradii
給出半徑給予高度定義的環。
接着,通過標繪使用fsurf
像這樣的簡檔創建閣樓表面:
% Loft
r = @(u,v) ppval(pp,v);
funx = @(u,v) r(u,v).*cos(u);
funy = @(u,v) r(u,v).*sin(u);
funz = @(u,v) v;
fsurf(funx,funy,funz,[0 2*pi min(Zradii) max(Zradii)])
camlight
axis square;
view(70,10);
本實施例的結果如下所示:
擴展
先前方法可以擴展到其他任意形狀。作爲一個例子,我們從社交圈變成橢圓用公式:
上面的代碼然後可以修改成這個樣子:
%% Create the profile
Z = [0 1 5 10 12 14 16];
A = [1 1.5 1 0.8 1.3 0.6 0.5]; % Major Axis
B = [0.5 1 1.2 1 0.5 0.7 0.5]; % Minor Axis
X = [1 1 1 1 2 2 2]; % X Offset of each ellipse
Y = [1 1 1 1 2 2 2]; % Y Offset of each ellipse
ppA = spline(Z,[0.5 A 0]);
ppB = spline(Z,[0.5 B 0]);
ppX = spline(Z,X);
ppY = spline(Z,Y);
%% Loft
ellipse = @(t,a,b) a.*b./sqrt((a.*cos(t)).^2 + (b.*sin(t)).^2);
r = @(u,v) ellipse(u, ppval(ppA,v), ppval(ppB,v));
funx = @(u,v) r(u,v).*cos(u) + ppval(ppX,v);
funy = @(u,v) r(u,v).*sin(u) + ppval(ppY,v);
funz = @(u,v) v;
fsurf(funx,funy,funz,[0 2*pi min(Z) max(Z)],'linestyle','none')
camlight
axis square;
view(80,5);
%% Add the ellipses in black
hold on
t=linspace(0,2*pi);
arrayfun(@(z)plot3(funx(t,z),funy(t,z),z*ones(size(t)),'k','Linewidth',2),Z)
hold off
產生如下圖,其中省略號生成的閣樓黑色表示:
謝謝,這是我需要的。我想知道如何讓圓圈變成省略號,因爲我的數據由大小半徑組成。我試圖爲第二個半徑添加另一個變量,但它不會讓我爲該公式添加兩個以上的變量。另外,我想從當前座標(0,0)中偏移這些圓/橢圓的中心。再次感謝您的幫助。 – vinayksk
有沒有辦法爲每個橢圓添加變量x和y偏移量?感謝你的快速回復。 – vinayksk
@vinayksk我在代碼中添加了每個橢圓的偏移量,它使得看起來相當奇怪的水罐,但是我希望它能說明如何將它用於任何可以參數化的形狀。 –