| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'simulation.dart'; |
| |
| /// A simulation that applies limits to another simulation. |
| /// |
| /// The limits are only applied to the other simulation's outputs. For example, |
| /// if a maximum position was applied to a gravity simulation with the |
| /// particle's initial velocity being up, and the acceleration being down, and |
| /// the maximum position being between the initial position and the curve's |
| /// apogee, then the particle would return to its initial position in the same |
| /// amount of time as it would have if the maximum had not been applied; the |
| /// difference would just be that the position would be reported as pinned to |
| /// the maximum value for the times that it would otherwise have been reported |
| /// as higher. |
| class ClampedSimulation extends Simulation { |
| |
| /// Creates a [ClampedSimulation] that clamps the given simulation. |
| /// |
| /// The named arguments specify the ranges for the clamping behavior, as |
| /// applied to [x] and [dx]. |
| ClampedSimulation( |
| this.simulation, { |
| this.xMin = double.negativeInfinity, |
| this.xMax = double.infinity, |
| this.dxMin = double.negativeInfinity, |
| this.dxMax = double.infinity, |
| }) : assert(simulation != null), |
| assert(xMax >= xMin), |
| assert(dxMax >= dxMin); |
| |
| /// The simulation being clamped. Calls to [x], [dx], and [isDone] are |
| /// forwarded to the simulation. |
| final Simulation simulation; |
| |
| /// The minimum to apply to [x]. |
| final double xMin; |
| |
| /// The maximum to apply to [x]. |
| final double xMax; |
| |
| /// The minimum to apply to [dx]. |
| final double dxMin; |
| |
| /// The maximum to apply to [dx]. |
| final double dxMax; |
| |
| @override |
| double x(double time) => simulation.x(time).clamp(xMin, xMax) as double; |
| |
| @override |
| double dx(double time) => simulation.dx(time).clamp(dxMin, dxMax) as double; |
| |
| @override |
| bool isDone(double time) => simulation.isDone(time); |
| } |