Aracılığıyla paylaş


Çoklu Çizgiler ve Parametreli Denklemler

Parametrik denklemlerle tanımlayabildiğiniz herhangi bir satırı işlemek için SkiaSharp kullanın

Bu kılavuzun SkiaSharp Eğrileri ve Yolları bölümünde, belirli eğri türlerini işlemeyi tanımlayan SKPath çeşitli yöntemleri göreceksiniz. Ancak, bazen tarafından SKPathdoğrudan desteklenmeyen bir eğri türü çizmek gerekir. Böyle bir durumda, matematiksel olarak tanımlayabildiğiniz herhangi bir eğriyi çizmek için çok çizgili (bağlı çizgilerden oluşan bir koleksiyon) kullanabilirsiniz. Çizgileri yeterince küçük ve çok sayıda yaparsanız, sonuç bir eğri gibi görünür. Bu spiral aslında 3.600 küçük çizgidir:

Sarmal

Genellikle bir çift parametrik denklem açısından eğri tanımlamak en iyisidir. Bunlar, bazen zaman için çağrılan t üçüncü bir değişkene bağlı olan X ve Y koordinatları denklemleridir. Örneğin, aşağıdaki parametrik denklemler, 0 ile 1 arasında t için 0, 0 noktasında ortalanmış 1 yarıçapı olan bir daire tanımlar:

x = cos(2πt)

y = sin(2πt)

1'den büyük bir yarıçap istiyorsanız, sinüs ve kosinüs değerlerini bu yarıçapla çarpmanız yeterlidir ve merkezi başka bir konuma taşımanız gerekiyorsa şu değerleri ekleyin:

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

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

Eksenleri yatay ve dikeye paralel olan üç nokta için iki yarıçap söz konusu olur:

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

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

Daha sonra eşdeğer SkiaSharp kodunu çeşitli noktaları hesaplayan ve bunları bir yola ekleyen bir döngüye yerleştirebilirsiniz. Aşağıdaki SkiaSharp kodu, ekran yüzeyini dolduran üç nokta için bir SKPath nesne oluşturur. Döngü, doğrudan 360 derece arasında döngü oluşturur. Orta, ekran yüzeyinin genişliğinin ve yüksekliğinin yarısıdır ve iki yarıçap da öyledir:

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();

Bu, 360 küçük çizgiyle tanımlanan üç noktayla sonuçlanabilir. İşlendiğinde düzgün görünür.

Elbette, sizin için bunu sağlayan bir yöntem içerdiğindenAddOval, çok çizgili SKPath kullanarak üç nokta oluşturmanız gerekmez. Ancak tarafından SKPathsağlanmayan bir görsel nesne çizmek isteyebilirsiniz.

Archimedean Spiral sayfasında üç nokta koduna benzeyen ancak çok önemli bir farka sahip olan bir kod bulunur. Dairenin 360 derece etrafında 10 kez döngü yaparak yarıçapı sürekli olarak ayarlar:

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);
    }
}

Sonuç, her döngü arasındaki uzaklık sabit olduğundan aritmetik sarmal olarak da adlandırılır:

Archimedean Spiral sayfasının üçlü ekran görüntüsü

öğesinin bir using blokta oluşturulduğuna SKPath dikkat edin. Bu SKPath , bir bloğun SKPath yönetilmeyen kaynakları atmak için daha uygun olduğunu using öneren önceki programlardaki nesnelerden daha fazla bellek tüketir.