SkiaSharp ConicTo 方法不绘制曲线
SkiaSharp ConicTo Method does not draw a curve
我是 SkiaSharp 的新手 canvas,想要实现如下所示的 canvas。
我尝试使用下面的代码来实现 canvas 但失败了。
SKSurface vSurface = args.Surface;
SKCanvas vCanvas = vSurface.Canvas;
vCanvas.Clear(SKColors.White);
var w = args.Info.Width;
var h = args.Info.Height;
var pathStroke3 = new SKPaint
{
IsAntialias = true,
Style = SKPaintStyle.StrokeAndFill,
Color = new SKColor(240, 0, 100, 250),
StrokeWidth = 5
};
var path3 = new SKPath { FillType = SKPathFillType.EvenOdd };
path3.MoveTo(0, h / 4);
path3.ConicTo(w / 3, h / 2, w, h, 1f);
path3.LineTo(0, h);
path3.Close();
vCanvas.DrawPath(path3, pathStroke3);
结果如下图所示。
您的二次曲线规范存在一些问题,应该予以修复。我试着在下面解释他们的理由。
path3.ConicTo(w / 3, h / 2, w, h, 1f);
从下图可以看出,你把二次曲线的控制点定义在一个很不寻常的地方。
w / 3
第一个参数是你的二次曲线控制点的x坐标。由于您希望曲线的顶部水平位于中间,因此您应该将宽度除以 2 而不是 3。
h / 2
第二个参数是曲线的垂直控制点。您已定义曲线从 y 轴上的 h/4 开始,因此曲线的顶点需要高于该点。我在示例中使用了 h/6,但您可以尝试使用 h/8
甚至 0
或其他绝对值。
w
第三个参数是曲线的水平终点,在你的实现中是正确的。
h
第四个参数应该和我们开始画曲线的地方一样。否则它不会是对称的,这就是为什么在你的情况下,终点在 h
(= 屏幕右下角)。让它成为 h/4
瞧,曲线现在在正确的点结束。
这将更接近您想要实现的目标:
path3.ConicTo(w / 2, h / 6, w, h/4, 1f);
即使曲线现在没问题,你仍然遇到路径无法关闭的问题。你首先必须在屏幕的右下角和左下角画一条线,这样整个区域就会被很好地填满。像这样:
path3.LineTo(w, h);
path3.LineTo(0, h);
现在您有一条可以填充的路径,看起来应该与您发布的示例图片相似。
编辑: 如果你想修改曲线的强度,你可以做几件事。例如,您可以将曲线从屏幕上的较低位置开始,它会立即变得更加弯曲:
path3.MoveTo(0, h / 3);
path3.ConicTo(w / 2, h / 6, w, h / 3, 1f);
在这里,我将 MoveTo 方法的 y 坐标编辑为在屏幕上较低的位置,以及 ConicTo 方法的结束 y 坐标相同。您甚至可以尝试对两者都使用 h/2
。
您可以做的另一件事是尝试使用 ConicTo 方法的最后一个参数。它定义了控制点的权重。值越高,您的曲线就越接近它,从而导致具有高值的非常尖锐的曲线。尝试使其更高或更低以改变曲线的强度。
最后,当前 h/6 的参数标记曲线的顶部。您可以尝试 h/10
或什至 0
之类的绝对坐标来改变曲线。
我是 SkiaSharp 的新手 canvas,想要实现如下所示的 canvas。
我尝试使用下面的代码来实现 canvas 但失败了。
SKSurface vSurface = args.Surface;
SKCanvas vCanvas = vSurface.Canvas;
vCanvas.Clear(SKColors.White);
var w = args.Info.Width;
var h = args.Info.Height;
var pathStroke3 = new SKPaint
{
IsAntialias = true,
Style = SKPaintStyle.StrokeAndFill,
Color = new SKColor(240, 0, 100, 250),
StrokeWidth = 5
};
var path3 = new SKPath { FillType = SKPathFillType.EvenOdd };
path3.MoveTo(0, h / 4);
path3.ConicTo(w / 3, h / 2, w, h, 1f);
path3.LineTo(0, h);
path3.Close();
vCanvas.DrawPath(path3, pathStroke3);
结果如下图所示。
您的二次曲线规范存在一些问题,应该予以修复。我试着在下面解释他们的理由。
path3.ConicTo(w / 3, h / 2, w, h, 1f);
从下图可以看出,你把二次曲线的控制点定义在一个很不寻常的地方。
w / 3
第一个参数是你的二次曲线控制点的x坐标。由于您希望曲线的顶部水平位于中间,因此您应该将宽度除以 2 而不是 3。
h / 2
第二个参数是曲线的垂直控制点。您已定义曲线从 y 轴上的 h/4 开始,因此曲线的顶点需要高于该点。我在示例中使用了 h/6,但您可以尝试使用h/8
甚至0
或其他绝对值。
w
第三个参数是曲线的水平终点,在你的实现中是正确的。h
第四个参数应该和我们开始画曲线的地方一样。否则它不会是对称的,这就是为什么在你的情况下,终点在h
(= 屏幕右下角)。让它成为h/4
瞧,曲线现在在正确的点结束。
这将更接近您想要实现的目标:
path3.ConicTo(w / 2, h / 6, w, h/4, 1f);
即使曲线现在没问题,你仍然遇到路径无法关闭的问题。你首先必须在屏幕的右下角和左下角画一条线,这样整个区域就会被很好地填满。像这样:
path3.LineTo(w, h);
path3.LineTo(0, h);
现在您有一条可以填充的路径,看起来应该与您发布的示例图片相似。
编辑: 如果你想修改曲线的强度,你可以做几件事。例如,您可以将曲线从屏幕上的较低位置开始,它会立即变得更加弯曲:
path3.MoveTo(0, h / 3);
path3.ConicTo(w / 2, h / 6, w, h / 3, 1f);
在这里,我将 MoveTo 方法的 y 坐标编辑为在屏幕上较低的位置,以及 ConicTo 方法的结束 y 坐标相同。您甚至可以尝试对两者都使用 h/2
。
您可以做的另一件事是尝试使用 ConicTo 方法的最后一个参数。它定义了控制点的权重。值越高,您的曲线就越接近它,从而导致具有高值的非常尖锐的曲线。尝试使其更高或更低以改变曲线的强度。
最后,当前 h/6 的参数标记曲线的顶部。您可以尝试 h/10
或什至 0
之类的绝对坐标来改变曲线。