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

Пример Нарисуйте цветное колесо на C# , рисует цвет колесо. Для этого он делает ряд точек по периметру круга, где каждая точка имеет разный цвет радуги. Затем он создает PathGradientBrush с этими цветами в качестве цветов объемного звучания. Центр кисти, белый, находится в центре круга. После создания кисти программа просто заполняет круг.

Точки вдоль круга включают красный, зеленый и синий. Другие точки интерполируются между этими цветами. Например, на полпути между красным (255, 0, 0) и зеленым (0, 255, 0) находится цвет (128, 128, 0), который является коричневым (темно-желтый). Способ, которым программа выполняет свою интерполяцию, означает, что цветовое колесо не включает насыщенные вторичные цвета, такие как желтый (255, 255, 0).

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

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

// Нарисуйте цветное колесо в указанной области.
private void DrawColorWheel(Graphics gr, Color outline_color,
    int xmin, int ymin, int wid, int hgt)
{
    Rectangle rect = new Rectangle(xmin, ymin, wid, hgt);
    GraphicsPath wheel_path = new GraphicsPath();
    wheel_path.AddEllipse(rect);
    wheel_path.Flatten();

    float num_pts = (wheel_path.PointCount - 1) / 6;
    Color[] surround_colors = new Color[wheel_path.PointCount];

    int index = 0;
    InterpolateColors(surround_colors, ref index,
        1 * num_pts, 255, 255, 0, 0, 255, 255, 0, 255);
    InterpolateColors(surround_colors, ref index,
        2 * num_pts, 255, 255, 0, 255, 255, 0, 0, 255);
    InterpolateColors(surround_colors, ref index,
        3 * num_pts, 255, 0, 0, 255, 255, 0, 255, 255);
    InterpolateColors(surround_colors, ref index,
        4 * num_pts, 255, 0, 255, 255, 255, 0, 255, 0);
    InterpolateColors(surround_colors, ref index,
        5 * num_pts, 255, 0, 255, 0, 255, 255, 255, 0);
    InterpolateColors(surround_colors, ref index,
        wheel_path.PointCount, 255, 255, 255, 0, 255, 255, 0, 0);

    using (PathGradientBrush path_brush =
        new PathGradientBrush(wheel_path))
    {
        path_brush.CenterColor = Color.White;
        path_brush.SurroundColors = surround_colors;

        gr.FillPath(path_brush, wheel_path);

        // Это выглядит лучше, если мы очертим колесо.
        using (Pen thick_pen = new Pen(outline_color, 2))
        {
            gr.DrawPath(thick_pen, wheel_path);
        }
    }
}

Код создает GraphicsPath, добавляет к нему круг и выравнивает путь для получения точек по окружности круга. Он позже заполнит этот путь.

Использование точек сплющенного пути позволяет программе размещать цвета окружения градиента точно в точках, используемых для рисования круга. Код делит точки пути на шесть разделов и использует метод InterpolateColors (описанный ниже) для назначения цветов для каждого раздела. Он использует возвращенные цвета для создания PathGradientBrush и заполняет круг.

В следующем коде показан метод InterpolateColors.

// Заполните цвета, интерполирующие между значениями from и to.
private void InterpolateColors(Color[] surround_colors,
    ref int index, float stop_pt,
    int from_a, int from_r, int from_g, int from_b,
    int to_a, int to_r, int to_g, int to_b)
{
    int num_pts = (int)stop_pt - index;
    float a = from_a, r = from_r, g = from_g, b = from_b;
    float da = (to_a - from_a) / (num_pts - 1);
    float dr = (to_r - from_r) / (num_pts - 1);
    float dg = (to_g - from_g) / (num_pts - 1);
    float db = (to_b - from_b) / (num_pts - 1);

    for (int i = 0; i < num_pts; i++)
    {
        surround_colors[index++] =
            Color.FromArgb((int)a, (int)r, (int)g, (int)b);
        a += da;
        r += dr;
        g += dg;
        b += db;
    }
}

Источник: http://csharphelper.com/blog/2015/09/draw-a-colorful-color-wheel-in-c/

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