Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1358)

Unified Diff: sky/framework/animation/mechanics.dart

Issue 1132063007: Rationalize Dart mojo and sky package structure (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/framework/animation/generators.dart ('k') | sky/framework/animation/scroll_behavior.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/framework/animation/mechanics.dart
diff --git a/sky/framework/animation/mechanics.dart b/sky/framework/animation/mechanics.dart
deleted file mode 100644
index 6a6cc4cad46f7f8c744afe9cd8ac06757e5ba1a8..0000000000000000000000000000000000000000
--- a/sky/framework/animation/mechanics.dart
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2015 The Chromium 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 'dart:math' as math;
-
-const double kGravity = -0.980; // m^s-2
-
-abstract class System {
- void update(double deltaT);
-}
-
-class Particle extends System {
- final double mass;
- double velocity;
- double position;
-
- Particle({this.mass: 1.0, this.velocity: 0.0, this.position: 0.0});
-
- void applyImpulse(double impulse) {
- velocity += impulse / mass;
- }
-
- void update(double deltaT) {
- position += velocity * deltaT;
- }
-
- void setVelocityFromEnergy({double energy, double direction}) {
- assert(direction == -1.0 || direction == 1.0);
- assert(energy >= 0.0);
- velocity = math.sqrt(2.0 * energy / mass) * direction;
- }
-}
-
-abstract class Box {
- void confine(Particle p);
-}
-
-class ClosedBox extends Box {
- final double min; // m
- final double max; // m
-
- ClosedBox({this.min, this.max}) {
- assert(min == null || max == null || min <= max);
- }
-
- void confine(Particle p) {
- if (min != null) {
- p.position = math.max(min, p.position);
- if (p.position == min)
- p.velocity = math.max(0.0, p.velocity);
- }
- if (max != null) {
- p.position = math.min(max, p.position);
- if (p.position == max)
- p.velocity = math.min(0.0, p.velocity);
- }
- }
-}
-
-class GeofenceBox extends Box {
- final double min; // m
- final double max; // m
-
- final Function onEscape;
-
- GeofenceBox({this.min, this.max, this.onEscape}) {
- assert(min == null || max == null || min <= max);
- assert(onEscape != null);
- }
-
- void confine(Particle p) {
- if (((min != null) && (p.position < min)) ||
- ((max != null) && (p.position > max)))
- onEscape();
- }
-}
-
-class ParticleInBox extends System {
- final Particle particle;
- final Box box;
-
- ParticleInBox({this.particle, this.box}) {
- box.confine(particle);
- }
-
- void update(double deltaT) {
- particle.update(deltaT);
- box.confine(particle);
- }
-}
-
-class ParticleInBoxWithFriction extends ParticleInBox {
- final double friction; // unitless
- final double _sign;
-
- final Function onStop;
-
- ParticleInBoxWithFriction({Particle particle, Box box, this.friction, this.onStop})
- : super(particle: particle, box: box),
- _sign = particle.velocity.sign;
-
- void update(double deltaT) {
- double force = -_sign * friction * particle.mass * -kGravity;
- particle.applyImpulse(force * deltaT);
- if (particle.velocity.sign != _sign) {
- particle.velocity = 0.0;
- }
- super.update(deltaT);
- if ((particle.velocity == 0.0) && (onStop != null))
- onStop();
- }
-}
-
-class Spring {
- final double k;
- double displacement;
-
- Spring(this.k, {this.displacement: 0.0});
-
- double get force => -k * displacement;
-}
-
-class ParticleAndSpringInBox extends System {
- final Particle particle;
- final Spring spring;
- final Box box;
-
- ParticleAndSpringInBox({this.particle, this.spring, this.box}) {
- _applyInvariants();
- }
-
- void update(double deltaT) {
- particle.applyImpulse(spring.force * deltaT);
- particle.update(deltaT);
- _applyInvariants();
- }
-
- void _applyInvariants() {
- box.confine(particle);
- spring.displacement = particle.position;
- }
-}
-
-class ParticleClimbingRamp extends System {
-
- // This is technically the same as ParticleInBoxWithFriction. The
- // difference is in how the system is set up. Here, we configure the
- // system so as to stop by a certain distance after having been
- // given an initial impulse from rest, whereas
- // ParticleInBoxWithFriction is set up to stop with a consistent
- // decelerating force assuming an initial velocity. The angle theta
- // (0 < theta < π/2) is used to configure how much energy the
- // particle is to start with; lower angles result in a gentler kick
- // while higher angles result in a faster conclusion.
-
- final Particle particle;
- final Box box;
- final double theta;
- final double _sinTheta;
-
- ParticleClimbingRamp({
- this.particle,
- this.box,
- double theta, // in radians
- double targetPosition}) : this.theta = theta, this._sinTheta = math.sin(theta) {
- assert(theta > 0.0);
- assert(theta < math.PI / 2.0);
- double deltaPosition = targetPosition - particle.position;
- double tanTheta = math.tan(theta);
- // We need to give the particle exactly as much (kinetic) energy
- // as it needs to get to the top of the slope and stop with
- // energy=0. This is exactly the same amount of energy as the
- // potential energy at the top of the slope, which is g*h*m.
- // If the slope's horizontal component is delta P long, then
- // the height is delta P times tan theta.
- particle.setVelocityFromEnergy(
- energy: (kGravity * (deltaPosition * tanTheta) * particle.mass).abs(),
- direction: deltaPosition > 0.0 ? 1.0 : -1.0
- );
- box.confine(particle);
- }
-
- void update(double deltaT) {
- particle.update(deltaT);
- // Note that we apply the impulse from gravity after updating the particle's
- // position so that we overestimate the distance traveled by the particle.
- // That ensures that we actually hit the edge of the box and don't wind up
- // reversing course.
- particle.applyImpulse(particle.mass * kGravity * _sinTheta * deltaT);
- box.confine(particle);
- }
-}
-
-class Multisystem extends System {
- final Particle particle;
-
- System _currentSystem;
-
- Multisystem({ this.particle, System system }) {
- assert(system != null);
- _currentSystem = system;
- }
-
- void update(double deltaT) {
- _currentSystem.update(deltaT);
- }
-
- void transitionToSystem(System system) {
- assert(system != null);
- _currentSystem = system;
- }
-}
« no previous file with comments | « sky/framework/animation/generators.dart ('k') | sky/framework/animation/scroll_behavior.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698