如何参数化曲面体?(How to parameterize a curved cylinder?)

2019-09-27 09:24发布

我要生成的弯曲的圆筒。 例如,对于轴是正弦曲线或圆形。

我可以得到一个直筒如下

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

我认为应该给我用的轴正弦曲线的圆柱体。 但是,它给了我 现在,我知道的参数是错误的。 什么是正确的参数相处正弦波作为轴筒?

Answer 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)

你还需要一个yshift如果在x轴和y方向上的气缸振荡(或曲线)的轴线。



Answer 2:

对不起,我没有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) 所有我们需要做的就是定义正交向量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)

在此数学阅读:

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)



文章来源: How to parameterize a curved cylinder?