我想生成一个弯曲的圆柱体。例如,轴是正弦曲线或圆。
我可以得到一个直柱体,如下所示
% 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));
我想这应该会给我一个以正弦曲线为轴的圆柱体。但是,它现在给了我
,我知道参数化是错误的。将圆柱体沿着正弦作为轴的正确的参数设置是什么?
3条答案
按热度按时间yruzcnhs1#
与answer of Savithru中所示的倾斜圆柱体不同,我们可以使用遵循给定曲线的版本。
从本质上讲,你需要的是一组圆,它们都与你试图沿着的曲线
f(x)
垂直。首先,让我们定义一个圆:圈子:
假设在垂直于单位向量
w=(w1,w2,w3)
的平面上有一个半径为R
的圆,它穿过点(X0,Y0,Z0)
。该平面由两个垂直于w
的单位向量u=(u1,u2,u3)
和v=(v1,v2,v3)
定义。圆的参数方程为:其中,
theta
在0到2π的间隔内变化。现在我们定义了圆,让我们定义管子。
管子:
要定义曲面,我们需要两个参数,第一个参数是圆的
theta
。如果我们想跟踪f(x)
,第二个将是x
。我们所需要做的就是定义正交向量u
和v
。我们知道它们与单位向量w
是正交的,这只不过是用一阶导数得到的f(x)
的切线。因此,您可以定义:因此,您的参数方程变为:
在MATHEMICAL A中,这是这样的:
**注意:**您可以使用从3D空间
f(r)
中的曲线的切线、法线和双法线向量构建的Frenet-Serret帧轻松扩展这一点23c0lvtd2#
首先,应指定圆柱体的轴的方向。现在,我假设它指向z方向,它将只在x方向振荡(即轴的方程是
x = sin(z)
和y=0
)。如果圆柱体的轴随
z
变化,则圆柱体表面的x,y
坐标也应该是z
的函数。您可以这样做:首先计算直线圆柱体的x,y
点,然后添加一个依赖于本地z
值的“Shift”。代码如下:
如果圆柱体的轴在x方向和y方向上都振荡(或曲线),则还需要
yshift
。33qvvth13#
我想我应该在这里加上我的答案,因为我正试图做类似的事情,而@kvantour的答案真的很有帮助。在我的例子中,我使用了Python,并将圆柱体的两端逐渐变细。
Matplotlib:
Mayavi: