How to make a ball bounce in a parabola?

If you have questions about any aspect of QBasic programming, or would like to help fellow programmers solve their problems, check out this board!

Moderators: Pete, Mods

Post Reply
jasonkidd007
Newbie
Posts: 8
Joined: Thu May 11, 2006 7:34 pm

How to make a ball bounce in a parabola?

Post by jasonkidd007 » Sat May 27, 2006 7:00 am

How to make a ball bounce in a parabola after the ball reaches the bottom of the screen?

I wanted it to reach the bottom, bounce back up but not as high as the previous one and then reach the bottom of the screen and bounce back up in a parabola but this time lower than the previous height until the ball reaches the right end of the screen and stop and prints itself without dissapearing.

here is my coding but it only bounces up and down:

Code: Select all

REM This program makes a ball bounce less on each successive bounce
REM until it bounces not longer

REM Variable Dictionary
REM y.......y coordinate
rem x.......x coordinate
REM bounce..bounces to a certain height
REM count...counts to a certain range

SCREEN 12

CLS

bounce = 20
y = 30
x = 21

DO

  y = y + 1
  CIRCLE (x, y), 20, 14
  PAINT (x, y), 14, 14
  FOR count = 1 TO 5000
  NEXT count
  CIRCLE (x, y), 21, 0
  CIRCLE (x, y), 0, 0
  IF y = 460 THEN
   
    DO
      y = y - 1
      CIRCLE (x, y), 20, 14
      PAINT (x, y), 14, 14
      FOR count = 1 TO 5000
      NEXT count
      CIRCLE (x, y), 21, 0
      PAINT (x, y), 14, 0
      IF bounce = y THEN EXIT DO
    LOOP
    bounce = bounce + 60
    IF bounce > 460 THEN EXIT DO
  END IF

LOOP

END





User avatar
Theophage
Coder
Posts: 44
Joined: Sun May 07, 2006 7:32 pm
Location: Tucson, AZ
Contact:

Post by Theophage » Sat May 27, 2006 6:11 pm

Sorry I never got back to you, Jason :oops:
Daniel "Theophage" Clark
theophage (at) geocities (dot) com

"God used to be my co-pilot, but our plane crashed in the mountains and I had to eat Him..."

User avatar
Quibbler
Coder
Posts: 16
Joined: Tue Jan 24, 2006 7:29 am
Location: Trinidad and Tobago

Post by Quibbler » Tue May 30, 2006 12:51 pm

Maybe this will give you some ideas

Code: Select all

SCREEN 12
WHILE bounce < 1000
IF x >= 620 THEN ix = -.1: ic = 0: ib = 1
IF x <= 0 THEN ix = .1: ic = 0: ib = 1
x = x + ix
IF y >= 480 THEN iy = -1: ic = ib
IF y <= ic THEN
iy = 1
ib = ib + 40
bounce = bounce + 1
END IF
y = y + iy * (y - ic + 5) * .01
CIRCLE (xo, yo), 20, 0
CIRCLE (x, y), 20, 14
xo = x: yo = y
FOR i = 1 TO 1000: NEXT i
WEND

User avatar
AlienQB
Newbie
Posts: 9
Joined: Mon May 08, 2006 11:39 am
Location: Sweden
Contact:

Post by AlienQB » Tue May 30, 2006 1:19 pm

I think I can help you out a bit here. :)

You need to let go of the (x,y) thinking. A ball is not simply described by where it is, but where it's going and how fast that's changing. It's these relationships that causes the parabola to appear. This can be accomplished in 3 steps as shown below.

Step 1
What you need to do is to implement position, velocity and acceleration as individual coordinates (that's vectors in mathematics). To do this we're going to need some stuff as usual; a Vector TYPE. This will do:

Code: Select all

TYPE Vector
	x AS DOUBLE
	y AS DOUBLE
END TYPE
Step 2
Now when that's in place, we can start writing our program. We need:

[*]Constants like what the gravity is, how large the ball is and how much of the velocity that will be preserved after impact with the ground.
[*]Declare the ball's position, velocity and acceleration.

Code: Select all

CONST G = 9.82          'Gravity on earth 9.82 m/s^2
CONST RA = .25          'Fairly large ball with a diameter of 1 meter
CONST S = 20            '1 meter equals 100 pixels on the screen as we draw
CONST T = .002          'Step time 2 ms each loop
CONST E = .8            '80% bounce efficiency

DIM r AS Vector         'Location
DIM v AS Vector         'Velocity
DIM a AS Vector         'Acceleration

r.x = 0                 'Position the ball in the center,
r.y = 20                'ten meters above the ground.

v.x = .1                'Let the ball have a small initial
v.y = 0                 'velocity to the right

a.x = 0                 'No initial acceleration
a.y = 0
Notice here that we're measuring in meters. This is generally a good thing to do, and we can scale the graphics later on as we draw them.

Step 3
We are now ready to write the general bounce method, so let's jump right into it:

Code: Select all

SCREEN 12

DO
   'Gravity causes the ball to get acceleration
   a.y = -G

   'Acceleration causes the ball to get a new velocity
   v.x = v.x + T * a.x
   v.y = v.y + T * a.y

   'A new velocity causes the ball to move
   r.x = r.x + T * v.x
   r.y = r.y + T * v.y

   'Check for bounce
   IF r.y < 0 THEN
       
      r.y = 0           'The ball can't go through the ground
       
      v.y = -v.y * E    'Reverse the velocity of the y-coordinate
			'and lose some speed to bounce efficiency

   END IF

   'Draw the ball and scale, but leave the old one in place,
   'so one can view the parabola trail left by the ball.
   CIRCLE (S + 320 * r.x, 400 - S * r.y), RA * S, 14

LOOP UNTIL INKEY$ <> ""
That's pretty much all there's to it. A possible addition is the implementation of coefficients of restitution, but that's a bit over our heads right now. Hope this helps out not only with the bouncing ball but delivers some insight into organizing code for applications.

Now this program runs beautifully and looks like this:

Image
Last edited by AlienQB on Wed May 31, 2006 3:53 am, edited 2 times in total.
The one and only.
AKA xerent

User avatar
Quibbler
Coder
Posts: 16
Joined: Tue Jan 24, 2006 7:29 am
Location: Trinidad and Tobago

Post by Quibbler » Tue May 30, 2006 1:31 pm

Don't you think you're over-complicating this.
To get a reasonable bouncing ball just keep x-velocity constant and cause the y-velocity to decrease to zero going up and increase going down.

User avatar
AlienQB
Newbie
Posts: 9
Joined: Mon May 08, 2006 11:39 am
Location: Sweden
Contact:

Post by AlienQB » Wed May 31, 2006 3:40 am

Isn't that exactly what my program does? :P

Besides, if one writes apps systematically, they're easily expandable to include not only bouncing balls but a whole bunch of dynamics stuff.
The one and only.
AKA xerent

User avatar
Theophage
Coder
Posts: 44
Joined: Sun May 07, 2006 7:32 pm
Location: Tucson, AZ
Contact:

Post by Theophage » Wed May 31, 2006 3:29 pm

Does anyone else think "MMMmmmmm McDonalds," when they see the screen shot above?
Daniel "Theophage" Clark
theophage (at) geocities (dot) com

"God used to be my co-pilot, but our plane crashed in the mountains and I had to eat Him..."

Post Reply