如何在MATLAB或Python中使用椭圆放样来创建三维空心管?

如何在MATLAB或Python中使用椭圆放样来创建三维空心管?,python,matlab,3d,Python,Matlab,3d,我有一系列的椭圆,知道它们的尺寸和中心的位置。我想打印它们,并通过它们中的每一个进行放样,以创建一个三维管道 MATLAB或Python中的3D库中是否有放样功能(如果有,是哪个库)?此外,我想实时添加这些椭圆,因此最好留在MATLAB中。但是,如果有Python解决方案,我将如何实现它以在MATLAB和Python文件之间进行通信,从而维护实时链接 我可以想象它除了空心外,看起来像这样: 如果您可以在MATLAB或Python中提供解决方案,那就太好了。您可以通过两个步骤来完成 首先,通过将

我有一系列的椭圆,知道它们的尺寸和中心的位置。我想打印它们,并通过它们中的每一个进行放样,以创建一个三维管道

MATLAB或Python中的3D库中是否有放样功能(如果有,是哪个库)?此外,我想实时添加这些椭圆,因此最好留在MATLAB中。但是,如果有Python解决方案,我将如何实现它以在MATLAB和Python文件之间进行通信,从而维护实时链接

我可以想象它除了空心外,看起来像这样:


如果您可以在MATLAB或Python中提供解决方案,那就太好了。

您可以通过两个步骤来完成

首先,通过将曲线拟合到所需半径来创建所需轮廓,如:

%创建配置文件
Zradii=[0 1 5 10 12 14 16];
Rradii=[11.51.81.30.60.5];
pp=样条曲线(Zradii,[0.5 Rradii 0]);
在这里,我定义了
Zradii
中给出的高度处的环,以及
Rradii
中给出的相应半径

接下来,通过如下方式打印轮廓来创建放样曲面:

%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最小值(Zradii)最大值(Zradii)])
卡姆莱特
轴线广场;
视图(70,10);
此示例的结果如下所示:

扩展

前面的方法可以扩展到其他任意形状。例如,我们使用以下等式将圆变为椭圆:

然后可以修改前面的代码,使其如下所示:

%%创建配置文件
Z=[015102146];
A=[11.510.81.30.60.5];%长轴
B=[0.511.2110.5070.5];%短轴
X=[12];%每个椭圆的X偏移
Y=[1 1 2];%每个椭圆的Y偏移
ppA=样条曲线(Z,[0.5 a0]);
ppB=样条曲线(Z,[0.5 b0]);
ppX=样条曲线(Z,X);
ppY=样条曲线(Z,Y);
%%阁楼
椭圆=@(t,a,b)a.*b./sqrt((a.*cos(t))。^2+(b.*sin(t))。^2);
r=@(u,v)椭圆(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最小值(Z)最大值(Z)],'linestyle','none')
卡姆莱特
轴线广场;
视图(80,5);
%%添加黑色的椭圆
等等
t=linspace(0,2*pi);
arrayfun(@(z)绘图3(funx(t,z),funy(t,z),z*one(大小(t)),'k','Linewidth',2),z)
拖延
这将生成以下绘图,其中生成放样的椭圆以黑色显示:


对于那些对上述答案的Python实现感兴趣的人:

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from scipy.interpolate import CubicSpline
from matplotlib import cm

#Create the profile
Radii = [1, 1.5, 1, 0.8, 1.3, 0.6, 0.5]
Zradii = [0, 1, 5, 10, 12, 14, 16]

radius = CubicSpline(Zradii, Radii, bc_type=((1, 0.5), (1, 0.0)))

# Make data
thetarange = np.linspace(0, 2 * np.pi, 100)
zrange = np.linspace(min(Zradii), max(Zradii),100)
X = [radius(z)*np.cos(thetarange) for z in zrange]
Y = [radius(z)*np.sin(thetarange) for z in zrange]
Z = np.array([[z] for z in zrange])

# Plot the surface
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_xlim3d(-2, 2)
ax.set_ylim3d(-2, 2)
ax.set_zlim3d(0, 20)
ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)

#Plot the circles
for zz in Zradii:
    XX = radius(zz)*np.cos(thetarange)
    YY = radius(zz)*np.sin(thetarange)
    ax.plot(XX,YY,zz, lw=1, color='k')

plt.show();

对于椭圆:

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from scipy.interpolate import CubicSpline
from matplotlib import cm

#Create the profile
Zradii = [0, 1, 5, 10, 12, 14, 16]
ARadii = [1, 1.5, 1, 0.8, 1.3, 0.6, 0.5] #Major axis
BRadii = [0.5, 1, 1.2, 1, 0.5, 0.7, 0.5] # Minor Axis
XOFFSET = [1, 1, 1, 1, 2, 2, 2]    # X Offset of each ellipse
YOFFSET = [1, 1, 1, 1, 2, 2, 2]    # Y Offset of each ellipse

aradius = CubicSpline(Zradii, ARadii, bc_type=((1, 0.5), (1, 0.0)))
bradius = CubicSpline(Zradii, BRadii, bc_type=((1, 0.5), (1, 0.0)))
xoffset = CubicSpline(Zradii, XOFFSET)
yoffset = CubicSpline(Zradii, YOFFSET)

# Make data
npoints=100
thetarange = np.linspace(0, 2 * np.pi, npoints)
zrange = np.linspace(min(Zradii), max(Zradii), npoints)

X = [xoffset(z) + aradius(z)*np.cos(thetarange) for z in zrange]
Y = [yoffset(z) + bradius(z)*np.sin(thetarange) for z in zrange]
Z = np.array([[z] for z in zrange])

# Plot the surface
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_xlim3d(-2, 5)
ax.set_ylim3d(-2, 5)
ax.set_zlim3d(0, 20)
ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)

#Plot the ellipses
for zz in Zradii:
    XX = xoffset(zz) + aradius(zz)*np.cos(thetarange)
    YY = yoffset(zz) + bradius(zz)*np.sin(thetarange)
    ax.plot(XX,YY,zz, lw=1, color='k')

plt.show();

谢谢,这是我需要的。我想知道如何使这些圆变成椭圆,因为我的数据由一个大半径和一个小半径组成。我试图为第二个半径添加另一个变量,但它不允许我为方程添加两个以上的变量。此外,我想从当前坐标(0,0)偏移这些圆/椭圆的中心。再次感谢您的帮助。有没有办法为每个椭圆添加变量x和y偏移?谢谢您的快速回复。@vinayksk我在代码中添加了每个椭圆的偏移量,它看起来很奇怪,但我希望它能说明如何将其用于任何可以参数化的形状。谢谢,这应该很好。我已经实现了这个代码来分析视频。每五帧,我的程序确定视频中圆的X和Y坐标以及X和Y偏移,并将这些值添加到各自的数组中(我预设了Z值)。正如我所希望的那样,这将生成一个管道的三维模型。我想让这个节目与现场视频饲料的工作。我已经了解了如何从实时视频中获取帧,但想知道如何在弹出窗口中直观地看到每个层添加到我的3D模型中,而不在每个帧后生成新模型。