在MuPAD中使用plot::tube
功能,我可以生成具有不同脊柱的管,但横截面始终是圆形,尽管半径可以沿脊柱变化。例如:
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中实现这一目标?
P.S。我可以使用MATLAV生成具有任意横截面的管子,因此请避免包含使用纯MATLAB命令的答案。
答案 0 :(得分:1)
至于你的第一个问题是否可以用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,所以我不知道你问题的优雅解决方案。对于半圆形基线的简单示例,我可以使用低级plot::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
)。