appendArc method
void
appendArc(
- Path path,
- AnyContour contour,
- int cornerIndex,
- double dPrev,
- double dNext,
- double fromAngle,
- 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 + localN;
final centerY = dNext + localP;
for (var i = 0; i < segmentCount; i++) {
final t0 = i / segmentCount;
final t1 = (i + 1) / segmentCount;
final a0 = fromAngle + delta * t0;
final a1 = fromAngle + delta * 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);
}
}