Как параметризовать изогнутый цилиндр?

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

Как параметризовать изогнутый цилиндр?

Я могу получить прямой цилиндр следующим образом

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
924
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Спасибо. Как насчет того, чтобы ось была кругом?

zeeshan khan 02.01.2019 12:42

Извините, у меня нет 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)

Другие вопросы по теме