2012-05-01 3 views
1

У меня есть треки GRP на карте, у которых есть трудности с 1 до 10. Я хочу, чтобы эти треки имели разный цвет в зависимости от сложности. Легкая трудность - зеленый, жесткий красный, а средний - оранжевый. Тем не менее, мне нужно иметь не только эти 3 цвета, но и более плавные переходы между ними. как один цвет для каждой точки сложности или один для каждой половины точки. Есть ли какой-либо алгоритм для вычисления этих цветов и их переходов? Как-то увеличивать/уменьшать значения rgb? Спасибо.Сложность для цветового преобразователя

ответ

0
using System; 
using System.Drawing; 
using System.Windows.Forms; 

public partial class MainForm : Form 
{ 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     Color[] colors = new Color[11]; 

     colors[0] = Color.Green; 
     colors[1] = Interpolate(Color.Green, Color.Orange, 0.2); 
     colors[2] = Interpolate(Color.Green, Color.Orange, 0.4); 
     colors[3] = Interpolate(Color.Green, Color.Orange, 0.6); 
     colors[4] = Interpolate(Color.Green, Color.Orange, 0.8); 
     colors[5] = Color.Orange; 
     colors[6] = Interpolate(Color.Orange, Color.Red, 0.2); 
     colors[7] = Interpolate(Color.Orange, Color.Red, 0.4); 
     colors[8] = Interpolate(Color.Orange, Color.Red, 0.6); 
     colors[9] = Interpolate(Color.Orange, Color.Red, 0.8); 
     colors[10] = Color.Red; 

     Rectangle rect = new Rectangle(10, 10, 20, 90); 
     for (int i = 0; i < colors.Length; i++) 
     { 
      e.Graphics.FillRectangle(new SolidBrush(colors[i]), rect); 
      rect.Offset(20, 0); 
     } 

     base.OnPaint(e); 
    } 

    private static Color Interpolate(Color a, Color b, double t) 
    { 
     int R = (int)(a.R + (b.R - a.R) * t); 
     int G = (int)(a.G + (b.G - a.G) * t); 
     int B = (int)(a.B + (b.B - a.B) * t); 
     return Color.FromArgb(R, G, B); 
    } 

    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 
} 
1
Red = 255,0,0 
Yellow = 255, 255, 0 
Green = 0,255,0 

Сделать цикл, который петлями от уровня 1 до 10.

Для каждого уровня создают цвет, как что-то вроде:

Red = level * 25.5; 
Green = 255 - (level * 25.5); 
Blue = 0; 

Затем создайте цвет из значений RGB.

Очевидно, что это только псевдокод, но он должен дать вам представление о начале работы.

1

Что вы ищете, это возможность интерполировать цвета. Это может быть недостаточно, чтобы просто интерполировать два цвета (потому что вы можете получить ложные цвета между ними), но для обработки RGB RGB в качестве точки в 3D-пространстве и интерполирования вдоль полилинии (где каждая точка является цветным/промежуточным цветом), который представляет цвета (в вашем случае, трудности). Here - это ссылка, которая показывает, о чем я говорю.

+0

+1 для правды. Существует много разных методов цветовой интерполяции. Вы делаете что-то простое и дискретное, так что вы можете просто взглянуть на него и называть его хорошим. В общем, хорошо понимать, что есть намного больше, чем это. –