Нарисуйте цветное колесо цвета в C#
Пример
Точки вдоль круга включают красный, зеленый и синий. Другие точки интерполируются между этими цветами. Например, на полпути между красным (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; } }