Skip to content

Commit

Permalink
Add CatmullRomCurve and CatmullRomSpline (#47547)
Browse files Browse the repository at this point in the history
This adds CatmullRomCurve animation curve, and a CatmullRomSpline, which is what it uses to do interpolation.

This allows us to create animation curves which can smoothly interpolate the values given to the curve.

Since I've introduced a 2D spline curve, I also created a Curve2D base class for such parametric curves.
  • Loading branch information
gspencergoog committed Jan 8, 2020
1 parent 505af78 commit 8b13201
Show file tree
Hide file tree
Showing 4 changed files with 1,200 additions and 20 deletions.
60 changes: 60 additions & 0 deletions dev/benchmarks/microbenchmarks/lib/geometry/curves_bench.dart
@@ -0,0 +1,60 @@
// 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 'dart:ui';
import 'package:flutter/animation.dart';

import '../common.dart';

const int _kNumIters = 10000;

void _testCurve(Curve curve, {String name, String description, BenchmarkResultPrinter printer}) {
final Stopwatch watch = Stopwatch();
print('$description benchmark...');
watch.start();
for (int i = 0; i < _kNumIters; i += 1) {
final double t = i / _kNumIters.toDouble();
curve.transform(t);
}
watch.stop();

printer.addResult(
description: description,
value: watch.elapsedMicroseconds / _kNumIters,
unit: 'µs per iteration',
name: name,
);
}

void main() {
assert(false, "Don't run benchmarks in checked mode! Use 'flutter run --release'.");
final BenchmarkResultPrinter printer = BenchmarkResultPrinter();
_testCurve(
const Cubic(0.0, 0.25, 0.5, 1.0),
name: 'cubic_animation_transform_iteration',
description: 'Cubic animation transform',
printer: printer,
);

final CatmullRomCurve catmullRomCurve = CatmullRomCurve(const <Offset>[
Offset(0.09, 0.99),
Offset(0.21, 0.01),
Offset(0.28, 0.99),
Offset(0.38, -0.00),
Offset(0.43, 0.99),
Offset(0.54, -0.01),
Offset(0.59, 0.98),
Offset(0.70, 0.04),
Offset(0.78, 0.98),
Offset(0.88, -0.00),
], tension: 0.00);
_testCurve(
catmullRomCurve,
name: 'catmullrom_transform_iteration',
description: 'CatmullRomCurve animation transform',
printer: printer,
);

printer.printToStdout();
}
Expand Up @@ -14,8 +14,8 @@ void main() {
print('RRect contains benchmark...');
watch.start();
for (int i = 0; i < _kNumIters; i += 1) {
final RRect outter = RRect.fromLTRBR(10, 10, 20, 20, const Radius.circular(2.0));
outter.contains(const Offset(15, 15));
final RRect outer = RRect.fromLTRBR(10, 10, 20, 20, const Radius.circular(2.0));
outer.contains(const Offset(15, 15));
}
watch.stop();

Expand Down

0 comments on commit 8b13201

Please sign in to comment.