如何使用Scilab绘制沿(x,y)平面正弦曲线的管道曲面?
用Scilab绘制平面正弦曲线的管道曲面
步骤1:定义中心曲线与核心参数
选取x-y平面上的正弦曲线作为管道的中心曲线c(u),参数u的范围设为[0, L](L为曲线总长度),曲线方程为:
c(u) = [u, A·sin(2πu/L), 0]
其中A是正弦曲线的振幅,可按需调整。
步骤2:推导管道曲面参数方程
结合管道曲面的定义,先计算中心曲线的切向量与法平面基向量:
- 切向量:
t(u) = c’(u) = [1, (2πA/L)·cos(2πu/L), 0] - 切向量模长:
||t(u)|| = sqrt(1 + (2πA/L)²·cos²(2πu/L)) - 法平面的两个单位基向量:
- x-y平面内的单位法向量:
e₁(u) = [ -t₂(u)/||t(u)||, t₁(u)/||t(u)||, 0 ](垂直于切向量) - z轴方向单位向量:
e₂(u) = [0, 0, 1](垂直于x-y平面,属于法平面)
- x-y平面内的单位法向量:
代入管道曲面公式,最终参数方程为:
x(u,v) = u + R·e₁₁(u)·cos(v) y(u,v) = A·sin(2πu/L) + R·e₁₂(u)·cos(v) z(u,v) = R·sin(v)
其中R是管道半径,v∈[0, 2π]是圆周方向的参数。
步骤3:Scilab代码实现
// 配置参数 R = 0.2; // 管道半径 A = 0.5; // 正弦曲线振幅 L = 4*%pi; // 曲线总长度 nu = 100; // u方向采样点数 nv = 50; // v方向采样点数 // 生成参数网格 u = linspace(0, L, nu); v = linspace(0, 2*%pi, nv); [U, V] = ndgrid(u, v); // 计算切向量分量与模长 t1 = 1; t2 = (2*%pi*A/L) .* cos(2*%pi*U/L); t_norm = sqrt(t1^2 + t2.^2); // 计算法平面基向量分量 e11 = -t2 ./ t_norm; e12 = t1 ./ t_norm; // 计算管道曲面坐标 X = U + R .* e11 .* cos(V); Y = A .* sin(2*%pi*U/L) + R .* e12 .* cos(V); Z = R .* sin(V); // 绘制3D曲面 clf(); surf(X, Y, Z); colorbar(); xlabel('X'); ylabel('Y'); zlabel('Z'); title('正弦曲线管道曲面'); lighting('phong'); material('dull');
代码说明
- 参数可灵活调整:修改
R改变管道粗细,A调整正弦曲线起伏幅度,L控制曲线长度。 ndgrid用于生成二维参数网格,确保每个(u,v)组合对应曲面上的一个点。lighting和material参数用于优化曲面的渲染质感。
内容的提问来源于stack exchange,提问作者Stéphane Mottelet
相关产品推荐
相关产品推荐

