setArcDash function

void setArcDash(
  1. Canvas canvas,
  2. double centerX,
  3. double centerY,
  4. double radiusX,
  5. double radiusY,
  6. Paint paint,
  7. double beginAngle,
  8. double endAngle,
  9. List<double> segments, [
  10. bool useCenter = false,
])

Implementation

void setArcDash(
    Canvas canvas,
    double centerX,
    double centerY,
    double radiusX,
    double radiusY,
    Paint paint,
    double beginAngle,
    double endAngle,
    List<double> segments,
    [bool useCenter = false]) {
  /*
      when array has even length
      [5, 15] => [0, 15]
      when array has odd length
      [5, 15, 16] => [5, 15, 16, 5, 15, 16]
     */
  final _segments =
      segments.length % 2 == 0 ? segments : [...segments, ...segments];
  final generator = _GenOnDemand(_segments);

  final trueCenterX = centerX - radiusX / 2;
  final trueCenterY = centerY - radiusY / 2;
  double _curAngle = beginAngle;
  double _lastAngle = beginAngle;
  double _sweepAmount = 0;
  int i = 0;

  do {
    // Draw arc line every other iteration;
    if (i % 2 != 0) {
      double cur = _curAngle * (pi / 180);
      double sweep = _sweepAmount * (pi / 180);
      canvas.drawArc(Offset(trueCenterX, trueCenterY) & Size(radiusX, radiusY),
          cur, sweep, useCenter, paint);
    }

    i++;
    _lastAngle = _curAngle;
    _curAngle += generator.next();
    _sweepAmount = (_curAngle - _lastAngle.abs());
  } while (_curAngle + _sweepAmount < endAngle);
}