Я хочу создать изогнутый цилиндр. Например, ось представляет собой синусоидальную кривую или круг.
Я могу получить прямой цилиндр следующим образом
% 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));
который, я думаю, должен дать мне цилиндр с синусоидальной кривой в качестве оси. Но это дает мне
. Теперь я знаю, что параметризация неправильная. Какой была бы правильная параметризация, чтобы получить цилиндр вдоль синусоиды в качестве оси?





Сначала следует указать ориентацию оси цилиндра. На данный момент я собираюсь предположить, что он направлен в направлении 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.
Извините, у меня нет 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}]
Заметка:, вы можете легко расширить это, используя построение кадра Френе-Серре из векторов Tangent, Normal и BiNormal для кривой в трехмерном пространстве f(r)
Спасибо. Как насчет того, чтобы ось была кругом?