Azzera filtri
Azzera filtri

Bouncing Ball Animation Getframe

7 visualizzazioni (ultimi 30 giorni)
I don't understand what I am doing wrong. I have to create an animation of a ball bouncing. But I have to repeat a for loop for each bounce. It also plays the animation twice. Is there a simpler way of doing this? Also, is there a way to speed up the code so that the animation does not play so slowly? I was thinking that I could write a function that would call it to repeat the animation but I am not sure.
%%Animation
clc, clf, clear
g = 9.81;
theta0 = 45*pi/180;
v0=5;
t(1) = 0; x = 0; y = 0;
plot(x,y, 'o', 'MarkerFaceColor','b', 'MarkerSize', 8)
axis([0 8 0 .8]);
dt = 1/128;
M(1) = getframe
for j = 2:100
t(j) = t(j - 1) + dt;
x = v0*cos(theta0)*t(j);
y = v0*sin(theta0) * t(j) - 0.5*g*t(j)^2;
plot(x,y, 'o', 'MarkerFaceColor', 'b','markerSize', 8);
axis([0 8 0 .8]);
M(j)= getframe;
end
M(2) = getframe
t(100) = 0;
v0 = v0*.8;
for j = 101:198
t(j) = t(j - 1) + dt;
x = v0*cos(theta0)*t(j)+2.5;
y = v0*sin(theta0) * t(j) - 0.5*g*t(j)^2;
plot(x,y, 'o', 'MarkerFaceColor', 'b','markerSize', 8);
axis([0 8 0 .8]);
M(j)= getframe;
end
M(3) = getframe
v0 = v0*.8;
t(198) = 0;
for j = 199:300
t(j) = t(j - 1) + dt;
x = v0*cos(theta0)*t(j)+4;
y = v0*sin(theta0) * t(j) - 0.5*g*t(j)^2;
plot(x,y, 'o', 'MarkerFaceColor', 'b','markerSize', 8);
axis([0 8 0 .8]);
M(j)= getframe;
end
M(4) = getframe
v0 = v0*.8;
t(300) = 0;
for j = 199:300
t(j) = t(j - 1) + dt;
x = v0*cos(theta0)*t(j)+4;
y = v0*sin(theta0) * t(j) - 0.5*g*t(j)^2;
plot(x,y, 'o', 'MarkerFaceColor', 'b','markerSize', 8);
axis([0 8 0 .8]);
M(j)= getframe;
end
movie(M, 1, 1000)

Risposta accettata

Alan Stevens
Alan Stevens il 1 Nov 2020
Modificato: Alan Stevens il 1 Nov 2020
Like this?
g = 9.81;
theta0 = 45*pi/180;
v0=5;
dt = 1/128;
ntimes = 400;
tend = ntimes*dt;
t = linspace(0,tend,ntimes);
vx = v0*cos(theta0);
vy = v0*sin(theta0);
x = 0; y = 0;
xmax = vx*tend;
plot(x,y, 'o', 'MarkerFaceColor','b', 'MarkerSize', 8)
axis([0 xmax 0 .8]);
M(1) = getframe;
treset = 0;
for i = 1:ntimes
x = vx*t(i);
tm = t(i) - treset;
y = vy * tm - 0.5*g*tm^2;
plot(x,y, 'o', 'MarkerFaceColor', 'b','markerSize', 8);
axis([0 xmax 0 .8]);
M(i)= getframe;
if y<0
y = 0;
vy = 0.8*vy;
treset = t(i);
end
end
close
pause(1)
movie(M, 1, 50)
  4 Commenti
Gabrielle Bartolome
Gabrielle Bartolome il 1 Nov 2020
What does tend represent? Is that when y = 0? or when it hits the ground?
Alan Stevens
Alan Stevens il 1 Nov 2020
It's just the total time. Just change the number of steps to change the total time.

Accedi per commentare.

Più risposte (1)

Image Analyst
Image Analyst il 1 Nov 2020
See my attached demo for creating an animation from figures. You can set the frame rate for the VideoWriter.

Categorie

Scopri di più su Animation in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by