【问题标题】:Generate tubes with non-circular cross-sections in MuPad在 MuPad 中生成具有非圆形横截面的管
【发布时间】:2023-03-25 20:25:01
【问题描述】:

使用 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 中实现这一点?

附:我可以使用 MATLAV 生成具有任意横截面的管,因此请避免包含使用纯 MATLAB 命令的答案。

【问题讨论】:

    标签: matlab mupad


    【解决方案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)。

    【讨论】:

    • 太棒了!谢谢你。我现在可以算出任意横截面了。
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 2021-11-18
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2018-12-10
    相关资源
    最近更新 更多