RelCurveTo() публичный Метод

public RelCurveTo ( Distance d1, Distance d2, Distance d3 ) : void
d1 Distance
d2 Distance
d3 Distance
Результат void
Пример #1
0
    public Flower( )
    {
        int idx      = -1;
        int last_idx = -1;

        int petal_size = PETAL_MIN + rand() % PETAL_VAR;
        int size       = petal_size * 8;

        int n_groups = rand() % 3 + 1;

        this.ctex = new CairoTexture((uint)size, (uint)size);

        // the using statement make sure the cr is disposed at the end,
        // otherwise we get no bling
        using (Cairo.Context cr = this.ctex.Create())
        {
            cr.Tolerance = 0.1;

            // Clear
            cr.Operator = Operator.Clear;
            cr.Paint();
            cr.Operator = Operator.Over;

            cr.Translate(size / 2, size / 2);

            // petals
            for (int i = 0; i < n_groups; i++)
            {
                int n_petals = rand() % 5 + 4;
                cr.Save();

                cr.Rotate(rand() % 6);

                do
                {
                    idx = (rand() % (colors.Length / 3)) * 3;
                } while (idx == last_idx);

                cr.SetSourceRGBA(colors[idx], colors[idx + 1], colors[idx + 2], 0.5);

                int pm1 = rand() % 20;
                int pm2 = rand() % 4;

                for (int j = 0; j < n_petals; j++)
                {
                    cr.Save();

                    cr.Rotate(((2 * Math.PI) / n_petals) * j);

                    cr.NewPath();
                    cr.MoveTo(0, 0);

                    cr.RelCurveTo(petal_size, petal_size, (pm2 + 2) * petal_size,
                                  petal_size, (2 * petal_size) + pm1, 0);

                    cr.RelCurveTo(0 + (pm2 * petal_size), -petal_size, -petal_size,
                                  -petal_size, -((2 * petal_size) + pm1), 0);

                    cr.ClosePath();
                    cr.Fill();
                    cr.Restore();
                }

                petal_size -= rand() % (size / 8);

                cr.Restore();
            }

            // flower center
            do
            {
                idx = (rand() % (colors.Length / 4 / 3)) * 3;
            } while (idx == last_idx);

            if (petal_size < 0)
            {
                petal_size = rand() % 10;
            }

            cr.SetSourceRGBA(colors[idx], colors[idx + 1], colors[idx + 2], 0.5);

            cr.Arc(0, 0, petal_size, 0, Math.PI * 2);
            cr.Fill();
        }
    }