in packages/diagrams/lib/src/curve.dart [95:195]
void paint(Canvas canvas, Size size) {
assert(size != Size.zero);
final double unit = _zero.width / 4.0;
final double leftMargin = unit * 6.0;
final double rightMargin = 3.0 * unit + _t.width;
final double bottomMargin = unit / 2.0;
final double verticalHeadroom = size.height * 0.2;
final double markerWidth = unit * 3.0;
final Rect area = Rect.fromLTRB(
leftMargin,
verticalHeadroom,
size.width - rightMargin,
size.height - verticalHeadroom,
);
final Path axes = Path()
..moveTo(area.left - unit, area.top) // vertical axis 1.0 tick
..lineTo(area.left, area.top) // vertical axis
..lineTo(area.left, area.bottom) // origin
..lineTo(area.right, area.bottom) // horizontal axis
..lineTo(area.right, area.bottom + unit); // horizontal axis 1.0 tick
canvas.drawPath(axes, _axisPaint);
final Path dashLine = Path();
final double delta = 8.0 / area.width;
assert(delta > 0.0);
for (double t = 0.0; t < 1.0; t += delta) {
final Offset point1 = FractionalOffset(t, 0.0).withinRect(area);
final Offset point2 =
FractionalOffset(t + delta / 2.0, 0.0).withinRect(area);
dashLine
..moveTo(point1.dx, point1.dy)
..lineTo(point2.dx, point2.dy);
}
canvas.drawPath(dashLine, _dashPaint);
_one.paint(
canvas,
Offset(area.left - leftMargin + (_zero.width - _one.width),
area.top - _one.height / 2.0),
);
_one.paint(
canvas,
Offset(
area.right - _one.width / 2.0, area.bottom + bottomMargin + unit));
_x.paint(canvas, Offset(area.left + _x.width, area.top));
_t.paint(canvas,
Offset(area.right - _t.width, area.bottom - _t.height - unit / 2.0));
_caption.paint(
canvas,
Offset(
leftMargin + (area.width - _caption.width) / 2.0,
size.height - (verticalHeadroom + _caption.height) / 2.0,
),
);
final Offset activePoint = FractionalOffset(
position,
1.0 - curve.transform(position),
).withinRect(area);
// Skip drawing the tracing line if we're at 0.0 because we want the
// initial paused state to not include the position indicators. They just
// add clutter before the animation is started.
if (position != 0.0) {
final Path positionLine = Path()
..moveTo(activePoint.dx, area.bottom)
..lineTo(activePoint.dx, area.top); // vertical pointer from base
canvas.drawPath(positionLine, _positionPaint);
final Path valueMarker = Path()
..moveTo(area.right + unit, activePoint.dy)
..lineTo(area.right + unit * 2.0, activePoint.dy - unit)
..lineTo(area.right + unit * 2.0 + markerWidth, activePoint.dy - unit)
..lineTo(area.right + unit * 2.0 + markerWidth, activePoint.dy + unit)
..lineTo(area.right + unit * 2.0, activePoint.dy + unit)
..lineTo(area.right + unit, activePoint.dy);
canvas.drawPath(valueMarker, _valueMarkerPaint);
}
final Path graph = Path()..moveTo(area.left, area.bottom);
final double stepSize = 1.0 / (area.width * ui.window.devicePixelRatio);
for (double t = 0.0;
t <= (position == 0.0 ? 1.0 : position);
t += stepSize) {
final Offset point =
FractionalOffset(t, 1.0 - curve.transform(t)).withinRect(area);
graph.lineTo(point.dx, point.dy);
}
canvas.drawPath(graph, _graphPaint);
if (position != 0.0) {
final Offset startPoint = FractionalOffset(
position,
1.0 - curve.transform(position),
).withinRect(area);
final Path graphProgress = Path()..moveTo(startPoint.dx, startPoint.dy);
for (double t = position; t <= 1.0; t += stepSize) {
final Offset point =
FractionalOffset(t, 1.0 - curve.transform(t)).withinRect(area);
graphProgress.lineTo(point.dx, point.dy);
}
canvas.drawPath(graphProgress, _graphProgressPaint);
canvas.drawCircle(
Offset(activePoint.dx, activePoint.dy), 4.0, _positionCirclePaint);
}
}