使用plot::tube
MuPAD 中的函数,我可以生成具有不同脊柱的管,但横截面始终是圆形,尽管半径可以沿脊柱变化。例如:
plot::Tube([cos(t), sin(t), 0], 0.4 + 0.3*sin(t)*cos(t),t = -0.5*PI..0.5*PI,Mesh=[60,12]):
我想绘制具有(非圆形)椭圆横截面的管子。有没有办法在 MuPAD 中实现这一点?
PS我可以使用MATLAV生成具有任意横截面的管,因此请避免包含使用纯MATLAB命令的答案。
至于你的第一个问题是否可以这样做plot::Tube
:我不这么认为。考虑这个功能的帮助(强调我的):
plot::Tube
创建广义管状图,称为“运河表面”,特殊情况称为“管表面”、“管道表面”或“管状表面”。直观地说,运河表面是有厚度的空间曲线。更正式地说,运河表面
plot::Tube([x(t), y(t), z(t)], r(t), t = t_min..t_max)
是具有中心和半径的球体的包络线,即曲线的粗细可以随曲线参数而变化[x(t), y(t), z(t)]
r(t)
t
管被定义为球体集合的包络这一事实表明它们的横截面本质上是圆形的。
我不熟悉 MuPAD,所以我不知道您问题的优雅解决方案。对于半圆形基线的简单示例,我可以使用 low-levelplot::Surface
手动构建表面来组合这个 kludgy 解决方案:
plot(
plot::Surface(
matrix([cos(t),sin(t),0])
+ numeric::rotationMatrix(t,[0,0,1]) * matrix([(0.2+0.1*sin(2*t))*cos(u),0,(0.2+0.1*cos(2*t))*sin(u)]),
t = -PI/2..PI/2,
u = 0..2*PI,
Mesh = [30,30]),
Scaling=Constrained)
这里t
表示沿半圆形基线(环面方向)的角度参数,u
是沿横截面(极向方向)的角度。给定的角度横截面t
如下所示:
[(0.2+0.1*sin(2*t))*cos(u), 0, (0.2+0.1*cos(2*t))*sin(u)]
即半长轴是(0.2+0.1*sin(2*t))
和(0.2+0.1*cos(2*t))
沿着管的横截面。
你可以看到我使用了一个围绕z
轴的旋转矩阵来构建表面。这充分利用了基线是半圆的事实。但是,在一般情况下,应该可以计算参数化基线的导数(相对于t
),并从中计算必要的旋转角度(使用参数t
)。