gpt4 book ai didi

matlab - 如何参数化弯曲圆柱体?

转载 作者:行者123 更新时间:2023-12-02 17:01:26 26 4
gpt4 key购买 nike

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

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现在,我知道参数化是错误的。使圆柱体沿正弦轴为轴的正确参数化是什么?

最佳答案

抱歉,我没有 Matlab,但这是一个 Mathematica 模拟软件。我想你可以翻译它

而不是像 answer of Savithru 中展示的那样有一个倾斜的圆柱体,我们可以做遵循给定曲线的版本。

本质上,您需要的是一组与您尝试遵循的曲线 f(x) 正交的圆。首先,让我们定义一个圆:

圆圈:

假设一个半径为 R 的圆在垂直于单位向量 w=(w1,w2,w3) 的平面内,它通过点 (X0, Y0,Z0)。该平面由垂直于 w< 的两个单位向量 u=(u1,u2,u3)v=(v1,v2,v3) 定义。圆的参数方程为:

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π 的区间内变化。

现在我们定义了圆,让我们定义管。

pipe :

要定义一个曲面,我们需要两个参数,第一个是圆的 theta。如果我们想跟随 f(x),第二个将是 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 框架轻松扩展它,用于 3D 空间中的曲线f(r)

关于matlab - 如何参数化弯曲圆柱体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com