如何参数化弯曲圆柱体?

时间:2019-01-01 22:26:20

标签: matlab geometry

我想生成一个弯曲的圆柱体。例如,将轴设为正弦曲线或圆。

curved cylinder

我可以得到一个笔直的圆柱体

% 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); 

给一个圆柱cylinder,如果第9行更改为

z = (0:l-1)' * sin(linspace(-pi,pi,nTheta));

我认为应该给我一个以正弦曲线为轴的圆柱体。但是,它给了我curved wrong现在,我知道参数化是错误的。将圆柱体沿正弦轴作为轴的正确参数设置是什么?

2 个答案:

答案 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

Curved cylinder

答案 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)。我们需要做的就是定义正交向量uv。我们知道它们与单位矢量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}]

enter image description here

注意:您可以使用Frenet-Serret框架轻松地从切线,法线和BiNormal向量中为3D空间f(r)

中的曲线扩展此范围。