appendArc method

  1. @override
void appendArc(
  1. Path path,
  2. AnyContour contour,
  3. int cornerIndex,
  4. double dPrev,
  5. double dNext,
  6. double fromAngle,
  7. double toAngle,
)
override

Implementation

@override
void appendArc(
  Path path,
  AnyContour contour,
  int cornerIndex,
  double dPrev,
  double dNext,
  double fromAngle,
  double toAngle,
) {
  final delta = toAngle - fromAngle;
  if (AnyUtils.nearZero(delta)) return;

  if (!canBuild(contour, cornerIndex)) {
    final (x, y) = contour.sharpCornerPoint(cornerIndex, dPrev, dNext);
    path.lineTo(x, y);
    return;
  }

  final fraction = delta.abs() / AnyUtils.quarterSweepPi0d5;
  final baseSegments = contour.cornerSegments[cornerIndex];
  final segmentCount = math.max(1, (baseSegments * fraction).ceil());

  final sign = turnSign(contour, cornerIndex);
  final localN = sign * n;
  final localP = sign * p;

  final centerX = dPrev;
  final centerY = dNext;
  final localFromAngle = _localAngleFromCommon(fromAngle);
  final localToAngle = _localAngleFromCommon(toAngle);
  final localDelta = localToAngle - localFromAngle;

  for (var i = 0; i < segmentCount; i++) {
    final t0 = i / segmentCount;
    final t1 = (i + 1) / segmentCount;
    final a0 = localFromAngle + localDelta * t0;
    final a1 = localFromAngle + localDelta * t1;
    final da = a1 - a0;
    final alpha = (4.0 / 3.0) * math.tan(da / 4.0);

    final cos0 = math.cos(a0);
    final sin0 = math.sin(a0);
    final cos1 = math.cos(a1);
    final sin1 = math.sin(a1);

    final p1x = centerX + localN * cos0 - alpha * localN * sin0;
    final p1y = centerY + localP * sin0 + alpha * localP * cos0;
    final p2x = centerX + localN * cos1 + alpha * localN * sin1;
    final p2y = centerY + localP * sin1 - alpha * localP * cos1;
    final p3x = centerX + localN * cos1;
    final p3y = centerY + localP * sin1;

    final (c1x, c1y) =
        contour.worldPointFromDistanceSpace(cornerIndex, p1x, p1y);
    final (c2x, c2y) =
        contour.worldPointFromDistanceSpace(cornerIndex, p2x, p2y);
    final (ex, ey) =
        contour.worldPointFromDistanceSpace(cornerIndex, p3x, p3y);

    path.cubicTo(c1x, c1y, c2x, c2y, ex, ey);
  }
}