gravity_simulation.dart 1.94 KB
Newer Older
1
// Copyright 2016 The Chromium Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5
import 'simulation.dart';
6

Ian Hickson's avatar
Ian Hickson committed
7 8 9 10
/// A simulation that applies a constant accelerating force.
///
/// Models a particle that follows Newton's second law of motion. The simulation
/// ends when the position reaches a defined point.
11
class GravitySimulation extends Simulation {
Ian Hickson's avatar
Ian Hickson committed
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
  /// Creates a [GravitySimulation] using the given arguments, which are,
  /// respectively: an acceleration that is to be applied continually over time;
  /// an initial position relative to an origin; the magnitude of the distance
  /// from that origin beyond which (in either direction) to consider the
  /// simulation to be "done", which must be positive; and an initial velocity.
  ///
  /// The initial position and maximum distance are measured in arbitrary length
  /// units L from an arbitrary origin. The units will match those used for [x].
  ///
  /// The time unit T used for the arguments to [x], [dx], and [isDone],
  /// combined with the aforementioned length unit, together determine the units
  /// that must be used for the velocity and acceleration arguments: L/T and
  /// L/T² respectively. The same units of velocity are used for the velocity
  /// obtained from [dx].
  GravitySimulation(
    double acceleration,
    double distance,
    double endDistance,
    double velocity
  ) : _a = acceleration,
      _x = distance,
      _v = velocity,
      _end = endDistance {
    assert(acceleration != null);
    assert(distance != null);
    assert(velocity != null);
    assert(endDistance != null);
    assert(endDistance >= 0);
  }

42 43 44 45 46
  final double _x;
  final double _v;
  final double _a;
  final double _end;

47
  @override
48 49
  double x(double time) => _x + _v * time + 0.5 * _a * time * time;

50
  @override
51 52 53 54 55
  double dx(double time) => _v + time * _a;

  @override
  bool isDone(double time) => x(time).abs() >= _end;
}