Я написал код для генерации точек x, y, z спирали и получил такой результат:
Код:
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
и я хочу спиральную структуру вокруг него, подобную этой
Я пытался сделать 2 цилиндра, но не получилось.
Вы должны поддерживать постоянный радиус в плоскости x-y.






Ваше второе изображение дает вам:
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, проверьте мое редактирование, ничего не меняется, вам просто нужно заменить u и v своим значением.
Спасибо за обновление. R - это вектор в моем случае. Эти два утверждения не работают x=(R+0.5*cos(v)).*cosd(u); y=(R+0,5*cos(v)).*sind(u);
Ваша версия Matlab не поддерживает неявное расширение: проверьте эту ссылку mathworks.com/help/matlab/ref/bsxfun.html
Спасибо большое. Это было действительно полезно. Я ценю ваше время.
Еще один вопрос, если можно, можете ли вы помочь мне получить переменный диаметр трубки при другом положении спирали?
@NHB похоже, ты не понимаешь, как работают эти параметрические уравнения. Бесполезно просто копировать код без понимания математики. Как только вы поймете, как это работает, вы сможете получить переменный диаметр менее чем за минуту. Также примите этот ответ в качестве решения, поскольку он дает решение вашего первоначального вопроса.
Потратил некоторое время на поиски этого и хотел поделиться копией кода с дополнительными комментариями о том, что делает каждая переменная. Пожалуйста, поправьте меня, если я ошибаюсь, но я играл с кодом, и это кажется правильным. Надеюсь, это поможет другим, кто в конечном итоге ищет более подробную информацию, потому что прошло некоторое время с момента исчисления 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
Образцы (предположим, что единицами измерения являются миллиметры):
R = 0.25, r = 1, t = 1, res = 25R, составляет 0,25 мм.r, составляет 1 ммt, равно 1 (безразмерно)res, равно 25 (безразмерно)R = 0.15, r = 4, t = 3, res = 25R, составляет 0,15 мм.r, составляет 4 ммt, равно 3 (безразмерно)res, равно 25 (безразмерно)
Пожалуйста, предоставьте код, который вы написали до сих пор, чтобы у других была отправная точка, чтобы помочь вам. Кроме того, что вы пробовали до сих пор, решая свою проблему самостоятельно?