smoothPath function
Builds a smooth cubic-bezier Path that passes through every vertex in
points using a Catmull-Rom spline (tension 0.5). Falls back to straight
segments below three points, where a curve is undefined.
Implementation
Path smoothPath(List<Offset> points) {
final path = Path();
if (points.isEmpty) return path;
path.moveTo(points[0].dx, points[0].dy);
if (points.length < 3) {
for (var i = 1; i < points.length; i++) {
path.lineTo(points[i].dx, points[i].dy);
}
return path;
}
for (var i = 0; i < points.length - 1; i++) {
final p0 = points[i - 1 < 0 ? i : i - 1];
final p1 = points[i];
final p2 = points[i + 1];
final p3 = points[i + 2 > points.length - 1 ? i + 1 : i + 2];
final c1 = Offset(p1.dx + (p2.dx - p0.dx) / 6, p1.dy + (p2.dy - p0.dy) / 6);
final c2 = Offset(p2.dx - (p3.dx - p1.dx) / 6, p2.dy - (p3.dy - p1.dy) / 6);
path.cubicTo(c1.dx, c1.dy, c2.dx, c2.dy, p2.dx, p2.dy);
}
return path;
}