Polilinee ed equazioni parametrichePolylines and Parametric Equations

Scaricare l'esempio scaricare l'esempioDownload Sample Download the sample

Consente di eseguire il rendering di tutte le righe che è possibile definire con equazioni parametriche SkiaSharpUse SkiaSharp to render any line that you can define with parametric equations

Nel SkiaSharp curve e tracciati sezione di questa Guida, si noterà i vari metodi che SKPath definisce per eseguire il rendering di determinati tipi di curve.In the SkiaSharp Curves and Paths section of this guide, you'll see the various methods that SKPath defines to render certain types of curves. Tuttavia, è talvolta necessario disegnare un tipo di curva che non è supportata direttamente da SKPath.However, it's sometimes necessary to draw a type of curve that isn't directly supported by SKPath. In tal caso, è possibile usare una polilinea (una raccolta di linee collegate) per disegnare qualsiasi curva che è possibile definire matematicamente.In such a case, you can use a polyline (a collection of connected lines) to draw any curve that you can mathematically define. Se si imposta le righe è piccolo e numerosi sufficiente, il risultato sarà simile una curva.If you make the lines small enough and numerous enough, the result will look like a curve. Questo spirale è effettivamente 3.600 piccole linee:This spiral is actually 3,600 little lines:

In genere è preferibile definire una curva in termini di una coppia di equazioni parametriche.Generally it's best to define a curve in terms of a pair of parametric equations. Queste sono le equazioni per X e Y coordinate che dipendono da una terza variabile, talvolta denominata t per volta.These are equations for X and Y coordinates that depend on a third variable, sometimes called t for time. Ad esempio, di definire un cerchio con raggio pari a 1 centrato al punto (0, 0) per le equazioni parametriche seguenti t compreso tra 0 e 1:For example, the following parametric equations define a circle with a radius of 1 centered at the point (0, 0) for t from 0 to 1:

x = cos(2πt)

y = sin(2πt)

Se si desidera un raggio di dimensioni superiori a 1, è possibile moltiplicare i seno e il coseno di valori per tale radius semplicemente e se è necessario passare al centro in un'altra posizione, aggiungere tali valori:If you want a radius larger than 1, you can simply multiply the sine and cosine values by that radius, and if you need to move the center to another location, add those values:

x = xCenter + radius·cos(2πt)

y = yCenter + radius·sin(2πt)

Per un'ellisse con parallelo di assi orizzontale e verticale, sono coinvolti due raggi:For an ellipse with the axes parallel to the horizontal and vertical, two radii are involved:

x = xCenter + xRadius·cos(2πt)

y = yCenter + yRadius·sin(2πt)

È quindi possibile inserire il codice equivalente di SkiaSharp in un ciclo che calcola i vari punti e aggiunge quelle per un percorso.You can then put the equivalent SkiaSharp code in a loop that calculates the various points and adds those to a path. Il codice di SkiaSharp seguente crea un SKPath oggetto per un'ellisse che riempie l'area di visualizzazione.The following SkiaSharp code creates an SKPath object for an ellipse that fills the display surface. Il ciclo scorre 360 gradi direttamente.The loop cycles through the 360 degrees directly. Il centro è metà della larghezza e altezza dell'area di visualizzazione, e quindi i due raggi:The center is half the width and height of the display surface, and so are the two radii:

SKPath path = new SKPath();

for (float angle = 0; angle < 360; angle += 1)
{
    double radians = Math.PI * angle / 180;
    float x = info.Width / 2 + (info.Width / 2) * (float)Math.Cos(radians);
    float y = info.Height / 2 + (info.Height / 2) * (float)Math.Sin(radians);

    if (angle == 0)
    {
        path.MoveTo(x, y);
    }
    else
    {
        path.LineTo(x, y);
    }
}
path.Close();

Di conseguenza un'ellisse definita da 360 piccole linee.This results in an ellipse defined by 360 little lines. Quando ne viene eseguito il rendering, viene visualizzato senza problemi.When it's rendered, it appears smooth.

Naturalmente, non è necessario creare una forma ellipse utilizzando una polilinea in quanto SKPath include un AddOval metodo che esegue tutto automaticamente.Of course, you don't need to create an ellipse using a polyline because SKPath includes an AddOval method that does it for you. Ma è possibile disegnare un oggetto visivo che non viene fornito da SKPath.But you might want to draw a visual object that is not provided by SKPath.

Il spirale Archimedean è incluso il codice simile al codice dell'ellisse ma con una differenza essenziale.The Archimedean Spiral page has code that similar to the ellipse code but with a crucial difference. Esegue un ciclo intorno a 360 gradi di cerchio 10 volte, in modo continuativo la regolazione del raggio:It loops around the 360 degrees of the circle 10 times, continuously adjusting the radius:

void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
{
    SKImageInfo info = args.Info;
    SKSurface surface = args.Surface;
    SKCanvas canvas = surface.Canvas;

    canvas.Clear();

    SKPoint center = new SKPoint(info.Width / 2, info.Height / 2);
    float radius = Math.Min(center.X, center.Y);

    using (SKPath path = new SKPath())
    {
        for (float angle = 0; angle < 3600; angle += 1)
        {
            float scaledRadius = radius * angle / 3600;
            double radians = Math.PI * angle / 180;
            float x = center.X + scaledRadius * (float)Math.Cos(radians);
            float y = center.Y + scaledRadius * (float)Math.Sin(radians);
            SKPoint point = new SKPoint(x, y);

            if (angle == 0)
            {
                path.MoveTo(point);
            }
            else
            {
                path.LineTo(point);
            }
        }

        SKPaint paint = new SKPaint
        {
            Style = SKPaintStyle.Stroke,
            Color = SKColors.Red,
            StrokeWidth = 5
        };

        canvas.DrawPath(path, paint);
    }
}

Il risultato è l'acronimo di un' spirale aritmetico perché l'offset tra ogni ciclo è costante:The result is also called an arithmetic spiral because the offset between each loop is constant:

Si noti che il SKPath viene creato in un using blocco.Notice that the SKPath is created in a using block. Ciò SKPath consuma più memoria per il SKPath gli oggetti nei programmi precedenti, che suggerisce che un using blocco risulta più appropriato per l'eliminazione delle risorse non gestite.This SKPath consumes more memory than the SKPath objects in the previous programs, which suggests that a using block is more appropriate to dispose any unmanaged resources.