Нарисуйте кривую с несколькими цветами в C#

Достаточно легко рисовать разные линии с разными цветами, но не так просто рисовать одну строку, которая использует несколько цветов.

Один из способов добиться этого - сделать LinearGradientBrush, который определяет цвета, которые вы хотите использовать. Затем вы можете использовать кисть для определения пера, а затем рисовать с помощью пера.

В этом примере предполагается, что вы рисуете график и хотите, чтобы цвета менялись по вертикали. Щетка определяется так, чтобы ее цвета изменялись вертикально по координатам чертежа с красным вверху и синим внизу.

Следующий код показывает, как пример рисует свою кривую.

private void picCanvas_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

    RectangleF world_rect = new RectangleF(0, 0, 100, 100);
    RectangleF device_rect = new RectangleF(5, 5,
        picCanvas.ClientSize.Width - 10,
        picCanvas.ClientSize.Height - 10);
    SetTransformation(e.Graphics, world_rect, device_rect,
        false, true);

    // Рисуем оси.
    using (Pen pen = new Pen(Color.Black, 0))
    {
        for (int y = 10; y < 100; y += 10)
            e.Graphics.DrawLine(pen, -2, y, 2, y);
        e.Graphics.DrawLine(pen, 0, 0, 0, 100);

        for (int x = 10; x < 100; x += 10)
            e.Graphics.DrawLine(pen, x, -2, x, 2);
        e.Graphics.DrawLine(pen, 0, 0, 100, 0);
    }

    // Создаем кисть для кривой.
    using (LinearGradientBrush brush =
        new LinearGradientBrush(world_rect,
            Color.Red, Color.Blue, 270))
    {
        ColorBlend blend = new ColorBlend();
        blend.Colors = new Color[]
        {
            Color.Red,
            Color.Orange,
            Color.Yellow,
            Color.Green,
            Color.Blue,
        };
        blend.Positions =
            new float[] { 0.0f, 0.2f, 0.4f, 0.6f, 1.0f, };
        brush.InterpolationColors = blend;

        // Создаем толстую ручку, определяемую кистью.
        using (Pen pen = new Pen(brush, 3))
        {
            pen.LineJoin = LineJoin.Bevel;

            // Рисуем кривую.
            if (chkCurved.Checked)
                e.Graphics.DrawCurve(pen, Points);
            else
                e.Graphics.DrawLines(pen, Points);
        }
    }
}

Код устанавливает свойство Graphics объекта Graphics объекта и использует метод SetTransformation, описанный в этом сообщении , чтобы отобразить координаты чертежа в координатах устройства. Затем он рисует несколько осей.

Далее код создает LinearGradientBrush, который будет вертикально от красного до синего. Параметр 270 указывает, что оттенки кисти от верхнего до нижнего.

После создания базовой кисти код дает новый ColorBlend, чтобы определить цвета кисти и их позиции внутри кисти. Например, красный цвет появляется 0,0 пути через кисть, оранжевый появляется 0,2 пути через кисть и т. д.

Обратите внимание, что ColorBlend должно иметь такое же количество цветов, что и позиции, и что позиции должны начинаться с 0.0 и заканчиваться 1.0.

Затем код устанавливает свойство InterpolationColors кисти, равное ColorBlend, чтобы использовать его.

Затем программа использует кисть для создания пера. Перо шириной 3 единицы в координатах чертежа и масштабируется преобразованием объекта Graphics.

Обратите внимание, что я сделал квадрат PictureBox и квадрат области рисования, чтобы преобразование масштабировалось на ту же величину в направлениях X и Y. Если координаты чертежа и устройства имеют разные формы, перо будет масштабироваться неравномерно и даст нечетные результаты.

Наконец, код рисует строки, соединяющие некоторые точки, определенные в обработчике событий Load.

Обратите внимание, что кисть при необходимости повторяет. Например, если линия протянула предыдущую координату чертежа 100 вертикально, она «упадет» с красной вершины кисти, и кисть начнет с синего. Аналогично, если значение опустилось ниже 0 по вертикали, оно упадет с синего дна кисти и будет нарисовано красным.

Чтобы этот код не устанавливал свойство LineJoin для пера Bevel, поэтому есть не очень длинные точки. Обработчик события Load формы также не создает точки с координатами Y, близкими к 0 или 100.

В качестве альтернативы вы можете расширить кисть дальше выше и ниже области рисования, делая верхние области красными и нижние области синими.

Источник: http://csharphelper.com/blog/2016/02/draw-a-curve-with-multiple-colors-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector