Как создать 3D-спираль в MATLAB или Python?

Я написал код для генерации точек x, y, z спирали и получил такой результат:

Как создать 3D-спираль в MATLAB или Python?

Код:

clear all; delete all, clc;
% Spiral constants
THETA_0 = 5; % constant
THETA_1 = 10.3; % starting angle
A = 3.762;
B = 0.001317;
C = 7.967;
D = 0.1287;
E = 0.003056;

s=2;
% Calculate (x,y,z) coordinates of points defining the spiral path
theta = THETA_1:.1:910.3;  % range, starting degree angle:final degree angle
for i = 1:length(theta)
    if (theta(i)<=99.9)
        R(i) = C*(1-D*log(theta(i)-THETA_0));
    else
%       theta_mod = 0.0002*theta(i)^2+.98*theta(i);
        R(i) = A*exp(-B*theta(i));
    end
    % scaling 
    x(i) = s*R(i)*cosd(theta(i));
    y(i) = s*R(i)*sind(theta(i));
    z(i) = s*E*(theta(i)-THETA_1);
end

helix=animatedline('LineWidth',2);
axis equal;
axis vis3d;
% set (gca,'XLim', [-5 5],'YLim', [-10 10], 'ZLim',[0 6])
view(43,24);
hold on;
for i=1:length(z)
    addpoints(helix, x(i),y(i),z(i));
    head=scatter3 (x(i),y(i),z(i));
    drawnow
%   pause(0.01);
    delete(head);
end

и я хочу спиральную структуру вокруг него, подобную этой

Как создать 3D-спираль в MATLAB или Python?

Пожалуйста, предоставьте код, который вы написали до сих пор, чтобы у других была отправная точка, чтобы помочь вам. Кроме того, что вы пробовали до сих пор, решая свою проблему самостоятельно?

HansHirse 12.03.2019 11:52

Я пытался сделать 2 цилиндра, но не получилось.

NHB 12.03.2019 11:57

Вы должны поддерживать постоянный радиус в плоскости x-y.

Nicky Mattsson 12.03.2019 14:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
2 081
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ваше второе изображение дает вам:

  • Параметрические уравнения для x, y и z.
  • Ограничение на u и v

У вас есть вся необходимая информация для создания вашей геометрии:

%plot the mesh
u=linspace(0,4*pi,50);
v=linspace(0,2*pi,50);
[u,v]=meshgrid(u,v);
x=(1.2+0.5*cos(v)).*cos(u);
y=(1.2+0.5*cos(v)).*sin(u);
z=0.5*sin(v)+u/pi;
surf(x,y,z)
hold on

%plot the 3d line
u = linspace(0,4*pi,40)
x=1.2.*cos(u);
y=1.2.*sin(u);
z=u/pi;
plot3(x,y,z,'r');

axis equal

Теперь вам просто нужно настроить параметрические уравнения, чтобы они соответствовали вашей линии.

Обновлено: Чтобы применить то же решение к вашему конкретному случаю, вам просто нужно заменить u и v вашей переменной theta и R в функции meshgrid:

THETA_0 = 5; % constant
THETA_1 = 10.3; % starting angle
A = 3.762;
B = 0.001317;
C = 7.967;
D = 0.1287;
E = 0.003056;

s=2;
% Calculate (x,y,z) coordinates of points defining the spiral path
theta = THETA_1:5:910.3;
for i = 1:length(theta)
    if (theta(i)<=99.9)
        R(i) = s*C*(1-D*log(theta(i)-THETA_0));
    else
        R(i) = s*A*exp(-B*theta(i));
    end

end

x = R.*cosd(theta);
y = R.*sind(theta);
z = E.*(theta-THETA_1);
plot3(x,y,z,'r','linewidth',2)

hold on
[u,v]=meshgrid(theta,R);
x=(R+0.5*cos(v)).*cosd(u);
y=(R+0.5*cos(v)).*sind(u);
z=0.5*sin(v)+E.*(u-THETA_1);
mesh(x,y,z,'facecolor','none')

axis equal

Результат:

кстати я не большой любитель смешивать cosd и cos в одном скрипте, но делайте что хотите.

Спасибо за ответ. На первом из моих рисунков, для которого я написал программу MATLAB, у меня есть только точки x,y,z, как получить для него точки u и v? Это нарисует трубку вокруг спирали с радиусом r, как вы сделали в своем ответе. Спасибо

NHB 13.03.2019 12:56

@NHB, проверьте мое редактирование, ничего не меняется, вам просто нужно заменить u и v своим значением.

obchardon 13.03.2019 13:04

Спасибо за обновление. R - это вектор в моем случае. Эти два утверждения не работают x=(R+0.5*cos(v)).*cosd(u); y=(R+0,5*cos(v)).*sind(u);

NHB 13.03.2019 13:23

Ваша версия Matlab не поддерживает неявное расширение: проверьте эту ссылку mathworks.com/help/matlab/ref/bsxfun.html

obchardon 13.03.2019 14:19

Спасибо большое. Это было действительно полезно. Я ценю ваше время.

NHB 13.03.2019 16:42

Еще один вопрос, если можно, можете ли вы помочь мне получить переменный диаметр трубки при другом положении спирали?

NHB 13.03.2019 17:17

@NHB похоже, ты не понимаешь, как работают эти параметрические уравнения. Бесполезно просто копировать код без понимания математики. Как только вы поймете, как это работает, вы сможете получить переменный диаметр менее чем за минуту. Также примите этот ответ в качестве решения, поскольку он дает решение вашего первоначального вопроса.

obchardon 13.03.2019 17:33

Потратил некоторое время на поиски этого и хотел поделиться копией кода с дополнительными комментариями о том, что делает каждая переменная. Пожалуйста, поправьте меня, если я ошибаюсь, но я играл с кодом, и это кажется правильным. Надеюсь, это поможет другим, кто в конечном итоге ищет более подробную информацию, потому что прошло некоторое время с момента исчисления III :)

    %% 3D Helical Curve
    % tested on MATLAB R2018a
    % See also https://stackoverflow.com/a/55126315/11895567
    % See also https://stackoverflow.com/q/55119694/11895567
    %
    % Code is in the state used to obtain the second of the two images shown below
    clear, clc, close all
    format compact
    
    %% Input Parameters
    res = 25;   % plot resolution; higher -> finer resolution
    R = 0.15;   % wire radius
    r = 4;      % radius to wire centerline
    t = 3;      % number of coils
    
    %% Surface of the wire
    a = 3;  % scalar for resolutoin for surface.u to make it look nicer
    b = 2;  % Set to 2 for upper and lower surfaces. Set to 1 for upper surface only
    
    surface.u = linspace(0, t*2*pi, a*res); % Path of the wire surface
    surface.v = linspace(0, b*pi, res);     % Wire surface
    [surface.u, surface.v] = meshgrid(surface.u, surface.v);
    
    surface.x = (r + R*cos(surface.v)).*cos(surface.u);
    surface.y = (r + R*cos(surface.v)).*sin(surface.u);
    surface.z = R*sin(surface.v) + surface.u/pi;
    
    %% Center line of the wire
    c = a;  % scalar for resolution for line.u to make it look nicer
    
    line.u = linspace(0, t*2*pi, c*res);
    line.x = r.*cos(line.u);
    line.y = r.*sin(line.u);
    line.z = line.u/pi;
    
    %% Plotting
    f = figure();
    grid on
    hold on
    plot3(line.x, line.y, line.z, 'r');
    surf(surface.x, surface.y, surface.z)
    view(45, 12);   % Azimuth = 45, Elevation = 12
    axis equal

Образцы (предположим, что единицами измерения являются миллиметры):

  1. Входы: R = 0.25, r = 1, t = 1, res = 25
  • Радиус проволоки, R, составляет 0,25 мм.
  • радиус катушки, r, составляет 1 мм
  • количество витков, t, равно 1 (безразмерно)
  • разрешение сюжета, res, равно 25 (безразмерно)

  1. Входы: R = 0.15, r = 4, t = 3, res = 25
  • Радиус проволоки, R, составляет 0,15 мм.
  • радиус катушки, r, составляет 4 мм
  • количество витков, t, равно 3 (безразмерно)
  • разрешение сюжета, res, равно 25 (безразмерно)

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