2017-09-27 10 views
0

最近私はSkiaSharpを使用してロードブロックをヒットしました。私は古いコードをSystem.DrawingからSkiaSharpに移植しています。 GraphicsPathクラスには、曲線を一連の連結線分に変換する平坦化メソッドがありました。SkiaSharpはSystem.Drawingと同等のFlattenメソッドを持っていますか?

https://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.graphicspath.flatten(v=vs.110).aspx

私はSkiaSharpのための同等の方法を見つけるように見えることはできません。 SKPath Simplifyメソッドは、実際には少しぼやけているようです。私のテストでは、平坦化されたパスを生成するようには見えませんでした。いくつかの時点で

https://developer.xamarin.com/api/member/SkiaSharp.SKPath.Simplify()/

答えて

0

私はこの質問をした後、Xamarinは、これを行うためのドキュメントを追加しました。それは

https://developer.xamarin.com/guides/xamarin-forms/advanced/skiasharp/curves/information/

static class PathExtensions 
{ 
public static SKPath CloneWithTransform(this SKPath pathIn, Func<SKPoint, SKPoint> transform) 
{ 
    SKPath pathOut = new SKPath(); 

    using (SKPath.RawIterator iterator = pathIn.CreateRawIterator()) 
    { 
     SKPoint[] points = new SKPoint[4]; 
     SKPathVerb pathVerb = SKPathVerb.Move; 
     SKPoint firstPoint = new SKPoint(); 
     SKPoint lastPoint = new SKPoint(); 

     while ((pathVerb = iterator.Next(points)) != SKPathVerb.Done) 
     { 
      switch (pathVerb) 
      { 
       case SKPathVerb.Move: 
        pathOut.MoveTo(transform(points[0])); 
        firstPoint = lastPoint = points[0]; 
        break; 

       case SKPathVerb.Line: 
        SKPoint[] linePoints = Interpolate(points[0], points[1]); 

        foreach (SKPoint pt in linePoints) 
        { 
         pathOut.LineTo(transform(pt)); 
        } 

        lastPoint = points[1]; 
        break; 

       case SKPathVerb.Cubic: 
        SKPoint[] cubicPoints = FlattenCubic(points[0], points[1], points[2], points[3]); 

        foreach (SKPoint pt in cubicPoints) 
        { 
         pathOut.LineTo(transform(pt)); 
        } 

        lastPoint = points[3]; 
        break; 

       case SKPathVerb.Quad: 
        SKPoint[] quadPoints = FlattenQuadratic(points[0], points[1], points[2]); 

        foreach (SKPoint pt in quadPoints) 
        { 
         pathOut.LineTo(transform(pt)); 
        } 

        lastPoint = points[2]; 
        break; 

       case SKPathVerb.Conic: 
        SKPoint[] conicPoints = FlattenConic(points[0], points[1], points[2], iterator.ConicWeight()); 

        foreach (SKPoint pt in conicPoints) 
        { 
         pathOut.LineTo(transform(pt)); 
        } 

        lastPoint = points[2]; 
        break; 

       case SKPathVerb.Close: 
        SKPoint[] closePoints = Interpolate(lastPoint, firstPoint); 

        foreach (SKPoint pt in closePoints) 
        { 
         pathOut.LineTo(transform(pt)); 
        } 

        firstPoint = lastPoint = new SKPoint(0, 0); 
        pathOut.Close(); 
        break; 
      } 
     } 
    } 
    return pathOut; 
} 
... 
} 
ここに位置しています
関連する問題