SkiaSharp:ArcTo() 和 Close() 的意外结果

SkiaSharp: Unexpected results with ArcTo() and Close()

我正在 Android 11.

下的 SKCanvasView (Xamarin.Forms) 上使用 SkiaSharp 绘制一些直线和圆弧

我创建了 SKPath,它主要按预期呈现,但我发现 Close() 笔划总是在最后添加的 Arc 的 起点处结束] 而不是路径中的 第一个点 .

代码:

SKPoint pt = new SKPoint(600, 400); // Random location
float r = 100;                      // Arc radius
float d = 2 * r;                    // Side of arc rect
SKRect rc = new SKRect(pt.X, pt.Y, pt.X + d, pt.Y + d);
SKPath path = new SKPath();
path.MoveTo(rc.Right + 50, rc.Top);
path.LineTo(rc.Right, rc.MidY); // Line "S"
path.ArcTo(rc, 0, 90, true);    // Arc "A"
path.ArcTo(rc, 90, 90, true);   // Arc "B"
path.ArcTo(rc, 180, 90, true);  // Arc "C"
path.Close();                   // Line "K"

using (var skp = new SKPaint() { Style=SKPaintStyle.Stroke, IsAntialias=true, Color=SKColors.Red, StrokeWidth=6 }) {
    canv.DrawPath(path, skp);
}

这是结果(为说明添加了非红色项目)。
我不明白的是为什么 path.Close() 导致行“K”在 B/C 接合点而不是在“S”的起点处结束。我会 expected Close() 生成行“G”(当然是红色)而不是“K”。

任何见解将不胜感激!

Close 转到当前等高线 的起点

而不是

path.ArcTo(rc, 0, 90, true);

你想要

path.ArcTo(rc, 0, 90);

path.ArcTo(rc, 0, 90, false);

对所有这些 ArcTo 调用进行此更改。

原因:

  • 最后一个参数“true”告诉它开始一个新的 contour!

Three ways to Draw an Arc所述:

public void ArcTo (SKRect oval, Single startAngle, Single sweepAngle, Boolean forceMoveTo)

That last argument is called forceMoveTo, and it effectively causes a MoveTo call at the beginning of the arc. That begins a new contour.