我要生成的弯曲的圆筒。 例如,对于轴是正弦曲线或圆形。
我可以得到一个直筒如下
% 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);
给出了一个气缸 如果9号线改为
z = (0:l-1)' * sin(linspace(-pi,pi,nTheta));
我认为应该给我用的轴正弦曲线的圆柱体。 但是,它给了我 现在,我知道的参数是错误的。 什么是正确的参数相处正弦波作为轴筒?
首先,你应该指定气缸轴线的方向。 现在,我将假设它指出在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)
你还需要一个yshift
如果在x轴和y方向上的气缸振荡(或曲线)的轴线。
对不起,我没有Matlab的,但是这是一个数学模拟。 我想你可以把它翻译
而不是如出现斜筒的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)
在此数学阅读:
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)