我想生成一个弯曲的圆柱体。例如,将轴设为正弦曲线或圆。
我可以得到一个笔直的圆柱体
% 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));
我认为应该给我一个以正弦曲线为轴的圆柱体。但是,它给了我现在,我知道参数化是错误的。将圆柱体沿正弦轴作为轴的正确参数设置是什么?
答案 0 :(得分:1)
首先,应指定圆柱轴的方向。现在,我将假定它指向z方向,并且仅在x方向振动(即,轴的方程为x = sin(z)
和y=0
)。
如果圆柱体的轴随z
变化,则圆柱体表面的x,y
坐标也应为z
的函数。为此,您可以像平时一样先计算直圆柱体的x,y
点,然后添加一个依赖于本地z
值的“移位”。
代码如下:
% Parameters
r=5; l=5; nTheta=100, nL = 20;
theta = linspace(0,2*pi,nTheta+1);
x = r * cos(theta);
y = r * sin(theta);
z = linspace(0,l,nL)';
xshift = repmat( sin(z), 1, nTheta+1); %this is a function of z
X = repmat(x,nL,1) + xshift;
Y = repmat(y,nL,1);
Z = repmat(z, 1, nTheta+1);
% Plot
surf(X,Y,Z)
如果圆柱体的轴在x和y方向上都发生振荡(或弯曲),则还需要yshift
。
答案 1 :(得分:1)
对不起,我没有Matlab,但这是Mathematica的类似物。我想你可以翻译
我们不必像answer of Savithru中那样使用斜圆柱,而是可以按照给定曲线进行变形。
基本上,您需要的是一组全部与尝试遵循的曲线f(x)
正交的圆。首先,让我们定义一个圆:
圈子:
假设在垂直于单位矢量R
的平面中经过点w=(w1,w2,w3)
的半径(X0,Y0,Z0)
的圆。该平面由两个垂直于u=(u1,u2,u3)
的单位矢量v=(v1,v2,v3)
和w
定义。圆的参数方程为:
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π的范围内变化。
现在我们定义了圆,让我们定义管。
电子管:
要定义表面,我们需要两个参数,第一个是圆中的theta
。如果我们要遵循x
,第二个将是f(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框架轻松地从切线,法线和BiNormal向量中为3D空间f(r)