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

В программе используется PathGradientBrush, чтобы заполнить цветовое колесо цветовыми образцами. Рисование колеса в основном автоматическое, но прикладывает определенные усилия для настройки. Следующий метод DrawColorWheel рисует всю работу.

// Нарисуйте цветное колесо в указанной области.
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();

    int num_pts = (wheel_path.PointCount - 1) / 3;
    Color[] surround_colors = new Color[wheel_path.PointCount];
    float r = 255, g = 0, b = 0;
    float dr, dg, db;
    dr = -255 / num_pts;
    db = 255 / num_pts;
    for (int i= 0; i < num_pts; i++)
    {
        surround_colors[i] =
            Color.FromArgb(255, (int)r, (int)g, (int)b);
        r += dr;
        b += db;
    }

    r = 0; g = 0; b = 255;
    dg = 255 / num_pts;
    db = -255 / num_pts;
    for (int i = num_pts; i < 2 * num_pts; i++)
    {
        surround_colors[i] =
            Color.FromArgb(255, (int)r, (int)g, (int)b);
        g += dg;
        b += db;
    }

    r = 0 ; g = 255 ; b = 0;
    dr = 255 / (wheel_path.PointCount - 2 * num_pts);
    dg = -255 / (wheel_path.PointCount - 2 * num_pts);
    for (int i = 2 * num_pts; i < wheel_path.PointCount; i++)
    {
        surround_colors[i] =
            Color.FromArgb(255, (int)r, (int)g, (int)b);
        r += dr; 
        g += dg;
    }

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

    //// Раскомментируйте следующее, чтобы нарисовать точки пути.
    // for (int i = 0; i & lt; wheel_path.PointCount; i ++)
    // {
    // gr.FillEllipse (Brushes.Black,
    // wheel_path.PathPoints [i] .X - 2,
    // wheel_path.PathPoints [i] .Y - 2,
    // 4, 4);
    //}
}

Во-первых, программа создает объект GraphicsPath и добавляет к нему эллипс. Это будет эллипс, занятый колесом.

Когда вы создаете PathGradientBrush, вы указываете цвета для точек вдоль пути. К сожалению, точки для эллипса - это контрольные точки, а не точки на самом эллипсе.

Программа вызывает метод Flatten объекта пути, чтобы преобразовать эллипс в ряд сегментов линии. Теперь точки лежат вдоль сплющенного пути.

Программа перемещается по точкам, создавая массив соответствующих цветов. Цвета плавно меняются от красного до синего до зеленого.

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

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

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

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