Для меня есть несколько неясных вещей:
Согласно вашему определению hLine
и hText
вектор / массив b
должен содержать значения y длямяч в определенные моменты времени.Вместо этого вы определяете b=linspace(x1,10,numPoints)
.Это дает вам конкретные моменты времени.
Что такое ball
?Он используется в цикле while, но нигде не определен.
Сначала вы определяете x=[0;10]
, а через несколько строк вы переопределяете x=g/2 * t.^2;
.
Если я правильно понял ваши потребности, вот способ сделать это:
%% definitions
%# control animation speed
DELAY = 0.01;
%numPoints = 600;
% initial velocity is assumed to be zero
g = -9.81; % [m/s^2]
m = 1; % [kg]
v = -10; % velocity [m/s]
tball = [0:DELAY:2]; % Vector with 10 Elements, step size: 0.01
t = linspace(0, 2, 500); % for plotting the two curves
%%equations
x = g/2 * t.^2; % distance
x1 = 1/2 * v^2/g; % distance at v=-10m/s
dx = g * t; % velocity
ball1 = g/2 * tball.^2; % Position of Ball 1
ball2 = g * tball; % Position of Ball 2
%b = linspace(x1,10,numPoints); %ball --> way x
%%plotting
clf
figure('DoubleBuffer','on')
yyaxis left
plot (t,x)
hold on
xlabel('t [s]')
ylabel('x [m]')
yyaxis right
plot (t, dx)
hold on
xlabel('t [s]')
ylabel('dx [m/s]')
title('Trajectory of the fallen ball')
lgd = legend({'x(t)','v(t)'},'FontSize',12, 'location', 'NorthEast');
set(gca, 'Fontsize', 18)
grid on
% create moving point coords text for ball 1 and ball 2
hLine1 = line('XData',tball(1), 'YData',ball1(1), 'Color','r', ...
'Marker','o', 'MarkerSize',6, 'LineWidth',2);
hTxt1 = text(tball(1), ball1(1), sprintf('(%.3f,%.3f)',tball(1),ball1(1)), ...
'Color',[0.2 0.2 0.2], 'FontSize',8, ...
'HorizontalAlignment','left', 'VerticalAlignment','top');
hLine2 = line('XData',tball(1), 'YData',ball2(1), 'Color','r', ...
'Marker','o', 'MarkerSize',6, 'LineWidth',2);
hTxt2 = text(tball(1), ball2(1), sprintf('(%.3f,%.3f)',tball(1),ball2(1)), ...
'Color',[0.2 0.2 0.2], 'FontSize',8, ...
'HorizontalAlignment','left', 'VerticalAlignment','top');
i=1;
while true
% update point & text for ball 1
set(hLine1, 'XData', tball(i), 'YData',ball1(i))
set(hTxt1, 'Position', [tball(i) ball1(i)], ...
'String', sprintf('%.3f,%3f)',[tball(i) ball1(i)]))
% ... and the same for ball 2
set(hLine2, 'XData', tball(i), 'YData',ball2(i))
set(hTxt2, 'Position', [tball(i) ball2(i)], ...
'String', sprintf('%.3f,%3f)',[tball(i) ball2(i)]))
drawnow % force refresh
%#pause(DELAY) % slow down animation
% To stop the balls at t=1
if tball(i) == 1
%i = 1; continue;
break;
end
i = rem(i+1,length(tball))+1; % circular increment
if ~ishandle(hLine1), break; end % in case you close the figure
end