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.

 채택된 답변

Image Analyst
Image Analyst 2017년 2월 11일

0 개 추천

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

댓글 수: 7

Jack Zimmerman
Jack Zimmerman 2017년 2월 11일
편집: Jack Zimmerman 2017년 2월 11일
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 2017년 2월 11일
편집: Jack Zimmerman 2017년 2월 11일
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.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Get Started with Optimization Toolbox에 대해 자세히 알아보기

질문:

2017년 2월 11일

댓글:

2017년 2월 12일

Community Treasure Hunt

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

Start Hunting!

Translated by