namespace Bounce;
///
/// Represents the bounce of the ball, calculating duration, height and position in time.
///
///
/// All calculations are derived from the equation for projectile motion: s = vt + 0.5at^2
///
internal class Bounce
{
private const float _acceleration = -32; // feet/s^2
private readonly float _velocity;
internal Bounce(float velocity)
{
_velocity = velocity;
}
public float Duration => -2 * _velocity / _acceleration;
public float MaxHeight =>
(float)Math.Round(-_velocity * _velocity / 2 / _acceleration, MidpointRounding.AwayFromZero);
public float Plot(Graph graph, float startTime)
{
var time = 0f;
for (; time <= Duration; time += graph.TimeIncrement)
{
var height = _velocity * time + _acceleration * time * time / 2;
graph.Plot(startTime + time, height);
}
return startTime + time;
}
public Bounce Next(float elasticity) => new Bounce(_velocity * elasticity);
}