Matlab 在二维空间中旋转弹簧
我有一个可以沿X轴移动的弹簧的例子 绘图(N-弹簧圈数): 动画:Matlab 在二维空间中旋转弹簧,matlab,octave,matlab-figure,Matlab,Octave,Matlab Figure,我有一个可以沿X轴移动的弹簧的例子 绘图(N-弹簧圈数): 动画: t=0:0.01:20; alpha=0:0.01:2*pi; x0=1; x=x0+0.3*cos(alpha); for i=1:length(t) set(Spring,'Xdata',Xpr*x(i)); pause(0.01); end 我需要在飞机上顺时针旋转这个弹簧。一端是固定的。怎么做 已经尝试了很多方法。他们都没有工作。动画的实现思想是使用旋转矩阵。像这样: function L =
t=0:0.01:20;
alpha=0:0.01:2*pi;
x0=1;
x=x0+0.3*cos(alpha);
for i=1:length(t)
set(Spring,'Xdata',Xpr*x(i));
pause(0.01);
end
我需要在飞机上顺时针旋转这个弹簧。一端是固定的。怎么做
已经尝试了很多方法。他们都没有工作。动画的实现思想是使用旋转矩阵。像这样:
function L = Rot2D (Vers, phi)
L(1,:) = Vers(1,:)*cos(phi)-Vers(2,:)*sin(phi)
L(2,:) = Vers(1,:)*sin(phi)+Vers(2,:)*cos(phi)
endfunction
然后将弹簧的每个线圈打包成一个矢量:
N=10;
h=4;
R=0.25;
for i=1:N
Xpr(i)=(i-1)*1/(N-1);
if i==1
Ypr(i)=2.5*R+h;
SpringVector=[Xpr(i);Ypr(i)];
elseif i==N
Ypr(i)=2.5*R+h;
newElem=[Xpr(i);Ypr(i)];
SpringVector=[SpringVector; newElem];
else
Ypr(i)=2.5*R+h/2+h/4*(-1)^i;
newElem=[Xpr(i);Ypr(i)];
SpringVector=[SpringVector; newElem];
end
end
调用之后,Rot2D没有显示任何内容:
y0=1;
y=y0+cos(alpha);
N=10;
for i=1:N
phi=-acos(y(i)-1);
RotArrSpring=Rot2D(SpringVector,phi);
set(Spring,'XData', RotArrSpring(1,:)*x(i), 'YData', RotArrSpring(2,:)*y(i));
pause(0.01);
end
如何解决这个问题?谢谢您的回答。我学会了如何以一定角度转动弹簧 首先,设置一个弹簧
for i=1:N % N number of spring turns
Xpr(i)=(i-1)*1/(N-1);
if i==1
Ypr(i)=1.5*R+H;
elseif i==N
Ypr(i)=1.5*R+H;
else
Ypr(i)=1.5*R+H/2+H/4*(-1)^i;
end
end
Spring=cat(1,Xpr*L,Ypr*L)
alpha=atan2(yA(1),L); % I'll explain in animation
RSpring=Rot2D(Spring,0)
RealSpring=plot(RSpring(1,:),RSpring(2,:)+h);
Rot2D:
function A = Rot2D (Vers, phi)
A(1,:) = Vers(1,:) .* cos(phi) - Vers(2,:) .* sin(phi)
A(2,:) = Vers(1,:) .* sin(phi) + Vers(2,:) .* cos(phi)
endfunction
然后,转到动画。让我们在Y上有一个平衡点。弹簧指向它
for i=1:length(t)
anmPntAy = yA+y(i); %cordinate of our point.
set(PointA,'Ydata',anmPntAy);
alpha(end+1)=atan2(anmPntAy(end),L); % get an angle
RSpring=Rot2D(Spring,-alpha(end)); % rotate our spring
set(RealSpring,'Xdata',RSpring(1,:),'Ydata',RSpring(2,:)+h); % animate spring
pause(0.01);
end
最后一个例子:
t=0:0.01:20;
x0=2;
alpha=0:0.01:2*pi;
x0=1;
x=x0+0.3*cos(alpha);
x01=7;
x1=x01-0.3*cos(alpha);
y0=1;
y=y0+cos(alpha);
L=3;
N=10;
H=4;
R=0.15;
h=6;
a=2;
l=4;
figure
xlim([-1 10])
ylim([-2 10])
xlim manual
ylim manual
axis equal
hold on
addpath(pwd) %sometimes Rot2D don't want to be invoked
xA=4;
yA=h-1-y;
PointA=plot(xA,yA(1),'o');
% Spring
for i=1:N
Xpr(i)=(i-1)*1/(N-1);
if i==1
Ypr(i)=1.5*R+H;
elseif i==N
Ypr(i)=1.5*R+H;
else
Ypr(i)=1.5*R+H/2+H/4*(-1)^i;
end
end
Spring=cat(1,Xpr*L,Ypr*L)
alpha=atan2(yA(1),L);
RSpring=Rot2D(Spring,0)
RealSpring=plot(RSpring(1,:),RSpring(2,:)+h);
for i=1:length(t)
anmPntAy = yA+y(i);
set(PointA,'Ydata',anmPntAy);
alpha(end+1)=atan2(anmPntAy(end),L);
RSpring=Rot2D(Spring,-alpha(end));
set(RealSpring,'Xdata',RSpring(1,:)*x(i),'Ydata',RSpring(2,:)+h);
pause(0.01);
end
是的,这不是一个漂亮的动画,但是改变一些参数会很好。最重要的是结果——弹簧的旋转。刚刚完成
t=0:0.01:20;
alpha=0:0.01:2*pi;
N=10;
h=4;
R=0.25;
for i=1:N
Xpr(i)=(i-1)*1/(N-1);
if i==1
Ypr(i)=2.5*R;
elseif i==N
Ypr(i)=2.5*R;
else
Ypr(i)=2.5*R+h/2+h/4*(-1)^i;
end
end
Spring=plot(Xpr*2,Ypr);
t=0:0.01:20;
alpha=0:0.01:2*pi;
x0=1;
x=x0+0.3*cos(alpha);
T_rotation = 0.002 ;
for i=1:length(t)
% go polar and rotate
[theta,rho] = cart2pol(Xpr*x(i),Ypr-0.5);
theta = theta + T_rotation * i;
% go back to polar
[x_rot,y_rot] = pol2cart(theta,rho);
y_rot = y_rot+0.5;
set(Spring,'Xdata',x_rot);
set(Spring,'Ydata',y_rot);
% set(Spring,'Xdata',Xpr*x(i));
xlim([-4,4])
ylim([-4+0.5,4+0.5])
pause(0.01);
end
@路易斯门多,对不起。在代码上附加链接并添加一些变量。请用类似X-LIM([0,2])的动画来设置一个常数x最短的时间,只需发布一个代码墙就不会帮助OP。考虑用OP代码描述问题,以及如何修复它。阅读,谢谢!我稍后再试。。。我只是从问题中复制了代码,并对其进行了一些修改
t=0:0.01:20;
alpha=0:0.01:2*pi;
N=10;
h=4;
R=0.25;
for i=1:N
Xpr(i)=(i-1)*1/(N-1);
if i==1
Ypr(i)=2.5*R;
elseif i==N
Ypr(i)=2.5*R;
else
Ypr(i)=2.5*R+h/2+h/4*(-1)^i;
end
end
Spring=plot(Xpr*2,Ypr);
t=0:0.01:20;
alpha=0:0.01:2*pi;
x0=1;
x=x0+0.3*cos(alpha);
T_rotation = 0.002 ;
for i=1:length(t)
% go polar and rotate
[theta,rho] = cart2pol(Xpr*x(i),Ypr-0.5);
theta = theta + T_rotation * i;
% go back to polar
[x_rot,y_rot] = pol2cart(theta,rho);
y_rot = y_rot+0.5;
set(Spring,'Xdata',x_rot);
set(Spring,'Ydata',y_rot);
% set(Spring,'Xdata',Xpr*x(i));
xlim([-4,4])
ylim([-4+0.5,4+0.5])
pause(0.01);
end