我想生成一个弯曲的圆柱体。例如,轴是正弦曲线或圆。
我可以得到一个直圆柱体如下
% Parameters
r=5; l=5; nTheta=100;
theta = 2*pi*(linspace(0,1,nTheta+1));
x = r * cos(theta);
x(end) = []; % Last element is same as first. So, just remove it
y = r * sin(theta);
y(end) = [];
z = repmat((0:l-1)', 1, nTheta);
% Plot
surf(repmat(x,l,1),repmat(y,l,1),z);
z = (0:l-1)' * sin(linspace(-pi,pi,nTheta));
我认为应该给我一个以正弦曲线为轴的圆柱体。但是,它给了我 现在,我知道参数化是错误的。使圆柱体沿正弦轴为轴的正确参数化是什么?
最佳答案
抱歉,我没有 Matlab,但这是一个 Mathematica 模拟软件。我想你可以翻译它
而不是像 answer of Savithru 中展示的那样有一个倾斜的圆柱体,我们可以做遵循给定曲线的版本。
本质上,您需要的是一组与您尝试遵循的曲线 f(x)
正交的圆。首先,让我们定义一个圆:
圆圈:
假设一个半径为 R
的圆在垂直于单位向量 w=(w1,w2,w3)
的平面内,它通过点 (X0, Y0,Z0)
。该平面由垂直于 w< 的两个单位向量
。圆的参数方程为:u=(u1,u2,u3)
和 v=(v1,v2,v3)
定义
x = X0 + R cos(theta) u1 + R sin(theta) v1
y = Y0 + R cos(theta) u2 + R sin(theta) v2
z = Z0 + R cos(theta) u3 + R sin(theta) v3
其中 theta
在 0 到 2π 的区间内变化。
现在我们定义了圆,让我们定义管。
pipe :
要定义一个曲面,我们需要两个参数,第一个是圆的 theta
。如果我们想跟随 f(x)
,第二个将是 x
。我们需要做的就是定义正交向量 u
和 v
。我们知道它们正交于单位向量w
,这不过是f(x)
的一阶导数的切线。因此你可以定义:
w = Normalize[{1,f'(x),0}]
u = Normalize[Cross[w,{0,0,1}]]
v = Cross[w,u]
所以你的参数方程变成:
x = x + R cos(theta) u1(x) + R sin(theta) v1(x)
y = f(x) + R cos(theta) u2(x) + R sin(theta) v2(x)
z = 0 + R cos(theta) u3(x) + R sin(theta) v3(x)
在 Mathematica 中是这样写的:
R=1
f[x_] := Sin[x]
w[x_] := Normalize[{1, f'[x], 0}]
u[x_] := Normalize[Cross[w[x], {0, 0, 1}]]
v[x_] := Cross[w[x], u[x]]
ParametricPlot3D[{x, f[x], 0} + R Cos[t] u[x] + R Sin[t] v[x], {x, 0, 2 Pi}, {t, 0, 2 Pi}]
注意:您可以使用从切线、法线和双法线向量构建的 Frenet-Serret 框架轻松扩展它,用于 3D 空间中的曲线f(r)
关于matlab - 如何参数化弯曲圆柱体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999426/