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
!
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
.
我正在 Android 11.
我创建了 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
!
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
.