Как параметризовать изогнутый цилиндр? - PullRequest
0 голосов
/ 02 января 2019

Я хочу создать изогнутый цилиндр.Например, если ось является синусоидой или окружностью.

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 голосов
/ 03 января 2019

Извините, у меня нет Matlab, но это аналог Mathematica.Я думаю, что вы можете перевести это

Вместо того, чтобы иметь наклонный цилиндр, представленный в ответе Савитру , мы можем сделать версию, которая следует заданной кривой.

По сути, вам нужен набор окружностей, все ортогональные кривой 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)

В 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

примечание: вы можете легко расширить это, используя построение кадра Френе-Серре из векторов Tangent, Normal и BiNormal для кривой в трехмерном пространстве f(r)

0 голосов
/ 02 января 2019

Сначала необходимо указать ориентацию оси цилиндра.Сейчас я собираюсь предположить, что он направлен в направлении 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.

Curved cylinder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...