至于你的第一个问题,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)。