Unsure how to correct behaviour in MATLAB code.

clear all;
close all;
clc;
count = 1;
%Declaring the balls initial conditions
R_Ball = 2;
initpos.x = 0;
initpos.y = 2.4;
initvel.x = 2;
initvel.y = 4;
gravity.x = 0;
gravity.y = 9.81;
restitution = 0.7;
GroundBall_friction = 0.2;
%Animation timestep
dt = 0.01;
%Executing the animation
pos.x = initpos.x; % initial position
pos.y = initpos.y; % initial position
vel.x = initvel.x; % initial velocity-x
vel.y = initvel.y; % initial velocity-y
t_arc = linspace(0,(2*vel.y)/gravity.y,4000);
for k = 1:4000
%Updating the ball's position
vel.x = vel.x;
vel.y = vel.y - gravity.y*t_arc(k)
pos.x = pos.x + vel.x*t_arc(k);
pos.y = pos.y + vel.y*t_arc(k) - (1/2)*gravity.y*(t_arc(k).^2);
if vel.y < 0 && pos.y < 0
vel.y = (restitution)*vel.y;
vel.y = -vel.y;
vel.x = vel.x + GroundBall_friction*(restitution - 1)*vel.x;
end
if vel.x < 0.
break;
end
clf;
%Drawing the frame
subplot(2,1,1)
hold on
line([0 30],[0 0]);
rectangle('position', [pos.x pos.y R_Ball R_Ball],'Curvature',[1 1],'FaceColor','r');
posxx(count) = pos.x;
posyy(count) = pos.y;
plot(posxx + 1/2*R_Ball, posyy + 1/2*R_Ball,'b');
axis([0 30 0 10]);
hold off
subplot(2,1,2)
hold on
velyy(count) = vel.y;
velxx(count) = vel.x;
plot(posxx,velxx);
plot(posxx,velyy);
count = count+1;
hold off
axis([0 30 -10 10]);
%Refresh rate
pause(dt)
end
How can I maintain my ball rolling on the X-axis and not pass through the Y-axis.

 Réponse acceptée

Add this to the end of the loop, just before the final "end"
if pos.y < 0
break;
end

7 commentaires

Jack Zimmerman
Jack Zimmerman le 11 Fév 2017
Modifié(e) : Jack Zimmerman le 11 Fév 2017
This doesnt work since the Ball doesn't complete the first bounce.
When it stops, the y value is
pos.y
ans =
-0.0392194572774256
So it's below the x axis since it has a negative y. What values of y do you want it to quit for?
Jack Zimmerman
Jack Zimmerman le 11 Fév 2017
Modifié(e) : Jack Zimmerman le 11 Fév 2017
I want the ball to move along the X-Axis so when the X-Velocity tends to 0 it stops on the X-axis at Y = 0. Preferably, I'd like the ball to never go below the X-axis at any point in the animation. I dont want it to quit at some Y position but complete the motion and stop without slowly falling.
What do you want to happen when it goes negative? If you don't want to break, maybe just clamp it at 0
if pos.y < 0
pos.y = 0;
end
Thanks that seems to work.
pos.y = max(0, pos.y)
does the same thing without needing an "if"; and it can be vectorized.
Exactly what I needed Thank you.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Programming dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by