blob: 12e79d586609605fe8e2c34382a9cd8682f7a42e [file] [log] [blame]
// 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.
const int _nbSamples = 100;
final List<double> _splinePosition = List<double>.filled(_nbSamples + 1, 0.0);
final List<double> _splineTime = List<double>.filled(_nbSamples + 1, 0.0);
const double _startTension = 0.5;
const double _endTension = 1.0;
const double _inflexion = 0.35;
// Generate the spline data used in ClampingScrollSimulation.
//
// This logic is a translation of the 2-dimensional logic found in
// https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/Scroller.java.
//
// The output of this program should be copied over to [_splinePosition] in
// flutter/packages/flutter/lib/src/widgets/scroll_simulation.dart.
void main() {
const double p1 = _startTension * _inflexion;
const double p2 = 1.0 - _endTension * (1.0 - _inflexion);
double xMin = 0.0;
double yMin = 0.0;
for (int i = 0; i < _nbSamples; i++) {
final double alpha = i / _nbSamples;
double xMax = 1.0;
double x, tx, coef;
while (true) {
x = xMin + (xMax - xMin) / 2.0;
coef = 3.0 * x * (1.0 - x);
tx = coef * ((1.0 - x) * p1 + x * p2) + x * x * x;
if ((tx - alpha).abs() < 1e-5) {
break;
}
if (tx > alpha) {
xMax = x;
} else {
xMin = x;
}
}
_splinePosition[i] = coef * ((1.0 - x) * _startTension + x) + x * x * x;
double yMax = 1.0;
double y, dy;
while (true) {
y = yMin + (yMax - yMin) / 2.0;
coef = 3.0 * y * (1.0 - y);
dy = coef * ((1.0 - y) * _startTension + y) + y * y * y;
if ((dy - alpha).abs() < 1e-5) {
break;
}
if (dy > alpha) {
yMax = y;
} else {
yMin = y;
}
}
_splineTime[i] = coef * ((1.0 - y) * p1 + y * p2) + y * y * y;
}
_splinePosition[_nbSamples] = _splineTime[_nbSamples] = 1.0;
print(_splinePosition);
}