2017-03-16 32 views
2

我有一系列橢圓,並知道它們的中心的尺寸和位置。我想繪製它們並通過它們中的每一個來創建一個3d管道。如何用橢圓放樣在MATLAB或Python中創建3D空心管道?

在MATLAB中或Python中的3D庫中是否有放樣特徵(如果是這樣,哪個庫)?另外,我想實時添加這些橢圓,所以留在MATLAB中會更好。但是,如果有一個Python解決方案,我將如何實現它以在MATLAB和Python文件之間進行通信以維持實時鏈接。

我會想象它會是這個樣子,除了空心:

.

這將是巨大的,如果你能提供無論是在MATLAB或Python了一個解決方案。

回答

1

您可以將其作爲一個兩步過程來完成。

首先,像擬合曲線以所需的半徑創建所需的配置文件:

% 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); 

本實施例的結果如下所示:

擴展

先前方法可以擴展到其他任意形狀。作爲一個例子,我們從社交圈變成橢圓用公式:

equation of ellipse

上面的代碼然後可以修改成這個樣子:

%% 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 

產生如下圖,其中省略號生成的閣樓黑色表示:

loft with ellipses

+0

謝謝,這是我需要的。我想知道如何讓圓圈變成省略號,因爲我的數據由大小半徑組成。我試圖爲第二個半徑添加另一個變量,但它不會讓我爲該公式添加兩個以上的變量。另外,我想從當前座標(0,0)中偏移這些圓/橢圓的中心。再次感謝您的幫助。 – vinayksk

+0

有沒有辦法爲每個橢圓添加變量x和y偏移量?感謝你的快速回復。 – vinayksk

+0

@vinayksk我在代碼中添加了每個橢圓的偏移量,它使得看起來相當奇怪的水罐,但是我希望它能說明如何將它用於任何可以參數化的形狀。 –