Attribute VB_Name = "Module2"
'***************************************************************************
'* THE BOUNCING BALL *
'* ----------------------------------------------------------------------- *
'* Explanations: *
'* *
'* Let us consider an elastic ball dropped with a horizontal speed Vx from *
'* a height H. Here are the main equations to calculate the successive *
'* rebounds on the ground: *
'* *
'* Initializing: *
'* The first part of the trajectory is a parabolic section, upwards orien- *
'* ted. From the physical laws for a falling body, we know that: *
'* Vy = sqrt(2GH) and V0 = sqrt(Vx² + Vy²) with theta=arctan(Vx/Vy), *
'* where V0 is the speed at ground level and theta = pi - angle of V0 with *
'* the Ox axis. *
'* The ball moves with the horizontal speed Vx and the vertical speed -Vy *
'* during time t=Vy/G until it reaches the ground (G=gravity acceleration).*
'* Hence the horizontal distance run is x2=Vx*t=Vx*Vy/G. *
'* The equation of the parabolic section is: y = -(H/x2²)*x + H from x=0 *
'* to x=x2. *
'* *
'* Rebounds: *
'* For each rebound, the initial speed V0 is multiplied by a damping *
'* coefficient, called amort (<1), but the theta initial angle is kept the *
'* same. The previous x2 value becomes the next x1 value. The parabolic *
'* equation of the next trajectory section has the complete form: *
'* y = a*x² + b*x + c (1) *
'* P=2*Vx*Vy/G is the correct length for all the rebounds. Hence the next *
'* x2 = x1 + P. The parabola summit coordinates are the following: *
'* xs = (x1+x2)/2 and ys = (V0²*sin²(theta))/(2G) *
'* So to draw the trajectory section of a rebound, we have to know the *
'* equation of a parabola passing through the 3 points: (x1,0), (x2,0) and *
'* (xs,ys). This leads to the following linear system to solve of order 3: *
'* a*x1² + b*x1 + c = 0 *
'* a*xs² + b*xs + c = 0 *
'* a*x2² + b*x2 + c = 0 *
'* where the unknowns are a, b, c, the coefficients of the parabola (1). *
'* Using the Cramer's method, we calculate the main determinant Dp and the *
'* three sub-determinants, Da, Db, Dc. We find: *
'* Dp = x1²*(xs-x2) + x2²*(x1-xs) + xs²*(x2-x1) *
'* Da = ys*(x2-x1) Db = ys*(x1²-x2²) Dc = ys*x1*x2*(x2-x1) *
'* Hence: a = Da/Dp b = Db/Dp c = Dc/Dp *
'* Now we can draw the parabolic section of the next rebound in [x1,x2]. *
'* We continue the same process until the required number of rebounds is *
'* reached. *
'* ----------------------------------------------------------------------- *
'* Reference: *
'* From "Graphisme dans le plan et dans l'espace avec Turbo Pascal 4.0 de *
'* R. Dony - MASSON 1990 page 113" [BIBLI 12]. *
'* *
'* Visual Basic Release By J-P Moreau, Paris. *
'* (www.jpmoreau.fr) *
'***************************************************************************
'Program Rebounds
DefInt I-N
Const Height = 12
Const G = 9.81
Const xstep = 0.005
Dim Length As Single
Dim bounds As Integer
Public nrebounds As Integer
Public amort As Single
Dim x1 As Single
Dim x2 As Single
Public vx As Single
Dim vy As Single
Dim v0 As Single
Dim angle As Single
Dim a As Single
Dim b As Single
Dim c As Single
Public X(10), Y(10) 'dummy arguments for Polygon
Sub Data(vx, amort, nrebounds)
Form1.Cls
vx = Val(Form2.Text1):
amort = Val(Form2.Text2)
nrebounds = Val(Form2.Text3)
End Sub
Sub Init()
bounds = 0
x1 = 0
vy = Sqr(2 * G * Height)
angle = Atn(vy / vx)
v0 = Sqr(vx ^ 2 + vy ^ 2)
x2 = vx * vy / G
a = -Height / x2 ^ 2
b = 0
c = Height
End Sub
Sub DrawParabol(pt1, pt2)
Dim X As Single
Dim Y As Single
X = pt1
MoveXY X, 0#
While X < pt2
Y = a * X ^ 2 + b * X + c
LineXY X, Y
X = X + xstep
Wend
bounds = bounds + 1
End Sub
Sub CoeffParabol()
ys = (v0 * Sin(angle)) ^ 2 / (2 * G)
vy = Sqr(2 * G * ys)
Length = 2 * vx * vy / G
x2 = x1 + Length
xs = (x1 + x2) / 2
detprinc = x1 ^ 2 * (xs - x2) + x2 ^ 2 * (x1 - xs) + xs ^ 2 * (x2 - x1)
deta = ys * (x2 - x1)
a = deta / detprinc '1st coefficient of parabola
detb = ys * (x1 ^ 2 - x2 ^ 2)
b = detb / detprinc '2nd coefficient
detc = ys * x1 * x2 * (x2 - x1)
c = detc / detprinc '3rd coefficient
End Sub
Sub PrintData()
Dim s1 As String
Dim s2 As String
Dim s3 As String
Dim s4 As String
Dim ch As String
s1 = Str$(Height)
s2 = Str$(vx)
s3 = Str$(x2)
s4 = Str$(amort)
ch = "Height=" + s1 + " Speed=" + s2 + " Total length=" + s3 + " Damping=" + s4
Display 700, 60, ch
End Sub
Sub Exec_Rebounds()
'Data vx, amort, nrebounds
Init
Form1.Cls
Fenetre 0#, 20, 0#, Height
Cloture 400, MaxX - 300, 1800, MaxY - 400
Axes
Grid 1#, 1#
Graduate 2#, 2#
Bordure
DrawParabol x1, x2
x1 = x2
While bounds < nrebounds
v0 = v0 * amort
CoeffParabol
DrawParabol x1, x2
x1 = x2
Wend
PrintData
End Sub